ffmpeg4.2 常用命令

ffmpeg常用命令:

ffmpeg --help:查看帮助的基础信息

ffmpeg --help long:查看高级参数

ffmpeg --help full:查看全部帮助

ffmpeg -L:支持的license协议

ffmpeg -version:ffmpeg版本

ffmpeg -formats:查看支持的文件格式

ffmpeg -codecs:查看所有的编解码

ffmpeg -encoders:查看支持的编码器

ffmpeg -decoders:查看支持的解码器

ffmpeg -filters:查看支持的滤镜

ffmpeg -h encoder=h264

ffmpeg -h muxer=mp3:查看某个类型的详细信息

ffmpeg --help full 下的AVFormatContext是封装转换的参数;

AVCodecContext是转码的参数

ffmpeg input.rmvb -vcodex mpeg4 -b:v 200k -r 15 -an output.mp4:

封装格式 RMVB - MP4

视频编码 -MPEG4

视频码率 -200kbit/s

视频帧率 -15fps

转码后的文件不包括音频(-an 参数)

ffmpeg -i 123.wav copy -ss 00:00:00 -t 3 789.wav :音频剪裁

ffmpeg -f concat -i inputs.txt out.flv:音视频合并

ffmpeg -i source.wav -ac 1 -ar 8000 -acodec pcm_alaw target.wav:音频文件格式转换

解释:-i代表输入参数

-acodec aac(音频编码用AAC)

-ar 设置音频采样频率

-ac 设置音频通道数

-ab 设定声音比特率

-an 去除音频

-vn 去除视频

-vol <百分比> 设定音量 设定音量大小,256为标准音量。(要设定成两倍音量时则输入512,依此类推。)

-filter:a "volume=0.1" 设置音量为当前音量的多少倍

-af volume=2 音量翻倍

视频文件转MP4:

ffmpeg -i input.flv -c -copy -f mp4 -movflags faststart output.mp4:将moov移动到mdat前面

ffmpeg -i input.flv -c -copy -f mp4 -movflags dash output.mp4:生成dash格式,使用一种特殊的MP4格式

ffmpeg -re -i input.mp4 -c -copy -f mp4 -movflags isml+frag_keyframe -f ismv Stream:ismv为微软发部的流媒体格式,通过isml可以发部ISML直播流。将ISMV推流至IIS服务器,通过isml发布

视频文件转flv:

ffmpeg -i input_ac3.mp4 -vcodec copy -acodec aac -f flv output.flv:flv容器不支持ac3,需要将AC3转化为AAC或者MP3

ffmpeg -i input.mp4 -c copy -f flv -flvflags add_keyframes_index output.flv:生成带关键索引的FLV

视频文件转M3U8:

ffmpeg -re -i input.mp4 -c -copy -f hls -bsf:v h264_mp4toannexb output.m3u8:从文件转换HLS直播

ffmpeg -re -i input.mp4 -c -copy -f hls -bsf:v h264_mp4toannexb -start_number 300 output.m3u8:设置M3U8列表中的第一片的序列数

ffmpeg -re -i input.mp4 -c -copy -f hls -bsf:v h264_mp4toannexb -hls_time 10 output.m3u8:设置M3U8列表中切片的duration

推流:

ffmpeg -re -i 100.mov -vcodec copy -acodec aac -f flv -b:v 500k -b:a 40k -s 352x288 -y rtmp://127.0.0.1:1935/live/livestream

多路推流:

ffmpeg -i "rtmp://127.0.0.1:1935/live/livestream1" -i "rtmp://127.0.0.1:1935/live/livestream2" -acodec aac -f flv -b:v 500k -b:a 40k -s 352x288 -y -filter_complex overlay=20:16 "rtmp://127.0.0.1:1935/live/livestream"

拉流:

ffmpeg -i rtmp://127.0.0.1:1935/live/livestream -c copy dump.flv

两路视频合并为画中画:

ffmpeg -i rtmp://127.0.0.1:1935/live/livestream -c copy dump.flv

1. ffmpeg -i input1.mov -i input2.mov -qscale 0 -filter_complex "[0:v]pad=iw:ih[a];[1:v]scale=128x190[b];[a][b]overlay" output.mp4

合并input1.mov和input2.mov为画中画,以input1.mov背景视频,将input2.mov视频缩放为128x190,嵌入背景视频左上角,输出视频format为mp4, -qscale 0保持画质

