ffmpeg 命令行总结

ffmpeg:超快音视频编码器

ffplay:简单媒体播放器

ffprobe:简单多媒体流分析器

# 将视频文件转成yuv
 ffmpeg -i test.mp4 -s 960*544 -pix_fmt yuv420p test.yuv
#将帮助信息 输出到文件中
ffmpeg -h >ffmpeg_h.log
ffmpeg -h long >ffmpeg_h_log.log
ffmpeg -h full >ffmpeg_h_full.log

ffprobe -h >ffprobe_h.log

ffplay -h >ffplay_h.log
#对内容进行查找
#下面是linux
ffmpeg -h full | grep 264
#下面是windows
ffmpeg -h full | findstr 264
#更改视频的封装格式 以及分辨率
ffmpeg -i test_1920x1080.mp4 -acodec copy -vcodec libx264 -s 1280*720 ./result/test_x264_1280x720.flv
#显示版本信息
ffmpeg -version

#显示支持信息
ffmpeg -buildconf

#展示 支持的编码解码器信息
ffmpeg -formats | more

#展示编码器信息
ffmpeg -muxers | more

#解复用器  筛选 flv  windows 使用 findstr
ffmpeg -demuxers | grep flv

#支持的设备信息
ffmpeg -devices

#查看解码器以及编码器
ffmpeg -codecs | grep 264


#查看解码器
ffmpeg -decoders | grep 264


#查看编码器
 ffmpeg -encoders | grep 264


ffmpeg -bsfs | more

#查看支持的协议  
ffmpeg -protocols | grep rtmp

#查看过滤器
ffmpeg -filters | more

#查看编码 格式
ffmpeg -pix_fmts

#查看音频声道
ffmpeg -layouts

#查看采样格式
ffmpeg -sample_fmts
#查看具体分类所支持的参数
ffmpeg -h type=name

ffmpeg -h muxer=flv
ffmpeg -h filter=atempo  (调整音频播放速率)
ffmpeg -h encoder=libx264

#ffplay 播放控制
在这里插入图片描述

#强制显示宽高
ffplay -i -volume 1 -x 800 -y 480 test_1920x1080.mp4


-framerate 25 :指定帧率
-fs :全屏播放

-an :禁用音频
-vn :禁用视频
-sn :禁用字幕
-ss pos :根据设置的秒进行定位
#在5分 55秒的位置进行播放
ffplay -i -volume 1 -x 800 -y 480 -fs test_1280x720.mp4 -ss 00:05:55

-acodec :指定音频解码器  -acodec libfdk_aac
-vcodec :指定视频解码器  -vcodec h264

-window_title lpf  :指定播放器播放视频的名称
-t 指定播放的时长
-loop number :循环播放的次数
-nostats :不输出视频相关信息,通过这个可以查看ffplay 如何收集的这些信息,自己写播放器可以借鉴
-ast :执行音频流索引
-vst :执行视频流索引,这个只有在视频包含多个流才会生效
#下面这个是执行视频流索引是4  音频索引是3
ffplay -i  -x 800 -y 480  mult.ts -vst 4 -ast 3

-autoexit :播放完毕自动退出
#指定播放时间是5秒  播放完毕自动退出
ffplay -i  -x 800 -y 480  mult.ts -t 5 -autoexit

#通过-codec:v h264 指定使用特定的解码器进行解码播放 
ffplay -i test_1280x720.mp4 -x 800 -y 480  -t 5 -autoexit -codec:v h264

#通过-codec:a 指定使用libfdk_aac 来解码音频数据
ffplay -i test_1280x720.mp4 -x 800 -y 480  -t 5 -autoexit -codec:a libfdk_aac
#播放rtmp 流媒体
ffplay -window_title "cctv1" -x 640 -y 480 rtmp://media3.scctv.net/live/scctv_800

#播放yuv 裸视频  必须指定宽高以及视频格式  帧率指定不指定都行
ffplay -pixel_format yuv420p -video_size 320x240 -framerate 5 yuv420p_320x240.yuv

#播放rgb
ffplay -pixel_format rgb24 -video_size 320x240 -i rgb24_320x240.rgb

