使用ffmpeg视频编码过程中踩的一个坑

今天说说使用ffmpeg在写视频编码程序中踩的一个坑,这个坑让我花了好多时间,回头想想,很多时候一旦思维定势真的挺难突破的。下面是不正确的编码结果:

使用ffmpeg做视频编码过程中,首先要新建数据帧,并为数据帧分配相应内存,以便于保存图像数据,为数据帧分配内存需要用到av_image_alloc()这个函数,该函数将根据传入的图像宽、高、图像格式、数据对齐基数等参数进行内存分配。

这其中有一个参数可能会让人迷惑,那就是数据对齐基数这个参数该设置多少?顺便说说为什么要数据对齐,之所以要对齐,主要是为了提高数据的读取效率。如果参考ffmpeg提供的相关demo,发现里面一般会将其设置为32,于是在我的项目里,我也想当然的将其设置为32,于是就有了上图所示效果,开始还以为是采集的原始数据有问题,以为自己没吃透yv12数据格式,想来想去,程序修改来修改去始终不正确。

如果原始数据分辨率为480*480,那么y分量行宽为480,uv分量行宽均为240,如果数据对齐基数设置为32,那么ffmpeg分配的图像帧数据行宽将为32的倍数,对于宽度为480的数据,y分量的行宽为480,uv分量行宽为256,但是实际数据的uv分量行宽只有240,这样一行就多出来16个字节,依次拷贝的时候数据就错位了,这样编码后得到的结果也就出错了。如果设置为16,那么y分量行宽为480,uv分量行宽为240,与采集的原始数据yuv各分量行宽吻合,拷贝时数据正确,视频编码后的文件也将是正确的。也就是说要根据自己实际数据的分辨率来反算数据对齐基数,不能想当然的设置,计算方法:首先数据行宽要能整除该基数,同时该对齐基数需是2的n次方,当然该值越小,比如设置为1,那肯定没问题了,但是数据读取效率要低些。下图为正确的视频编码结果。

使用ffmpeg视频编码过程中踩的一个坑

时间: 2024-10-14 08:46:45

使用ffmpeg视频编码过程中踩的一个坑的相关文章

spring-data-redis 使用过程中踩过的坑

spring-data-redis简介 Spring-data-redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作.异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现. spring-data-redis针对jedis提供了如下功能: 连接池自动管理,提供了一个高度封装的“RedisT

谈谈使用echarts过程中踩过的坑

小结: 1. 使用jquery获取json对象遇到的问题 由于自己对ajax用的还不熟练,之前都是拷贝别人的代码拿来用的,这次自己写的时候倒是碰到好多麻烦一一列举如下: 1.1 在$ 与ajax之间还需要有个点号,即 $.ajax({...... }); 1.2 在返回值那里对于返回类型是text或是json格式时,不知道哪种使用eval,哪种使用 (.属性)来解析,正确方式如下 当返回类型是text时,使用eval解析,书写方式如下 var obj = eval("(" + data

kafka 并发数配置过程中踩到的坑 InstanceAlreadyExistsException

2017-07-05 13:09:15.460 [kafka_spout:7-MultipleThreadSpoutExecutors] WARN o.a.kafka.common.utils.AppInfoParser - Error registering AppInfo mbean javax.management.InstanceAlreadyExistsException: kafka.consumer:type=app-info,id=gx-test-20170629 at com.

配置ECS上自建MySQL作为RDS从库过程中踩到的坑

环境: RDS版本:阿里云的5.6 ECS自建MySQL5.6.34(官方版本) 通过将阿里云rds的自动全量备份下载到ECS上,按照官方的步骤解压--> aploy-log ---> mv 到mysql的datadir 并启动mysql. 然后执行 reset slave all; reset master; change master to master_host='rm-xxxxxxxxx.mysql.rds.aliyuncs.com', master_user='rpl', maste

spark1.3编译过程中遇到的一个坑

在编译spark1.3.0时: export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m" mvn clean package -DskipTests -Phadoop-2.4 -Dhadoop.version=2.5.0-cdh5.3.1 -Pyarn -Phive-0.13.1 -Phive-thriftserver 报错: INFO] Using zinc server for in

ffmpeg视频格式转换中关键帧的设置

在用ffmpeg转换视频到flv过程中,需要设置关键帧的间隔,以便在播放过程中实现精确定位.在网上查找了不少,最后发现这个指令有效: -g 1 -keyint_min 2 . http://blog.csdn.net/windflow/article/details/6228088 还没试,要试试-- ffmpeg视频格式转换中关键帧的设置,布布扣,bubuko.com

ng-zorro-antd中踩过的坑

ng-zorro-antd中踩过的坑 前端项目中,我们经常会使用阿里开源的组件库:ant-design,其提供的组件已经足以满足多数的需求,拿来就能直接用,十分方便,当然了,有些公司会对组件库进行二次封装,改造成极具自家风格的产品. 在本系列的文章中,不谈高大上的东西,不深究底层源码,只分享一些项目中遇到的小问题. 表格(table) --师傅以为是组件库的bug,没想到-- 不知道正在阅读本文的读者有没有经历过: 在使用 <nz-table></nz-table> 的时候,删除表

2019爬虫项目总结——我在项目中踩的那些坑

2019刚出校门,初到公司,最大的成就是完成了一个全球抓取数据的系统!简单介绍一下这个项目的实现思路以及在项目中踩过的坑,随时告诫自己以后尽量避免! 历时一个半月还多几天,终于通过交付测试了!项目是从全球范围内,通过Google,Bing,雅虎来抓取数据,由于服务器不是特别的好,并且考虑到会有很多的脏数据,我们在实现的时候并没有将数据入库,想要将数据进行持久化的保存,可以使用导出的方式将数据以电子表格的方式导出来! 难点一: 项目经历了一次大的改版,将整个的抓取流程做了一次很大的改动.我们在抓取

CDN高级技术专家周哲: 深度剖析短视频分发过程中的用户体验优化技术点

2018深圳云栖大会已经圆满落幕,在飞天技术汇-弹性计算.网络和CDN专场中,阿里云CDN高级技术专家周哲为我们带来了<海量短视频极速分发>的主题分享,带领我们从视频内容采集.上传.存储和分发的角度介绍整体方案,并且重点讲解短视频加速的注意事项和用户体验优化要点. 讲解从三个部分展开:短视频应用场景,阿里云短视频解决方案,阿里云对短视频用户体验优化的相关优化. 短视频应用场景 短视频比图片和文字包含更多的信息,在移动互联网普及的今天,短视频应用场景非常广泛. 一. 社群分享场景用户可以录制视频