ffmpeg是一个很是强大的工具,它能够转换任何格式的媒体文件,而且还能够用本身的AudioFilter以及VideoFilter进行处理和编辑。有了它,咱们就能够对媒体文件作不少咱们想作的事情了。服务器
以上就是在平常开发中常常用到的音视频参数及通用参数。下面会针对常见的开发场景进行实践和说明。ide
相关命令:工具
ffmpeg -formats
输出结果:学习
File formats: D. = Demuxing supported .E = Muxing supported -- D 3dostr 3DO STR E 3g2 3GP2 (3GPP2 file format) E 3gp 3GP (3GPP file format) D 4xm 4X Technologies E a64 a64 - video for Commodore 64 D aa Audible AA format files D aac raw ADTS AAC (Advanced Audio Coding) DE ac3 raw AC-3
省略...... D xbin eXtended BINary text (XBIN) D xmv Microsoft XMV D xpm_pipe piped xpm sequence D xvag Sony PS3 XVAG D xwma Microsoft xWMA D yop Psygnosis YOP DE yuv4mpegpipe YUV4MPEG pipe
相关命令:优化
ffmpeg -i pm.mp4 -ss 00:00:50.0 -codec copy -t 20 output.mp4
命令说明:编码
表示将文件pm.mp4从第50s开始剪切20s的时间,输出到output.mp4中,其中-ss指定偏移时间(time Offset),-t指定的时长(duration)。spa
可是直接这样执行命令,当然咱们能截取出来音视频的文件,可是当咱们播放的时候,咱们会发现虽然ffmepg剪切视频,很方便,可是也有很大缺陷:命令行
(1). 剪切时间点不精确
(2). 有时剪切的视频开头有黑屏3d
形成这些问题的缘由是ffmpeg没法seek到非关键帧上。code
命令层面定位的话就是若是把-ss, -t参数放在-i参数以后,是对输出文件执行的seek操做
输入文件会逐帧解码,直到-ss设置的时间点为止,这么操做会很慢,虽然时间点是准确的,可是很容易出现黑屏问题。
因此:咱们优化了一下上面的那个命令,让视频的剪切更加精确:
ffmpeg -ss 10 -t 15 -accurate_seek -i pm.mp4 -codec copy output.mp4
注意:accurate_seek必须放在-i参数以前。
可是,可能又会有人发现,仍是存在剪切不许确的现象,那是由于,上述命令只是进行了数据的转封装,会受到关键帧的影响,因此若是须要特别准确的剪切,只能使用ffmpeg进行从新编解码的操做了,命令行以下:
ffmpeg -i input.mp4 -ss 00:00:03.123 -t 10 -c:v libx264 -c:a aac out.mp4
此命令行相对上面的转封装的剪切来讲,速度明显变慢,是由于对视频数据从新编解码了,可是精度相对转封装来讲是大大提升了。
相关命令:
ffmpeg -i pm.mp4 -vn -acodec copy output.m4a
命令说明:
将文件pm.mp4的视频流禁用掉(参数为:-vn,若是禁用音频流参数为-an,禁用字母流参数为-sn )。
而后将pm.mp4中的音频流的数据封装到output.m4a文件中,音频流的编码格式不变。
相关命令:
ffmpeg -i pm.mp4 -an -vcodec copy output.mp4
命令说明:
将文件pm.mp4的音频流禁用掉(参数为:-an )。
而后将pm.mp4中的视频流的数据封装到output.mp4文件中,视频流的编码格式不变。
相关命令:
ffmpeg -i pm.mp4 -an -vcodec copy -bsf:v h264_mp4toannexb output.h264
命令说明:
在指令中,咱们舍弃了音频数据(-an),视频数据使用mp4toannexb这个bitstreasm filter来转换为原始的H264数据。(注:同一编码也会有不一样的封装格式)。
验证播放:
可使用ffplay命令进行尝试播放,若是能播放成功,则说明生效。
ffmpeg -re -i pm.mp4 -acodec copy -vcodec copy -f flv rtmp://127.0.0.1/rh/mylive
命令说明:
将mp4文件的音视频数据的编码格式不变,按照rtmp的方式,将视频推送到流媒体服务器上。
ffmpeg -i rtmp://127.0.0.1/rh/mylive -acodec copy -vcodec copy -f flv test.flv
命令说明:
将流媒体服务器的数据,不进行转码,经过转封装的方式保存到本地。
ffmpeg -i pm.mp4 -i xxx.png -filter_complex "overlay=5:5" out.mp4
命令说明:
使用ffmpeg滤镜功能,将对mp4添加水印。
// 1.视频倒放,无音频 ffmpeg.exe -i inputfile.mp4 -filter_complex [0:v]reverse[v] -map [v] -preset superfast reversed.mp4 // 2.视频倒放,音频不变 ffmpeg.exe -i inputfile.mp4 -vf reverse reversed.mp4 // 3.音频倒放,视频不变 ffmpeg.exe -i inputfile.mp4 -map 0 -c:v copy -af "areverse" reversed_audio.mp4 // 4.音视频同时倒放 ffmpeg.exe -i inputfile.mp4 -vf reverse -af areverse -preset superfast reversed.mp4