2. ffmpeg -i input1.mov -i input2.mov -acodec pcm_alaw -vcodec libx264 -pix_fmt yuv420p -filter_complex "[0:v]pad=iw:ih[a];[1:v]scale=128x190[b];[a][b]overlay" output.mov

合并input1.mov和input2.mov为画中画,以input1.mov背景视频,将input2.mov视频缩放为128x190,嵌入背景视频左上角,输出视频format为mov

两路视频合并为并列:

1. ffmpeg -i input1.mov -i input2.mov -qscale 0 -filter_complex "[0:v]pad=iw*2:ih[a];[a][1:v]overlay=w" out.mp4

合并input1.mov和input2.mov为并列,将input1.mov放大2倍,将input2.mov放入input1.mov的右侧,输出视频format为mp4, -qscale 0保持画质

2. ffmpeg -i input1.mov -i input2.mov -acodec pcm_alaw -vcodec libx264 -pix_fmt yuv420p -filter_complex "[0:v]pad=iw*2:ih[a];[a][1:v]overlay=w" out.mov

合并input1.mov和input2.mov为并列,将input1.mov放大2倍,将input2.mov放入input1.mov的右侧,输出视频format为mov

3. ffmpeg -re -i 111.mp4 -re -i 222.mp4 -re -i 333.mp4 -re -i 444.mp4 -filter_complex "nullsrc=size=512x208[base];[0:v] setpts=PTS-STARTPTS,scale=256x104[upperleft];[1:v] setpts=PTS-STARTPTS,scale=256x104[upperright];[2:v] setpts=PTS-STARTPTS,scale=256x104[lowerleft];[3:v] setpts=PTS-STARTPTS,scale=256x104[lowerright];[base][upperleft] overlay=shortest=1[tmp1];[tmp1][upperright] overlay=shortest=1:x=256[tmp2];[tmp2][lowerleft] overlay=shortest=1:y=104[tmp3];[tmp3][lowerright] overlay=shortest=1:x=256:y=104" -c:v libx264 output.flv

合并音频和视频:

ffmpeg -i video.mp4 -i audio.wav -c:v copy -c:a aac -strict experimental output.mp4

如果视频中已经包含了音频,这个时候还可以替换视频中的音频,使用下面命令行。

ffmpeg -i video.mp4 -i audio.wav -c:v copy -c:a aac -strict experimental -map 0:v:0 -map 1:a:0 output.mp4

合并两个音频:

ffmpeg -i input1.mp3 -i input2.mp3 -filter_complex amerge -ac 2 -c:a libmp3lame -q:a 4 output.mp3

横向合并视频:

ffmpeg -i input1.mp4 -i input2.mp4 -lavfi hstack output.mp4

上面的命令虽然可以合并视频,两个视频可以正常播放,但是只保留了前面一个的音频。

下面会介绍怎么避开这个坑。

注意这时候input1和input2必须同样的高度,如果不一样的高度可以使用-shortest参数来保证同样的高度。

如果希望合并多个视频,可以使用下面命令行。

ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -lavfi hstack=inputs=3 output.mp4

其中input=3表示希望合并的视频的个数

纵向合并视频:

ffmpeg -i input1.mp4 -i input2.mp4 -lavfi vstack output.mp4

网格合并视频:

当多个视频时,还可以合并成网格状,比如2x2,3x3这种。但是视频个数不一定需要是偶数,如果是奇数,可以用黑色图片来占位。

ffmpeg -f lavfi -i color=c=black:s=1280x720 -vframes 1 black.png

该命令将创建一张1280*720的图片

然后就可以使用下面这个命令来合并成网格视频了,如果只有三个视频,可以选择上面创建的黑色图片替代。

ffmpeg -i top_left.mp4 -i top_right.mp4 -i bottom_left.mp4 -i bottom_right.mp4 \

-lavfi "[0:v][1:v]hstack[top];[2:v][3:v]hstack[bottom];[top][bottom]vstack"

-shortest 2by2grid.mp4

上面创建的是正规的2x2网格视频。想象一下,现在只有三个视频,我想把第一个视频摆放在第一行的中间,然后把第二、三个视频摆放在第二行。那么就可以使用下面两个命令了。

ffmpeg -f lavfi -i color=c=black:s=640x720 -vframes 1 black.png

ffmpeg -i black.png -i top_center.mp4 -i bottom_left.mp4 -i bottom_right.mp4

-lavfi "[0:v][1:v][0:v]hstack=inputs=3[top];[2:v][3:v]hstack[bottom];[top][bottom]vstack"

