FFMpeg笔记(五) 录制小视频时几个问题解决
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. 编码后视频前几帧黑屏
原因是开启了多线程编码,但是单线程编码效率很低,这个问题还需要细研究一下。
参考资料:
2. FFMpeg学习(六) 用libavfilter对视频尺寸进行裁切
3. https://trac.ffmpeg.org/wiki/Encode/HighQualityAudio
FFMpeg笔记(五) 录制小视频时几个问题解决的更多相关文章
- OC录制小视频
OC录制小视频 用 AVCaptureSession + AVCaptureMovieFileOutput 来录制视频,并通过AVAssetExportSeeion 手段来压缩视频并转换为 MP4 格 ...
- 第五十九篇、OC录制小视频
用 AVCaptureSession + AVCaptureMovieFileOutput 来录制视频,并通过AVAssetExportSeeion 手段来压缩视频并转换为 MP4 格 AVFound ...
- C#调用FFMPEG实现桌面录制(视频+音频+生成本地文件)
不得不说FFMPEG真是个神奇的玩意,所接触的部分不过万一.网上有个很火的例子是c++方面的,当然这个功能还是用c++来实现比较妥当. 然而我不会c++ 因为我的功能需求比较简单,只要实现基本的录制就 ...
- ios设备突破微信小视频6S限制的方法
刷微信朋友圈只发文字和图片怎能意犹未竟,微信小视频是一个很好的补充,音视频到位,流行流行最流行.但小视频时长不能超过6S,没有滤镜等是很大的遗憾.but有人突破限制玩出了花样,用ios设备在朋友圈晒出 ...
- 利用ffmpeg给小视频结尾增加logo水印
背景 1.app有类似微信拍摄小视频功能,时长上限8s,视频文件保存在第三方云存储,app直接上传,后端数据库只记录视频的存放地址. 2.最近一次功能迭代,增加了小视频下载功能,小视频有可能在别的社交 ...
- Webcast / 技术小视频制作方法——自己动手录制video轻松搞定
Webcast / 技术小视频制作方法——自己动手录制video轻松搞定 http://blog.sina.com.cn/s/blog_67d387490100wdnh.html 最近申请加入MSP的 ...
- Android 仿微信小视频录制
Android 仿微信小视频录制 WechatShortVideo和WechatShortVideo文章
- 获取音、视频时长(NAudio,Shell32,FFmpeg)
参考网址:https://blog.csdn.net/u013810234/article/details/57471780 以下为本次测试用到的音.视频格式: audio :”.wav;.mp3;. ...
- go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时])
目录 go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时]) 静态配置 flag注入 在线热加载配置 远程配置中心 go微 ...
随机推荐
- jquery实现上一页下一页
注:文章转载于肖肖的博客: 简单说一下思路:就是把每个页面都用position:absolute的属性使每个页面都从叠在一起.然后通过$().hide()隐藏和$().show()显示.点击当前页中的 ...
- EOS下控制台以及图形界面打印sql语句
EOS下控制台以及图形界面打印sql语句 场景需求:在eos中打印sql语句,包括数据实体,查询实体和命名sql的sql语句. 所需资源: P6spy:负责拦截sql,并打印. Sqlprofiler ...
- 数字时钟(DigitalClock)
数字时钟(DigitalClock) 这个其实就是我们平时看到的手机上面显示的时间 很简单 1.Activity //数字时钟 public class DigitalClockActivity ex ...
- 关系型数据库基本概念及MySQL简述
数据库基本概念">关系型数据库基本概念 数据库: 对大量信息进行管理的高效解决方案. 按照数据结构来组织.存储和管理数据的库. 数据库系统(DBS,DATABASE SYSTEM): ...
- linux客户端打印报表时操作系统的配置
报表打印是用applet方式操作的,所以客户端要有jre环境.如果客户端是windows系统的话,安装jre环境比较方便:如果客户端是linux系统的话,即使服务器端reportConfig.x ...
- Oracle EBS 键弹性域 段限定词取值
中间是回车符 对应编码时 Chr(10) substr(replace(t.compiled_value_attributes, Chr(10), ''), 3, 1)
- 【Oracle】PL/SQL Developer使用技巧(持续更新中)
1.关键字自动大写 在sql命令窗口中输入SQL语句时,想要关键字自动大写,引人注目该怎么办呢? 一步设置就可以达成了.点击Tools->Preference->Editor,看到截图中这 ...
- Windows+Git+TortoiseGit+COPSSH 安装教程及问题收集
准备工作: 1. git-1.8.1.2-preview20130201.exe 下载地址: https://code.google.com/p/msysgit/downloads/list 2. C ...
- 执行相应操作后,将表单及table中数据清空
使用 ccms.util.clearForm('要清空的表单的id'); $("#table中显示数据部分的id").empty();
- 北美Developer生存发展攻略
http://www.followmedoit.com/bbs/forum.php?mod=viewthread&tid=49&extra=page%3D1 在北美,做PM不易,而做D ...