ffmpeg音视频合成

ffmpeg十分强大,基本上可以满足音视频编辑的各种需求,比如说连接多个音频为一个,视频编辑,

参考资料:

[url]http://blog.163.com/prosen@yeah/blog/static/12251328720099101378975/

http://ffmpeg.org/ffmpeg-all.html[/url]

FFmpeg命令行大致可以分为两类:

1.视频、音频、图片的转换。

例如视频截取、视频转码、视频连接、视频音频合成等。

2.增加处理效果。

例如增加水印、增加gif、音频延迟等。一般是通过滤镜功能实现。

滤镜参考资料:

http://ffmpeg.org/ffmpeg-filters.html

http://blog.chinaunix.net/uid-26000296-id-4282537.html

FFmpeg命令行举例:

视频截取

ffmpeg-ss00:46:28-i"Morning_News.asf"-acodeccopy-vcodeccopy-t00:03:25output.asf

这行命令解释为:从文件Morning_News.asf第46:28分秒开始,截取03:25的时间,其中视频和音频解码不变,输出文件名为output.asf。

-ss:从指定时间开始(如果该时间点无效,则跳到该时间点前,最接近的有效seekpoint)

-i:输入源

-acodeccopy-vcodeccopy:视频和音频编码不变

-t:在该时间点停止输出

视频转码

ffmpeg-iINPUT-fFORMATOUTPUT

例如:

ffmpeg-i"D:/result.mpge"-fmp4"D:/result.mp4"

视频连接

ffmpeg-i"concat:input1.mpg|input2.mpg|input3.mpg"-ccopyoutput.mpg

http://trac.ffmpeg.org/wiki/How%20to%20concatenate%20(join%2C%20merge)%20media%20files

去除视频声音

ffmpeg-i1.avi-vcodeccopy-an2.avi

合并音频和视频

ffmpeg-ia.wav-ia.aviout.avi

若音频比视频长,画面停留在最后一帧,继续播放声音。

显示多幅图片(不同位置)

ffmpeg-y-iboss.mp4-ileft.png-ileft.png-filter_complex"overlay=5:5,overlay=0:0"-fmp4output.mp4

-filter_complex:使用复合滤镜

"overlay=5:5,overlay=0:0":第一个图片的x、y坐标为(5,5),第二个为(0,0)

在特定时间显示图片

ffmpeg-y-i1.avi-i1.png-filter_complex"overlay=x='if(between(t,1,3),60,-500)':y=50"-fmp4left1.mp4

命令行中可以使用表达式,参考:http://ffmpeg.org/ffmpeg-all.html#Expression-Evaluation

具体意思是时间t在1到3秒内,图片的x坐标为60,否则为-500(移出屏幕),y坐标一直为50不变

音频提前或延迟N秒

ffmpeg-iogg.ogg-i1.avi-filter_complex"adelay=3000|3000"output.avi

-filter_complex"adelay=3000|3000":对前面的ogg音频的两个声道都延迟3000毫秒

http://ffmpeg.org/ffmpeg-all.html#adelay

音频合成

ffmpeg-iINPUT1-iINPUT2-iINPUT3-filter_complexamix=inputs=3:duration=first:dropout_transition=3OUTPUT

inputs=3:三个输入

duration=first:输出长度为第一个输入的长度

dropout_transition=3:声音淡出时间为3秒

以上只是众多的ffmpeg命令行之中的冰山一角,基本上音视频的编辑需求都能够满足。

在这个项目中主要是采用的是北京炫一下公司出品的VCamera,其自己编译了ffmpeg,生成.so文件,然后在java层进行封装,其最主要的特点是提供了UtilityAdaptert中的FFmpegRun方法用于执行ffmpeg命令,便于开发者自己编写ffmpeg命令行进行怄气处理。

但是在使用的过程中,遇到了以下几个问题:

1,该封装包在某些程度上缺乏灵活性,比如比特率在底层写死了,无法进行修改,利用其提供的合成视频函数,视频分辨率无法改变,只能通过继承jar中的FFMpegUtils类,重写合成视频的函数。

2,利用ffmpeg命令行合成一个音频与一个视频,音频会覆盖视频中的原声道,音频PCM被替换,好像只有单声轨。

3,h264编码与aac编码合成无效

4,连接多个音频,采用命令行无效

5,延迟音频的声道时,只能合成一个音频到视频中,合成多个音频,只保留一个声轨。

以上是个人开发中遇到的一些问题,也有可能是我代码逻辑处理不正确,造成了以上几个问题,在此记录一下,是希望得到网上各位的解决方案。

相关推荐