-shortest 3_videos_2x2_grid.mp4

截取从头开始的30s

ffmpeg -ss 00:00:00 -t 00:00:30 -i keyoutput.mp4 -vcodec copy -acodec copy split.mp4

截取从30s开始的30s

ffmpeg -ss 00:00:30 -t 00:00:30 -i keyoutput.mp4 -vcodec copy -acodec copy split1.mp4

进行视频的合并

ffmpeg -f concat -i list.txt -c copy concat.mp4

处理原始数据:

提取YUV数据

ffmpeg -i input.mp4 -an -c:v rawvideo -pixel_format yuv420p out.yuv ffplay -s wxh out.yuv

-c:v rawvideo 指定将视频转成原始数据

-pixel_format yuv420p 指定转换格式为yuv420p

YUV转H264

ffmpeg -f rawvideo -pix_fmt yuv420p -s 320x240 -r 30 -i out.yuv -c:v libx264 -f rawvideo out.h264

提取PCM数据

ffmpeg -i out.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm ffplay -ar 44100 -ac 2 -f s16le -i out.pcm

删除水印

先通过 ffplay 找到要删除 LOGO 的位置

ffplay -i test.flv -vf delogo=x=806:y=20:w=70:h=80:show=1

使用 delogo 滤镜删除 LOGO

ffmpeg -i test.flv -vf delogo=x=806:y=20:w=70:h=80 output.flv

倍速播放:

ffmpeg -i out.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" speed2.0.mp4

-filter_complex 复杂滤镜,[0:v]表示第一个(文件索引号是0)文件的视频作为输入。setpts=0.5*PTS表示每帧视频的pts时间戳都乘0.5 ,也就是差少一半。[v]表示输出的别名。音频同理就不详述了。

map 可用于处理复杂输出,如可以将指定的多路流输出到一个输出文件,也可以指定输出到多个文件。"[v]" 复杂滤镜输出的别名作为输出文件的一路流。上面 map的用法是将复杂滤镜输出的视频和音频输出到指定文件中。

截取视频局部

ffmpeg -i in.mp4 -filter:v "crop=out_w:out_h:x:y" out.mp4

截取部分视频,从[80,60]的位置开始,截取宽200,高100的视频

ffmpeg -i in.mp4 -filter:v "crop=80:60:200:100" -c:a copy out.mp4

截取右下角的四分之一

ffmpeg -i in.mp4 -filter:v "crop=in_w/2:in_h/2:in_w/2:in_h/2" -c:a copy out.mp4

截去底部40像素高度

ffmpeg -i in.mp4 -filter:v "crop=in_w:in_h-40" -c:a copy out.mp4

对称视频:

ffmpeg -i out.mp4 -filter_complex "[0:v]pad=w=2*iw[a];[0:v]hflip[b];[a][b]overlay=x=w" duicheng.mp4

视频转JPEG:

ffmpeg -i test.flv -r 1 -f image2 image-%3d.jpeg

视频转gif:

ffmpeg -i out.mp4 -ss 00:00:00 -t 10 out.gif

图片转视频:

ffmpeg -f image2 -i image-%3d.jpeg images.mp4

图片覆盖视频:

ffmpeg -i 1.mp4 -i black.png -qscale 0 -filter_complex overlay=0:70 b.mp4

视频文件添加关键帧:

ffmpeg -i input -acodec pcm_alaw -vcodec libx264 -pix_fmt yuv420p -ar 8000 -ac 1 -profile Baseline -r 29.97(15) ( -s 960x540) output

-g: 关键帧间隔,又称GOP长度。这决定了i帧之间的最大距离。非常高的GOP长度会导致更有效的压缩,但是会使在视频中寻找更加困难。建议默认值:250

-keyint_min:最小GOP长度,i帧之间的最小距离。建议默认值:25

-force_key_frames '0,1,2,3' 设置时间戳pkt_pts_time 为 0,1,2,3得为I帧

给视频添加文字水印:

使用drawtext,

添加本地时间水印

ffmpeg -t 5 -i input.mp4 -vf "drawtext=fontsize=160:text='%{localtime\:%T}'" -c:v libx264 -an -f mp4 output.mp4 -y

添加本地时间水印,打印详细日期并且精确到毫秒

ffmpeg -t 5 -i input.mp4 -vf "settb=AVTB,setpts='trunc(PTS/1K)*1K+st(1,trunc(RTCTIME/1K))-1K*trunc(ld(1)/1K)',drawtext=fontsize=100:fontcolor=white:text='%{localtime}.%{eif\:1M*t-1K*trunc(t*1K)\:d}'" -c:v libx264 -an -f mp4 output.mp4 -y

