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. FileReader读取文件

    前言:FileReader是一种异步文件读取机制,结合input:file可以很方便的读取本地文件. input:file 在介绍FileReader之前,先简单介绍input的file类型. < ...

  2. 基于express+mongodb+pug的博客系统——后台篇

    上一篇介绍了模板引擎pug.js的用法,这一篇就主要写后台逻辑了. 后台的大部分的功能都有了,只是在已经登录的状态下,前台和后台的逻辑处理还不是很完善. 先上几张图吧,仿旧版的简书,改了下UI,因为没 ...

  3. HTMLcanvas矩形阵雨 - 学习笔记

    HTMLcanvas矩形阵雨 在画布上执行 获取制图环境 全屏获取屏幕宽度和屏幕高度 确定每个文字的宽度 以确定列 循环输出 定时器调用 HTML 部分 <!DOCTYPE HTML> & ...

  4. Airbnb JavaScript Style Guide

      Airbnb JavaScript Style Guide() { 用更合理的方式写 JavaScript    ES5 的编码规范请查看版本一,版本二. 翻译自 Airbnb JavaScrip ...

  5. Web前端的状态管理

    背景 我相信很多朋友跟我一样,初次听到什么 Flux ,  Redux ,  Vuex , 状态管理 的时候是一脸懵逼的.因为在外面之前前端大部分开发的时候,根本没有那么多的概念.自从ReactJS火 ...

  6. syscall to rop

    前言 hitcon 2017 的 start 题,比较简单,练练手. 题目链接: https://gitee.com/hac425/blog_data/tree/master/hitcon2017 正 ...

  7. windows 7 Alt+Tab 的风格改成 XP 风格

    1.开始菜单-运行-输入“regedit”. 2.找到这个位置“[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explore ...

  8. java基础(七) java四种访问权限

    引言   Java中的访问权限理解起来不难,但完全掌握却不容易,特别是4种访问权限并不是任何时候都可以使用.下面整理一下,在什么情况下,有哪些访问权限可以允许选择. 一.访问权限简介 访问权限控制: ...

  9. shrio的简单认识

    博客讲解; shrio的知识储备 shrio的简单认识 笔记整理地址: Shrio.pdf 下载 Shrio理论.doc   下载 shrio知识储备.doc  下载

  10. Windows 安装mkvirtualenv虚拟python环境

    pip install virtualenvwrapper-win mkvirtualenv --python=python.exe 新python虚拟环境名称 使用方法 所有的命令可使用:virtu ...