#播放pcm  -ar 执行采样率  -ac指定通道数  -f 指定位深
ffplay -ar 48000 -ac 2 -f f32le 48000_2_f32le.pcm
#ffplay 简单的过滤器

#视频旋转
ffplay -i test.mp4 -vf transpose=1
ffplay -i test_1280x720.mp4 -x 800 -y 480  -t 25 -autoexit -codec:a libfdk_aac  -window_title lpf -vf transpose=1

#视频反转
ffplay test.mp4 -vf hflip
ffplay test.mp4 -vf vflip

ffplay -i test_1280x720.mp4 -x 800 -y 480  -t 25 -autoexit -codec:a libfdk_aac  -window_title lpf -vf vflip

#旋转和反转
ffplay test.mp4 -vf hflip,transpose=1

#音频变速播放
ffplay -i test.mp4 -af atempo=2
ffplay -i test_1280x720.mp4 -x 800 -y 480  -t 25 -autoexit -codec:a libfdk_aac  -window_title lpf -af atempo=2

#视频变速播放
ffplay -i test.mp4 -vf setpts=PTS/2

#音频和视频同时变速
ffplay -i test_1280x720.mp4 -x 800 -y 480  -t 25 -autoexit -codec:a libfdk_aac  -window_title lpf -af atempo=2 -vf setpts=PTS/2

#-i 表示输入  -codec copy 不重新进行编码  -ss 起始时间  -t 指定时长  -f 指定输出格式
ffplay -i test_1280x720.mp4 -codec copy -ss 10 -t 20 -f flv out.mp4

#ffmpeg 参数说明
-i 设定输入流
-f 设定输出格式(format)
-ss 开始时间
-t 时间长度

-aframes 设置要输出的音频帧数
-b:a 音频码率
-ar 设定采样率
-ac 设定声音的Channel数
-acodec 设定声音编解码器,如
果用copy表示原始编解码数据必
须被拷贝。

-an 不处理音频
-af 音频过滤器
ffmpeg -i test_1280x720.mp4 -b:a 192k -ar 48000 -ac 2 -acodec aac -aframes 200 out2.mp3

#视频
-vframes 设置要输出的视频帧数
-b 设定视频码率
-b:v 视频码率
-r 设定帧速率
-s 设定画面的宽与高
-vn 不处理视频
-aspect aspect 设置横纵比 4:3 16:9 或 1.3333 1.7777

-vcodec 设定视频编解码器,如果用copy表示原始编解码数据必须被拷贝。
-vf 视频过滤器

ffmpeg -i test.mp4 -vframes 300 -b:v 300k -r 30 -s 640x480 -aspect 16:9 -vcodec libx265

#提取音频数据  -acodec copy 直接拷贝音频编码数据  -VN 禁止视频  
ffmpeg -i test_1280x720.mp4 -acodec copy -vn audio.mp4

#提取视频   -vcodec copy 直接拷贝视频编码数据    -an 禁止音频
ffmpeg -i test_1280x720.mp4 -vcodec copy -an video.mp4

#提取视频
ffmpeg -i test_1280x720.mp4 -vcodec copy -an test_lpf.h264

#强制格式
ffmpeg -i test_1280x720.mp4 -vcodec libx264 -an test_lpf.h264


#提取音频
ffmpeg -i test_1280x720.mp4 -acodec copy -vn test_lpf.aac
#强制格式
ffmpeg -i test_1280x720.mp4 -acodec libmp3lame -vn test_lpf.mp3

#提取yuv数据  提取3秒数据,分辨率和源视频一致
ffmpeg -i test_1280x720.mp4 -t 3 -pix_fmt yuv420p yuv420p_orig.yuv

#提取3秒数据,分辨率转为320x240
ffmpeg -i test_1280x720.mp4 -t 3 -pix_fmt yuv420p -s  640*480 yuv420p_320x240.yuv
#播放yuv 视频数据 必须指定分辨率 否则会绿屏以及花屏
ffplay -i yuv420p_640x480.yuv -s 640*480

