来源:ffmpeg一些基本用法 | 王石头的博客 (iwangsen.com)
音视频操作,几乎绕不开ffmpeg,因为市面上绝大多数音视频播放软件、转码软件,内核都是它。
它非常的强大,轻松几条命令就可以顺利完成你想做的工作
我来汇总一些经常使用的命令
首先在cmd窗口进入到ffmpeg目录里面
最简单的视频格式转换
ffmpeg -i D:\Media\IMG_0873.MOV -c copy D:\Media\output.avi
意思是,把D:\Media目录下的源文件IMG_0873.MOV(视频:h.264,音频:aac)转换成output.avi(编码格式自动选择为:视频mpeg4,音频mp3),目标文件仍然保存到D:\Media目录下。
问题来了:我想自己指定编码格式,怎么办呢?一种方法是,通过目标文件的扩展名(.flv、.mpg、.mp4、.wmv等)来控制,比如:
ffmpeg -i D:\Media\IMG_0873.MOV D:\Media\output2.flv 只需要修改格式名称就OK,比如这个命令就转为了flv格式
如果是整个文件夹中的所有flv文件需要批量转成mp4,那么使用以下命令:
for %i in (*.flv) do ffmpeg -i "%i" -c copy "%~ni.mp4"
注:不要更改以上的任何一个字符,新生成的mp4文件会自动拷贝原文件名。
我发现用手机拍的视频中,有些是颠倒的,我想让它顺时针旋转90度。这时候,可以使用-vf参数加入一个过滤器,如下:
ffmpeg -i D:\Media\IMG_0873.MOV -vf "rotate=90*PI/180" D:\Media\output3.avi
注:如果想逆时针旋转90度,90前面加个负号就可以了。
视频截取
ffmpeg -ss 2 -t 10 -i D:\Media\IMG_0873.MOV D:\Media\output4.avi
注:这种情况下,-ss和-t参数必须放在-i前面,表示是限定后面跟着的输入文件的。
按照时长截取
ffmpeg -i demo.mp3 -ss 00:00:00 -t 00:00:05 -acodec copy out.mp3
按照时长截取,替换到视频中的音频
ffmpeg -ss 00:00:00 -t 00:00:05 -i demo.mp4 -ss 00:00:00 -t 00:00:05 -i demo.mp3 -c:v copy -c:a aac -strict experimental -map 0:v:0 -map 1:a:0 C:\Users\Administrator\Desktop\out.mp4
用手机拍的视频有时候背景噪音比较大。怎么把噪音去掉,换成一段美妙的音乐呢?
第一步:把源文件里的音频去掉,生成一个临时文件tmp.mov
ffmpeg -i D:\Media\IMG_0873.MOV -vcodec copy -an D:\Media\tmp.mov
注:-vcodeccopy的意思是对源视频不解码,直接拷贝到目标文件;-an的意思是将源文件里的音频丢弃。
第二步:把这个无声的视频文件(tmp.mov)与一个音乐文件(music.mp3)合成,最终生成output.mov
ffmpeg -i D:\Media\tmp.mov -ss 30 -t 52 -i D:\Media\music.mp3 -vcodec copy D:\Media\output5.avi
为了保证良好的合成效果,音乐时长必须匹配视频时长。这里我们事先知道视频时长为52秒,于是截取music.mp3文件的第30秒往后的52秒与视频合成。另外,为了保证音频时长截取的准确性,我们这里没有使用-acodec copy,而是让音频重新转码。
视频画中画功能(类似微信视频)
ffmpeg -i out1.mp4 -i out2.mp4 -filter_complex "[1:v]scale=w=176:h=144:force_original_aspect_ratio=decrease[ckout];[0:v][ckout]overlay=x=W-w-10:y=0[out]" -map "[out]" -movflags faststart out.mp4
|
4个视频同时播放,左上角右上角左下角右下角
ffmpeg -i out1.mp4 -i out2.mp4 -i out3.mp4 -i out4.mp4 -filter_complex "[0:v]pad=iw*2:ih*2[a];[a][1:v]overlay=w[b];[b][2:v]overlay=0:h[c];[c][3:v]overlay=w:h" out.mp4
4个视频同时播放,左上角右上角左下角右下角,按照时间剪切
ffmpeg -ss 00:00:00 -t 00:00:05 -i out1.mp4 -ss 00:00:00 -t 00:00:05 -i out2.mp4 -ss 00:00:00 -t 00:00:05 -i out3.mp4 -ss 00:00:00 -t 00:00:05 -i out4.mp4 -filter_complex "[0:v]pad=iw*2:ih*2[a];[a][1:v]overlay=w[b];[b][2:v]overlay=0:h[c];[c][3:v]overlay=w:h" out.mp4
合成 gif
把视频的前 30 帧转换成一个 Gif
ffmpeg -i input_video.mp4 -vframes 30 -y -f gif output.gif
将视频转成 gif
ffmpeg -ss 00:00:00.000 -i input.mp4 -pix_fmt rgb24 -r 10 -s 320x240 -t 00:00:10.000 output.gif
添加水印
ffmpeg -i input.mp4 -i picture.png -filter_complex overlay="(main_w/2)-(overlay_w/2):(main_h/2)-(overlay_h)/2" output.mp4
三合一左中右合成
ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex "[0:v]pad=iw*3:ih*1[a];[a][1:v]overlay=w[b];[b][2:v]overlay=w*2" out.mp4
三合一左中右依次播放,分辨率为1280*720
ffmpeg -i 1.mp4 -s 426:720 1.mp4 //调整视频大小 426*720
截取视频第一帧
ffmpeg -i 1.mp4 -r 1 -vframes 1 -f image2 1.jpg
//视频图片合并
ffmpeg -i 1.mp4 -i 2.jpg -i 3.jpg -filter_complex "[0:v]pad=iw*3:ih*1[a];[a][1:v]overlay=w[b];[b][2:v]overlay=w*2" 4.mp4
ffmpeg -i 1.jpg -i 2.mp4 -i 3.jpg -filter_complex "[0:v]pad=iw*3:ih*1[a];[a][1:v]overlay=w[b];[b][2:v]overlay=w*2" 5.mp4
ffmpeg -i 1.jpg -i 2.jpg -i 3.mp4 -filter_complex "[0:v]pad=iw*3:ih*1[a];[a][1:v]overlay=w[b];[b][2:v]overlay=w*2" 6.mp4
//先转换格式
ffmpeg -i 4.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input1.ts
ffmpeg -i 5.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input2.ts
ffmpeg -i 6.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input3.ts
//最后进行链接播放
ffmpeg -i "concat:input1.ts|input2.ts|input3.ts" -c copy -bsf:a aac_adtstoasc -movflags +faststart output.mp4
调整视频速率
原理:调整视频速率的原理为:修改视频的pts,dts 此过程由于不用进行解码编码,所以费时很少
ffmpeg -i input.mkv -an -filter:v "setpts=0.5*PTS" output.mkv
注意:调整速度倍率范围[0.25, 4] 如果只调整视频的话最好把音频禁掉 对视频进行加速时,如果不想丢帧,可以用-r 参数指定输出视频FPS
ffmpeg -i input.mkv -an -r 60 -filter:v "setpts=2.0*PTS" output.mkv
调整音频速率
原理:简单的方法是调整音频采样率,但是这种方法会改变音色, 一般采用通过对原音进行冲采样,差值等方法。
ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv
注意:倍率调整范围为[0.5, 2.0] 如果需要调整4倍可采用以下方法:
ffmpeg -i input.mkv -filter:a "atempo=2.0,atempo=2.0" -vn output.mkv
音视频同时调整速度
ffmpeg -i input.mkv -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mkv
通过URL下载视频文件
ffmpeg -i http://XXX.COM/XXX.m3u8 D:/a.mp4
将图片转为可播放的长视频
ffmpeg -r 25 -loop 1 -i C:\Users\a\Desktop\0.png -pix_fmt yuv420p -vcodec libx264 -b:v 600k -r:v 25 -preset medium -crf 30 -s 720x576 -vframes 250 -r 25 -t 10 C:\Users\a\Desktop\a.mp4
将m3u8转为mp4
ffmpeg -i “http://xxxxxx/video/movie.m3u8” -vcodec copy -acodec copy -absf aac_adtstoasc output.mp4
摄像头h264:
ffmpeg -f video4linux2 -i /dev/video0 -s 640x480 -r 24 -vcodec libx264 -f flv rtmp://127.0.0.1/rtmpsvr/rtmp1
ffmpeg 推送rtp流,保存成sdp文件,再用vlc播放sdp
ffmpeg -re -thread_queue_size 4 -i guagnnianzhiwai.mp4 -strict -2 -vcodec copy -an -f rtp rtp://127.0.0.1:6008 -acodec copy -vn -sdp_file sdp_file.sdp -f rtp rtp://127.0.0.1:7008
ffplay 播放rtp流:
ffplay -protocol_whitelist "file,udp,rtp" -i sdp_file.sdp
ffmpeg拉去rtp流,再把rtp流保存成mp4
ffmpeg -protocol_whitelist "file,rtp,udp" -i sdp_file.sdp -strict -2 -vcodec copy -acodec copy -f mp4 saved_video_file.mp4
ffmpeg 动态库的编译
SDL
SDL安装
sudo apt-get install libsdl2-2.0
sudo apt-get install libsdl2-dev
当ffmpeg安装完成后需要使用ffplay验证,而ffplay依赖SDL
开始
ffmpeg编译安装
依赖安装
#汇编器
sudo apt-get install yasm nasm
#编解码库
sudo apt install libx264-dev libx265-dev libass-dev libfdk-aac-dev libmp3lame-dev libspeex-dev
sudo apt-get install pkg-config
编译ffmpeg
sudo ./configure --prefix=/opt/ffmpeg --enable-gpl --enable-nonfree --enable-libfdk-aac --enable-libx264 --enable-libx265 --enable-filter=delogo --enable-debug --disable-optimizations --enable-libspeex --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --cc=gcc --host-cflags= --host-ldflags= --disable-x86asm --enable-libmp3lame
sudo make && sudo make install
--prefix指定了生成的目录
环境变量配置
sudo vi ~/.bashrc
# shift g 跳到文件尾, 添加如下命令
export PATH="/opt/ffmpeg/bin:$PATH"
配置动态链接库
sudo vim /etc/ld.so.conf
# 在该配置文件中添加路径
/opt/ffmpeg/lib
# 更新环境变量
sudo ldconfig
编译ffmpeg动态库
./configure --enable-shared --disable-yasm --prefix=/usr/local/ffmpeg --disable-asm --disable-x86asm --disable-inline-asm --enable-decoder=aac --enable-decoder=aac_fixed --enable-decoder=aac_latm --enable-libfdk-aac --enable-decoder=libopus --enable-encoder=aac --enable-encoder=opus --enable-encoder=libopus --enable-libopus --enable-libsrt --enable-encoder=libvpx_vp8 --enable-encoder=libvpx_vp9 --enable-decoder=vp8 --enable-decoder=vp9 --enable-parser=vp8 --enable-parser=vp9 --enable-libx264 --enable-gpl --enable-nonfree --disable-dct --disable-dwt --disable-vaapi --disable-vdpau && sudo make && sudo make install
安装fkd-aac动态库,默认目录在:/usr/local/lib/libfdk-aac.*
或者sudo apt install libfdk-acc-dev
sudo vim ~/.bashrc
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/ffmpeg/lib/
sudo vim /etc/ld.so.conf
/usr/local/ffmpeg/lib/
sudo ldconfig
ffmpeg 名称测试是否成功
调用的时候依赖库这样:
-lavutil -lavcodec -lavformat -lfdk-aac -L/usr/local/ffmpeg/lib/
音频重采样
ffmpeg -i outopus.opus -f s16le -ar 16000 -acodec pcm_s16le 16k_output.pcm
ffmpeg -i outopus.opus -f s16le -ar 8000 -acodec pcm_s16le 8k_output.pcm
ffmpeg -i outopus.opus -f s16le -ar 44100 -acodec pcm_s16le 441k_output.pcm
播放
ffplay -f s16le -ar 44100 -ac 2 441k_output.pcm
ffplay -f s16le -ar 16000 -ac 2 16k_output.pcm
ffplay -f s16le -ar 8000 -ac 1 8k_output.pcm
#ffplay -f f32le -ac 2 -ar 44100 out.pcm
#ffplay -f s16le -ar 48000 -acodec pcm_alaw -ac 2 out1.g711u
#ffplay -f f32le -acodec pcm_alaw -ac 2 -ar 44100 out1.g711u
#ffplay -f s16le -acodec libopus -ar 48000 -ac 2 audio-opus.opus
#..\ffplay.exe -ar 8000 -ac 1 -f u8 -i audioIn.g711 #8k单通道音频
..\ffplay.exe -ar 48000 -ac 2 -f s16le -i outmix.pcm
#..\ffplay.exe -ar 8000 -ac 1 -f s16le -i mixaudio.pcm
#..\ffplay.exe -ar 48000 -ac 2 -f f32le -i test_float.pcm
..\ffmpeg.exe -i mixaudio.pcm -acodec pcm_f16le -ar 8000 1.wav
#pcm_float_to_short
..\ffmpeg.exe -i mixaudio.pcm -ar 48000 -ac 2 -f s16le -acodec pcm_s16le 1_8K.pcm
#pcm1转wav
..\ffmpeg.exe -i mixaudio.pcm -f s16le -ar 48000 -ac 2 -acodec pcm_s16le 1_8K.pcm
#mp4 to mkv
ffmpeg -i guagnnianzhiwai.mp4 -codec copy guagnnianzhiwai.mkv
#aac转opus
#ffmpeg -i audio-aac.aac -vn -c:a copy audio-opus.opus
#ffmpeg -f s16le -ar 8000-ac 1 -acodec pcm_s16le -i audio-aac.aac audio-opus.opus
ffmpeg -i audio-aac.aac -acodec libopus -b:a 175k audio-opus.opus
#play aac
#ffplay -f f32le -ac 2 -ar 44100 audio-aac.aac
ffplay -f f32le -ac 2 -ar 48000 liziqi-aac.aac
#play opus
ffplay audio-opus.opus
#play pcm
#ffplay -f f32le -ac 2 -ar 44100 out.pcm
#ffplay -f s16le -ar 48000 -acodec pcm_alaw -ac 2 out1.g711u
#ffplay -f f32le -acodec pcm_alaw -ac 2 -ar 44100 out1.g711u
#ffplay -f s16le -acodec libopus -ar 48000 -ac 2 audio-opus.opus
ffplay -ar 8000 -ac 1 -f s16le -i pcm-8k.pcm #8k单通道音频
#play rtmp
ffplay.exe rtmp://192.168.2.172:1935/live/03 -x 320 -y 240
#-rtsp_transport tcp
#play rtsp
ffplay.exe -rtsp_transport tcp rtsp://192.168.2.174:554/ch01 -x 320 -y 240
#play srt
ffplay.exe -fflags nobuffer -i "srt://192.168.2.167:8080?streamid=live.sls.com/live/test"
#play yuv
#ffmpeg.exe -s 1280*720 -i out.yuv -vf scale=352*288 yuv_352x288.yuv
#ffplay.exe -video_size 1280x720 -i gnzw_1280x720.yuv
ffplay.exe -video_size 352x288 -i yuv_352x288.yuv
#h264 to h265
ffmpeg.exe -re -i test.mp4 -c:v libx265 -b:v 5000k .\testH265.mkv
#mp4提取yuv
ffmpeg -i guagnnianzhiwai.mp4 -s 1280x720 -pix_fmt yuv420p gnzw_1280x720.yuv
#push rtmp
ffmpeg.exe -re -i source.200kbps.768x320.flv -vcodec libx264 -acodec aac -f flv rtmp://192.168.2.167/live/livestream
#aac to pcm
ffmpeg -i audio-aac.aac -f s16le -ar 8000 -ac 1 -acodec pcm_s16le pcm-8k.pcm
#push rtmp
ffmpeg.exe -re -stream_loop -1 -i N_S_C_704x576_1Mbits-B.mp4 -vcodec libx264 -acodec aac -f flv rtmp://127.0.0.1:1935/live/03
#mp4 提取h265
ffmpeg -i testH265.mp4 -an -vcodec copy testH265.h265
#mp4 提取aac
ffmpeg -i guagnnianzhiwai.mp4 -acodec aac -vn guagnnianzhiwai-aac.aac
#mp4 提取h264
ffmpeg -i guagnnianzhiwai.mp4 -an -vcodec copy -bsf:v h264_mp4toannexb guagnnianzhiwai-h264.h264
#mp4 转 ts
ffmpeg -i N_S_C_704x576_1Mbits-B.mp4 -c copy out1.ts
#视频合并
ffmpeg -i test3.mp4 -c copy -vbsf h264_mp4toannexb test3.ts
ffmpeg.exe -i "concat:test0.ts|test1.ts|test2.ts|test3.ts|test1.ts|test2.ts|test3.ts|test1.ts|test2.ts|test3.ts|test1.ts|test2.ts|test3.ts" -acodec copy -vcodec copy -absf aac_adtstoasc test.mp4
ffmpeg 推rtsp流:
ffmpeg -re -stream_loop -1 -i gnzw.mp4 -c copy -f rtsp rtsp://admin:[email protected]:554/test/realmonitor