今天说说使用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视频编码过程中踩的一个坑的更多相关文章

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

    spring-data-redis简介 Spring-data-redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, ...

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

    小结: 1. 使用jquery获取json对象遇到的问题 由于自己对ajax用的还不熟练,之前都是拷贝别人的代码拿来用的,这次自己写的时候倒是碰到好多麻烦一一列举如下: 1.1 在$ 与ajax之间还 ...

  3. NetCore部署到Linux服务器+Supervisor的步骤及过程中踩过的坑

    本文作备忘使用 服务器配置: 下面是所有操作的具体步骤: 1.安装nginx   参考 1.1 添加源:默认情况Centos7中没有Nginx源,最近Nginx官网提供了Centos的源地址. sud ...

  4. 【spring】使用spring过程中踩到的坑

    这里简单记录一下,学习spring的时候碰过的异常: 异常:org.springframework.beans.factory.BeanDefinitionStoreException: Unexpe ...

  5. 《Python3 网络爬虫开发实战》开发环境配置过程中踩过的坑

    <Python3 网络爬虫开发实战>学习资料:https://www.cnblogs.com/waiwai14/p/11698175.html 如何从墙内下载Android Studio: ...

  6. Hive使用过程中踩过的坑

    hive启动时错误1 Cannot execute statement:impossible to write to binary long since BINLOG_FORMAT = STATEME ...

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

    ] WARN org.apache.kafka.common.utils.AppInfoParser- Error registering AppInfo mbean javax.management ...

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

    在编译spark1.3.0时: export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m&q ...

  9. 推荐2一个在Java编码过程中得心应手的工具

    推荐2在编码过程中的减小不仅编码的量,挺easy工具上手:可适用Java反思与单探头Assert. 1 Mirror:Java反思 简单介绍 官网:http://projetos.vidageek.n ...

随机推荐

  1. iOS推送介绍

    iOS消息推送的工作机制可以简单的用下图来概括: Provider是指某个iPhone软件的Push服务器,APNS是Apple Push Notification Service的缩写,是苹果的服务 ...

  2. OD调试篇3-小软件破解1

    OD调试篇3-小软件破解1 要求如下图该软件需要改5个地方,其中1.2是软件未注册而设定限定的添加个数,3.4.5是软件显示的一些未注册的信息. 一. 1.按1运行程序,添加用户添加第五个时出现提示, ...

  3. STL之map和multimap(关联容器)

    map是一类关联式容器.它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响.自动建立Key - value的对应,对于迭代器来说,可以修改实值,而不能修改key. ...

  4. CentOS搭建PHP服务器环境(LAMP)

    安装httpd mysql mysql-server php: yum install -y httpd mysql mysql-server php php-devel 安装php的扩展 yum i ...

  5. Sed简介 (转)

    Sed简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓 ...

  6. poj 2094 多项式求和。

    /** 给出多项式 p(x) = an*x^n + an-1*x^(n-1)..... + a1*x + a0; 给定n,l,k,m 计算 x 从 l到 l+k-1 的p(x)的后m 位的平方的和 用 ...

  7. linux下检测端口是否连通

    检测tcp端口使用telnet命令 telnet 例:telnet 192.168.0.1 80 检测udp端口使用uc命令 uc -zu 例:uc -zu 192.169.0.1 80   以上命令 ...

  8. Linux学习:curl 与 wget命令

    curl和wget命令都是Linux下的工具,可以用来下载文件. 一.wget 例1: wget http://www.minjieren.com/wordpress-3.1-zh_CN.zip 下载 ...

  9. BZOJ 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚

    题目 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 553   ...

  10. poj 1664 put apples(dfs)

    题目链接:http://poj.org/problem?id=1664 思路分析:数据较小,考虑深度优先搜索搜索解空间. 代码如下: #include <iostream> using n ...