#提取3秒数据,分辨率转为320x240
ffmpeg -i test.mp4 -t 3 -pix_fmt rgb24 -s 320x240 rgb24_320x240.rgb
#rgb 格式的数据进行播放 必须指定 pixel_format rgb24  必须指定分辨率  否则播放不出来  如果不指定pixel_format 会花屏绿屏
ffplay -i rgb24_320x240.rgb -pixel_format rgb24 -video_size 320*240

#RGB和YUV之间的转换
ffmpeg -s 640*480 -i yuv420p_640x480.yuv  -pix_fmt yuv420p -pix_fmt rgb24 -s 640*480 rgb24_640x480.rgb
#播放rgb 必须指定pixel_format 以及分辨率
ffplay -i rgb24_640x480.rgb -pixel_format rgb24 -s 640*480



#查询pcm的封装格式
ffmpeg -encoders | grep pcm

ffmpeg -i test_1280x720.mp4 -ar 48000 -ac 2 -f s16le 48000_2_s16le.pcm
ffmpeg -i test_1280x720.mp4 -ar 48000 -ac 2 -sample_fmt s16 out_s16.wav
ffmpeg -i test_1280x720.mp4 -ar 48000 -ac 2 -codec:a pcm_s16le out2_s16le.wav
ffmpeg -i test_1280x720.mp4 -ar 48000 -ac 2 -f f32le 48000_2_f32le.pcm
ffmpeg -i test_1280x720.mp4 -t 10 -vn -ar 48000 -ac 2 -f f32le 48000_2_f32le_2.pcm

#播放pcm 数据
ffplay -i 48000_2_s16le.pcm -ar 48000 -ac 2 -f s16le 

#wav格式的音频文件因为有文件头信息,所以播放的时候不需要指定 采样率 通道数
ffplay -i  out_s16.wav
#更改封装格式
ffmpeg -i test_1280x720.mp4 -vcodec copy -acodec copy test_copy.ts
ffmpeg -i test_1280x720.mp4 -codec copy test_copy2.ts

#改变编码格式
ffmpeg -i test_1280x720.mp4 -vcodec libx265 -acodec libmp3lame out_h265_mp3.mkv

#改变帧率
ffmpeg -i test_1280x720.mp4 -r 15 output2.mp4

#修改视频码率:
ffmpeg -i test.mp4 -b 400k output_b.mkv

#修改视频码率:
ffmpeg -i test.mp4 -b:v 400k output_bv.mkv

#修改音频码率: 如果不想重新编码video,需要加上-vcodec copy
ffmpeg -i test.mp4 -b:a 192k output_ba.mp4


#修改音视频码率:
ffmpeg -i test.mp4 -b:v 400k -b:a 192k output_bva.mp4

#修改视频分辨率:
ffmpeg -i test.mp4 -s 480x270 output_480x270.mp4

#修改音频采样率: 
ffmpeg -i test.mp4 -ar 44100 output_44100hz.mp4
#生成测试文件  找三个不同的视频每个视频截取10秒内容

ffmpeg -i test02.mp4 -ss 00:05:00 -t 10 -codec copy 1.mp4
ffmpeg -i test03.mp4 -ss 00:05:00 -t 10 -codec copy 2.mp4
ffmpeg -i test04.mp4 -ss 00:05:00 -t 10 -codec copy 3.mp4

#如果音视频格式不统一则强制统一为 -vcodec libx264 -acodec aac


#将上述1.mp4/2.mp4/3.mp4转成ts格式
ffmpeg -i 1.mp4 -codec copy -vbsf h264_mp4toannexb 1.ts
ffmpeg -i 2.mp4 -codec copy -vbsf h264_mp4toannexb 2.ts
ffmpeg -i 3.mp4 -codec copy -vbsf h264_mp4toannexb 3.ts

#转成flv格式
ffmpeg -i 1.mp4 -codec copy 1.flv
ffmpeg -i 2.mp4 -codec copy 2.flv
ffmpeg -i 3.mp4 -codec copy 3.flv

