1. YUV数据在使用avfilter scale时在特定的分辨率下UV分量不对

由于是小视频,那么分辨率不需要太高,但是有的视频源是1080p,甚至有的是4K的,所以对视频源进行scale非常有必要。scale操作可以使用avfilter或者sws_scale完成,具体参考:

在对视频数据进行decode后,得到了包含YUV数据的AVFrame,AVFrame中的data[0], data[1], data[2]分别表示YUV三个分量,YUV三个分量的数据量之比是4:1:1,每行的字节数分别是linesize[0], linesize[1], linesize[2]。

假定图像长宽分别为w和h,那么Y分量字节数为w*h,linesize[0]等于w,U/V分量字节数均为0.5w*0.5h,linesize[1]等于linesize[2]等于0.5w。但是实际使用时发现,特定分辨率下scale后的UV分量显示不正常,进一步发现UV的linesize有时不等于0.5w,对此FFMpeg(avframe.h)是这么解释的:

     * @note The linesize may be larger than the size of usable data -- there
* may be extra padding present for performance reasons.
*/
int linesize[AV_NUM_DATA_POINTERS];

实际上确实发现UV分量的linesize不等于0.5w,这样的话,在拷贝UV分量的时候,就需要一行一行拷贝,每行拷贝0.5w,这个问题也就解决了。

Tips:Mac下使用GLYUVPlay.app软件,导入原始的YUV数据,输入分辨率,YUV格式等信息,可以查看原始YUV数据的分量信息,对于解决问题非常有帮助。

2. PCM在使用FFMpeg的aac编码器编码时提示编码失败

在特定的手机上,aac会编码失败,提示的是"Input contains (near) NaN/+-Inf\n"。但是很奇怪,只在特定的手机出现该问题,查了半天没有结果,看到有人说libfdk-aac库可能会解决这个问题,将fdk-aac添加进FFMpeg后,编码没有问题,但是编码出来后的数据有爆音,使用Audacity软件查看dump下的数据,确实有爆音,也就是说程序还是有问题。仔细审代码最后发现,aac编码输入的PCM数据只有一个声道的,而编码参数里写的输入为两个声道,而第二个声道的数据没有赋值,将第二个声道拷贝了输入数据后,问题就解决了。。

总结一下,不是所有的手机都没问题,那就证明程序还是有问题。

Tips:Mac下使用Audacity软件,输入原始PCM数据的采样率、音频数据格式后,可以查看原始PCM数据波形,有无爆音等问题。

3. 视频尺寸裁切不生效

视频尺寸裁切时,用libavfilter的crop参数,我之前的理解,av_buffersink_get_frame出来的frame数据就变成了裁切后的尺寸,后来发现不是这样。av_buffersink_get_frame后的frame只是width, height变成了裁切尺寸的长宽,data[]指针和linesize大小都没有变。debug发现,frame的crop相关参数变了,在重新编码时,就会根据crop参数和width, height参数编码成裁切后的尺寸。

4. 录制GIF时花屏

按照录制视频的代码去录制GIF时发现录制后的GIF花屏,查阅资料可以,GIF的out format必须是AV_PIX_FMT_RGB8,把pixel_format改成RGB8后就OK了。

5. 对带有HE-AAC的视频编码失败

之前一直以为服务器的视频都是LC-AAC格式的,这种格式的采样样本数nb_samples是1024个,而HE-AAC视频的nb_samples是2048个,并且FFmpeg自带的aac编码器只支持LC-AAC编码。于是不得已,只能换为fdk-aac编码器,根据文档,fdk-aac编码器两种格式的aac都支持。但是fdk-aac编码器只支持S16格式的PCM,因此对解码后得到的PCM又加了一层resample,将原来FLTP格式的PCM resample成S16格式,之后编码成功。附FFmpeg支持的音频编码器信息:

Dolby Digital: ac3
Dolby Digital Plus: eac3
MP2: libtwolame, mp2
Windows Media Audio : wmav1
Windows Media Audio : wmav2
AAC LC: libfdk_aac, aac
HE-AAC: libfdk_aac
Vorbis: libvorbis, vorbis
MP3: libmp3lame, libshine
Opus: libopus

6. 编码后视频前几帧黑屏

原因是开启了多线程编码,但是单线程编码效率很低,这个问题还需要细研究一下。

参考资料:

1. FFMpeg学习(三) 音频处理基本概念

2. FFMpeg学习(六) 用libavfilter对视频尺寸进行裁切

3. https://trac.ffmpeg.org/wiki/Encode/HighQualityAudio

