因为开发期间的任务重,一直都没有停下来记录些什么,那些徜过的坑坑,时为艰难,现在项目难点都已实现和优化了。
因此非常的有必要来缕一缕那些折磨着的我深坑。
首先说一下我的开发背景:
视频处理运用的是北京炫一下公司(秒拍)编译的ffmpeg库 封装的UilityAdapter.
在了解他的SDK前 后有注:
************************************************************************************
在这个项目中主要是采用的是北京炫一下公司出品的VCamera,其自己编译了ffmpeg,生成.so文件,
* 然后在java层进行封装,其最主要的特点是提供了UtilityAdaptert 中的FFmpegRun 方法用于执行 ffmpeg 命令 ,
* 便于开发者自己编写ffmpeg命令行进行怄气处理。
但是在使用的过程中,遇到了以下几个问题:
1,该封装包在某些程度上缺乏灵活性,比如比特率在底层写死了,无法进行修改,利用其提供的合成视频函数,
视频分辨率无法改变,只能通过继承jar中的FFMpegUtils类,重写合成视频的函数。
2,利用ffmpeg命令行合成一个音频与一个视频,音频会覆盖视频中的原声道,音频PCM被替换,好像只有单声轨。
3,h264编码与aac编码合成无效
4,连接多个音频,采用命令行无效
5,延迟音频的声道时,只能合成一个音频到视频中,合成多个音频,只保留一个声轨。
************************************************************************************
先从最近一下坑点往前缕 :
坑点 一: 2,利用ffmpeg命令行合成一个音频与一个视频,音频会覆盖视频中的原声道,音频PCM被替换,好像只有单声轨。
是的,如果是正常用百度的一般的ffmpeg 命令去处理
String cmd1 = "-i video_input.mp4 -i audio_Input.mp3 -vcodec copy -acodec copy output.mp4";
String cmd2 = "-i audio_Input.mp3 -i video_input.mp4 -filter_complex amerge -c:a libmp3lame -q:a 4 output.mp4";
等等 ,在电脑上其实的没有问题的。被移植到手机上。以上的命令就不起做用了。 也是很蒙逼的。再者看到上的注2.我一直以为这个sdk生成时候 就已经将部分的功能阉割掉了。于是很长一段时间想要放弃掉UilityAdapter 这个编译的PEG库。但又找不到更好的可以替代的。在寻找更合适的SDK期间 发现了一个 全型对 ffmpeg库移植到android 的项目:
https://github.com/WritingMinds/ffmpeg-android-java因为是全移植所以SDK包肯定会很大。一开始就没有什么好感。但还是偿试了一下 cmd1 cmd2。发现,这个库也是同样的结果。运行可以功能 但只能合成一个音频到视频中,合成多个音频,只保留一个声轨。将原音消去了。与在windows下执行效果并不相同。这个时候我其实是快已经放弃了给视频+背景音(不消原音)的需求。 接下来我比较了同的的peg命令在ffmpeg-android-java 与我项目中UilityAdapter 库的运行速度。 得到的结果就是UilityAdapter库的速率上比ffmpeg-android-java 快两倍多。但ffmpeg-android-java库的很明显的优点是 它全程监控了ffmpeg running. 可以看到它的速率 及 进度。
更令人愉快的是 如果是运行失败了,这个库可以看到peg命令运行失败的原因。
接下来任务完成不了。又没有别的事,于是goole去看看这个世界有没有人与我有过同样的烦恼。于是https://superuser.com/questions/712862/ffmpeg-add-background-audio-to-video-but-not-completely-muting-the-original-audi/1247848#肯定是有人和我一模一样的烦恼。哈哈,但是好像他的烦恼并没有因为别人的回答解决他的问题。但回答楼层里我看到一个看上去很靠谱的命令。
ffmpeg -i audio.mp3 -i video.mp4 -filter_complex \"[0:a][1:a]amerge,pan=stereo:c0-map 1:v -map "[out]" -c:v copy -c:a libfdk_aac -shortest output.mp4
我想这种电脑就不用试了。直接试ffmpeg-android-java 结果是运行通不过的。报的是找不到 filter "" 因为这个错了修改这个命令应该过半百次再运行。结果都是直接不能运行。也积累了无数发错误原因。无奈之下 ,将以上命令的所有分号全部去掉 再运行这时候也是运行通不过的报错点在-c:a libfdk_aac 于是直接将这个直接干掉再次运行。 这个时候可以哈哈了。心里一万的草尼马 那是一种喜悦。居然可以了。这真他妈的是一种意外。完全不明真相。却得到了想要的结果。
不急,这时我将同样的命令用UilityAdapter库执行。Ok.也是没有问题的。此时我才知道我已经解决了UilityAdapter上传者的其中的一个疑惑。但是都忘记在那个地址看到那文章了。同时希望那个上传者可以看到我写下的这坑录。
坑点 二: 后续 提前总结一下:ffmpeg命令的移植后。很多的命令与电脑都 不太相同了 特别是一些复杂的处理。 接下来的坑点二也同样的证实了我个人的观点。但由于个人对C++不是很懂。也不知道为什么。有大神看到又知道原因的可以留言拨开我心中的那层迷雾!