上面的测试case,比较适合在直播中使用,实时编码同时实时获取系统时间。

如果是离线转码测试,可以添加 -re 参数。如下:

ffmpeg -re -t 5 -i input.mp4 -vf “settb=AVTB,setpts=‘trunc(PTS/1K)1K+st(1,trunc(RTCTIME/1K))-1Ktrunc(ld(1)/1K)’,drawtext=fontsize=100:fontcolor=white:text=’%{localtime}.%{eif:1Mt-1Ktrunc(t*1K):d}’” -c:v libx264 -an -f mp4 output.mp4 -y

把视频的pts时间戳添加为视频水印,精度到毫秒

ffmpeg -t 5 -i input.mp4 -vf "drawtext=fontsize=160:text='%{pts\:hms}'" -c:v libx264 -an -f mp4 output.mp4 -y

默认字体 Sans

默认颜色 black

默认字体大小 16

绘制位置,字体大小100,背景色blue

ffmpeg -i a3.mp4 -vf drawtext="text=test test:x=100:y=100:fontsize=100:fontcolor=white:box=1:boxcolor=blue" -y out2.mp4

中心区域绘制文字

ffmpeg -i a3.mp4 -vf drawtext="fontsize=100:fontcolor=white:text='hello world':x=(w-text_w)/2:y=(h-text_h)/2" -y out3.mp4

旋转图片

ffmpeg -i 5a.png -filter_complex "[0:v]rotate='90*PI/180" 5b.png

pcm 文件转换为 mp3 文件

ffmpeg -y -f s16le -ac 1 -ar 16000 -acodec pcm_s16le -i test.pcm test.mp3

提取pcm

ffmpeg -i 325.wav -y -f s16le -ac 1 -ar 16000 -acodec pcm_s16le test.alaw

编码u率

-acodec pcm_mulaw

硬件编解码:

./ffmpeg -c:v h264_cuvid -i D47A2253.mov -y -c:v h264_nvenc -global_quality 20 2.mov

ffprobe常用命令:

ffprobe --help:查看帮助信息

ffprobe -show_packets input.flv(媒体文件名):查看多媒体数据包信息

ffprobe -show_packets -show_data input.flv(媒体文件名):查看多媒体数据包具体信息

ffprobe -show_format input.flv(媒体文件名):查看多媒体数据包封装格式

ffprobe -show_frames input.flv(媒体文件名):查看多媒体文件的帧格式

ffprobe -show_streams input.flv(媒体文件名):查看多媒体文件的流信息

ffprobe -show_print 或者 ffprobe -of (xmll、ini、json、csv、flat) -show_streams (媒体文件名):使用不同格式查看多媒体文件信息

ffprobe -show_print csv -show _packets input.flv(媒体文件名):可以使用对应的绘图方式绘制可视化图形

ffprobe -v -trace -i output.flv:解析FLV文件,将关键帧索引的信息打印出来

ffplay常用命令:

ffplay --help:查看帮助信息

ffplay -ss 30 -t 10 input.mp4:从视频的第三十秒播放,播放十秒钟的文件

ffplay -window_title "Hello World" output.mp4:视频播放时,窗口显示自定义标题

ffplay -window_title "播放测试" rtmp://up.v.test.com/live/stream:打开网络直播流

time ffplay -window_title "Hello World" -ss 20 -t 10 -autoexit output.mp4:查看命令运行时长

ffplay -vcodec h264 output.mp4:强制使用H.264解码MPEG4,将会报错

ffplay -vst 4 -ast 5 ChinaTV_11.ts:出现多个program时,指定视频流编号为4,音频流编号为5

ffplay -window_title "Hello World" -vf "subtitles=input.srt" output:将字幕文件加载到播放数据中

ffplay -showmode 1 output.mp3:将解码后的音频数据以音频波形显示

ffplay -debug vis_mb_type -window_title "Hello World" -ss 20 -t 10 -autoexit output.mp4:在播放视频时体验解码器解码每个宏块

ffplay -vismv pf output.mp4:查看B帧和P帧的预测信息

ffplay -flags2 +export_mvs -ss 40 output.mp4 -vf codecview=mv=pf+bf+bb:pf:P帧向前运动估计显示;bf:B帧向前运动估计显示;bb:B帧向后运动估计显示

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值