分离某些封装格式(例如MP4/FLV/MKV等)中的H.264的时候,需要首先写入SPS和PPS,否则会导致分离出来的数据没有SPS、PPS而无法播放。H.264码流的SPS和PPS信息存储在AVCodecContext结构体的extradata中。需要使用ffmpeg中名称为“h264_mp4toannexb”的bitstream filter处理
#以MP4格式进行拼接
方法1:ffmpeg -i "concat:1.mp4|2.mp4|3.mp4" -codec copy out_mp4.mp4   //有问题
方法2:ffmpeg -f concat -i mp4list.txt -codec copy out_mp42.mp4

#以TS格式进行拼接
方法1:ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out_ts.mp4 
方法2:ffmpeg -f concat -i tslist.txt -codec copy out_ts2.mp4

#以FLV格式进行拼接
方法1:ffmpeg -i "concat:1.flv|2.flv|3.flv" -codec copy out_flv.mp4  //有问题
方法2:ffmpeg -f concat -i flvlist.txt -codec copy out_flv2.mp4

#使用方法2进行拼接  转成TS格式再进行拼接


#修改音频编码
ffmpeg -i 2.mp4 -vcodec copy -acodec ac3 -vbsf h264_mp4toannexb 2.ts
ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out1.mp4 结果第二段没有声音

 #修改音频采样率
 ffmpeg -i 2.mp4 -vcodec copy -acodec aac -ar 96000 -vbsf h264_mp4toannexb 2.ts
ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out2.mp4 第二段播放异常

#修改视频编码格式
ffmpeg -i 1.mp4 -acodec copy -vcodec libx265 1.ts
ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out3.mp4

#修改视频分辨率
ffmpeg -i 1.mp4 -acodec copy -vcodec libx264 -s 800x472 -vbsf h264_mp4toannexb 1.ts
ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out4.mp4

#把每个视频封装格式也统一为ts,拼接输出的时候再输出你需要的封装格式,比如MP4

#视频分辨率可以不同,但是编码格式需要统一

#音频编码格式需要统一,音频参数(采样率/声道等)也需要统一
#截取一张图片
ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.jpg
ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.bmp

-i 输入
-y 覆盖
-f 格式
image2 一种格式
-ss 起始值
-vframes 帧 如果大于1 那么 输出加%03d test%03d.jpg 
-s 格式大小size

#截取多张图片
ffmpeg -i test.mp4 -t 5 -s 640x360 -r 15 frame%03d.jpg

#将图片合成视频
ffmpeg -f image2 -i frame%03d.jpg -r 30 -s 1280*720 video.mp4


#从视频中生成GIF图片
ffmpeg -i test.mp4 -t 5 -r 1 image1.gif
ffmpeg -i test.mp4 -t 5 -r 25 -s 640x360 image2.gif


#将 GIF 转化为 视频
ffmpeg -f gif -i image2.gif image2.mp4
#裁剪图片的三分之一
ffmpeg -i input.jpg -vf crop=iw/3:ih:0:0 out.jpg
ffplay -i input.jpg -vf crop=iw/3:ih:0:0 #直接裁剪查看

#裁剪中间三分之一 iw 输入的宽度
ffmpeg -i input.jpg -vf crop=iw/3:ih:iw/3:0 out.jpg
ffplay -i input.jpg -vf crop=iw/3:ih:iw/3:0 

#对视频进行裁剪
ffplay -i input.mp4 -vf crop=iw/3:ih:iw/3*2:0 


#拉流  对于不是rtmp的协议 -c copy要谨慎使用
ffplay rtmp://media3.scctv.net/live/scctv_800 
ffmpeg -i rtmp://media3.scctv.net/live/scctv_800 -c copy dump.flv

#添加文字水印
ffplay -i test_60_1280x720.mp4 -vf "drawtext=fontsize=100:fontfile=FZFSJW.ttf:text='刘若兮':fontcolor=green:x=20:y=20"

ffplay -i test_60_1280x720.mp4 -vf "drawtext=fontsize=100:fontfile=FZFSJW.ttf:text='刘若兮':fontcolor=white:x=20:y=20"

#改变位置
ffplay -i test_60_1280x720.mp4 -vf "drawtext=fontsize=100:fontfile=FZFSJW.ttf:text='刘若兮':fontcolor=white:x=400:y=200"