FFMpeg笔记(五) 录制小视频时几个问题解决的更多相关文章

  1. OC录制小视频

    OC录制小视频 用 AVCaptureSession + AVCaptureMovieFileOutput 来录制视频,并通过AVAssetExportSeeion 手段来压缩视频并转换为 MP4 格 ...

  2. 第五十九篇、OC录制小视频

    用 AVCaptureSession + AVCaptureMovieFileOutput 来录制视频,并通过AVAssetExportSeeion 手段来压缩视频并转换为 MP4 格 AVFound ...

  3. C#调用FFMPEG实现桌面录制(视频+音频+生成本地文件)

    不得不说FFMPEG真是个神奇的玩意,所接触的部分不过万一.网上有个很火的例子是c++方面的,当然这个功能还是用c++来实现比较妥当. 然而我不会c++ 因为我的功能需求比较简单,只要实现基本的录制就 ...

  4. ios设备突破微信小视频6S限制的方法

    刷微信朋友圈只发文字和图片怎能意犹未竟,微信小视频是一个很好的补充,音视频到位,流行流行最流行.但小视频时长不能超过6S,没有滤镜等是很大的遗憾.but有人突破限制玩出了花样,用ios设备在朋友圈晒出 ...

  5. 利用ffmpeg给小视频结尾增加logo水印

    背景 1.app有类似微信拍摄小视频功能,时长上限8s,视频文件保存在第三方云存储,app直接上传,后端数据库只记录视频的存放地址. 2.最近一次功能迭代,增加了小视频下载功能,小视频有可能在别的社交 ...

  6. Webcast / 技术小视频制作方法——自己动手录制video轻松搞定

    Webcast / 技术小视频制作方法——自己动手录制video轻松搞定 http://blog.sina.com.cn/s/blog_67d387490100wdnh.html 最近申请加入MSP的 ...

  7. Android 仿微信小视频录制

    Android 仿微信小视频录制 WechatShortVideo和WechatShortVideo文章

  8. 获取音、视频时长(NAudio,Shell32,FFmpeg)

    参考网址:https://blog.csdn.net/u013810234/article/details/57471780 以下为本次测试用到的音.视频格式: audio :”.wav;.mp3;. ...

  9. go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时])

    目录 go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时]) 静态配置 flag注入 在线热加载配置 远程配置中心 go微 ...

随机推荐

  1. drupal7 判断用户是否具有某个权限

    user_access() 具体用法可参考http://www.drupalla.com/node/857

  2. content-box与border-box区别

    理解box-sizing属性border-box,content-box,其实也是理解正常盒模型与异常盒模型. 正常盒模型 正常盒模型,是指块元素box-sizing属性为content-box的盒模 ...

  3. dynamics 365 AI 解决方案 —— 介绍

    Digital transformation has been reshaping our world and artificial intelligence (AI) is one of the n ...

  4. Flutter自定义标题栏之处理状态栏高度

    App在很多情况下由于各种需求需要自定义标题栏,而在能够构建Android和IOS应用的Flutter中,如果不在Scaffold中使用AppBar会发现默认是沉浸式. 猜想:我们使用自定义标题栏好像 ...

  5. Typescript 基础知识

    Typescript 就是 Javascript 的超集,所以首先你要知道 Javascript 基础知识 类型注解 类型注解在TypeScript中是记录函数或变量约束的简便方法. // 布尔值 l ...

  6. Python 3从入门到精通02-python的简单使用

    Python 3中的打印语句和字符串使用: Python中的常见数学运算: 这样的简单基础知识,你需要花5分钟就可以了,很基础的东西.

  7. 【Kettle】4、SQL SERVER到SQL SERVER数据转换抽取实例

    1.系统版本信息 System:Windows旗舰版 Service Pack1 Kettle版本:6.1.0.1-196 JDK版本:1.8.0_72 2.连接数据库 本次实例连接数据库时使用全局变 ...

  8. 原生java调用webservice的方法,不用生成客户端代码

    原生java调用webservice的方法,不用生成客户端代码 2015年10月29日 16:46:59 阅读数:1455 <span style="font-family: Aria ...

  9. asar 如何解密加密?electron 的 asar 的具体用法

    来源:https://newsn.net/say/electron-asar.html 在electron中,asar是个特殊的代码格式.asar包里面包含了程序猿编写的代码逻辑.默认情况下,这些代码 ...

  10. Visual Studio 下nuget命令的使用

    从Visual Studio 2012版本开始默认集成了Nuget扩展,在Visual Studio 2010或以下的版本需要单独安装,安装方法如下: 1. “工具”→“扩展和更新...”,弹出扩展管 ...