ffmpeg一些基本用法

来源:ffmpeg一些基本用法 | 王石头的博客 (WangSen's Blog)

音视频操作,几乎绕不开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前面,表示是限定后面跟着的输入文件的。

用手机拍的视频有时候背景噪音比较大。怎么把噪音去掉,换成一段美妙的音乐呢?

第一步:把源文件里的音频去掉,生成一个临时文件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

ffmpeg -rtsp_transport tcp -i rtsp://192.168.2.174:554/ch01 -rtsp_transport tcp -i rtsp://192.168.4.21:554/ch01 -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_6.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

将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

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:admin123@127.0.0.1:554/test/realmonitor

原文 ffmpeg一些基本用法_ffplay播放rtsp流_hhy980205的博客-CSDN博客

 

★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值