#增加透明度
ffplay -i test_60_1280x720.mp4 -vf "drawtext=fontsize=100:fontfile=FZFSJW.ttf:text='刘若兮':fontcolor=white:x=400:y=200:alpha=0.5"

#增加边框
ffplay -i test_60_1280x720.mp4 -vf "drawtext=fontsize=100:fontfile=FZFSJW.ttf:text='刘若兮':fontcolor=white:x=400:y=200:alpha=0.5:box=1:boxcolor=yellow"

#本地时间当做水印
ffplay -i test_60_1280x720.mp4 -vf "drawtext=fontsize=60:fontfile=FZFSJW.ttf:text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':fontcolor=green"

#如果使用ffmpeg进行转存  需要加上-re
ffmpeg -re -i test_60_1280x720.mp4 -vf "drawtext=fontsize=60:fontfile=FZFSJW.ttf:text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':fontcolor=green" out4.mp4

#需要定时显示水印,定时不显示水印
ffplay -i test_60_1280x720.mp4 -vf "drawtext=fontsize=60:fontfile=FZFSJW.ttf:text='test':fontcolor=green:enable=lt(mod(t\,3)\,1)"

#跑马灯
ffplay -i test_60_1280x720.mp4 -vf "drawtext=fontsize=100:fontfile=FZFSJW.ttf:text='刘若兮':x=mod(100*t\,w):y=abs(sin(t))*h*0.7"

#跑马灯+透明度变化
ffplay -i test_60_1280x720.mp4 -vf "drawtext=fontsize=40:fontfile=FZFSJW.ttf:text='刘若兮':x=mod(50*t\,w):y=abs(sin(t))*h*0.7:alpha=0.5:fontcolor=white:enable=lt(mod(t\,3)\,1)"

#加图片水印 这个是直接播放
ffplay -i test_60_1280x720.mp4 -vf "movie=xiaowei.png[watermark];[in][watermark]overlay=x=10:y=10[out]"
#输出添加水印的视频
ffmpeg -i test_60_1280x720.mp4 -vf "movie=xiaowei.png[watermark];[in][watermark]overlay=x=10:y=10[out]" out.mp4

#画中画 副视频停下之后默认显示最后一帧图像
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20[out]"

#eof_action=1 表示短的视频停止之后都会停止
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20:eof_action=1[out]"

#短的视频结束了 画面直接结束
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20:eof_action=2[out]"

#shortest=1 表示短的视频停止之后都会停止
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20:shortest =1[out]"


#对副视频视频进行缩放
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4,scale=640x480[sub];[in][sub]overlay=x=20:y=20[out]"

#跑马灯
 ffplay -i test_60_1280x720.mp4 -vf "movie=test_60_1280x720.mp4,scale=320x270[test];[in][test]overlay=x=mod(50*t\,main_w):y=abs(sin(t))*main_h*0.7[out]"

#双宫格
ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -filter_complex "nullsrc=size=640x480[base];[0:v]setpts=PTS-STARTPTS,scale=320x240[upperleft];[1:v]setpts=PTS-STARTPTS,scale=320x240[upperright];[base][upperleft]overlay=shortest=1[tmp1];[tmp1][upperright]overlay=shortest=1:x=320" out2.mp4


#四宫格
ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -filter_complex "nullsrc=size=640x480[base];[0:v] setpts=PTS-STARTPTS,scale=320x240[upperleft];[1:v]setpts=PTS-STARTPTS,scale=320x240[upperright];[2:v]setpts=PTS-STARTPTS, scale=320x240[lowerleft];[3:v]setpts=PTS-STARTPTS,scale=320x240[lowerright];[base][upperleft]overlay=shortest=1[tmp1];[tmp1][upperright]overlay=shortest=1:x=320[tmp2];[tmp2][lowerleft]overlay=shortest=1:y=240[tmp3];[tmp3][lowerright]overlay=shortest=1:x=320:y=240" out3.mp4

猜你喜欢

转载自blog.csdn.net/u014078003/article/details/128493098