当前位置: 首页 > article >正文

ffmpeg 常用命令 案例

 更详细请参考ffmpeg手册,下载ffmpegrelease版后在doc中就有,主页面。

ffmpeg主要命令的详细参考: ffmpeg Documentation # Main-options 

-version -formats -demuxers -protocols -muxers -filters -devices -codecs -sample_fmts -decoders -layouts -encoders -colors -bsfs

-sources :显示当前主机所有可用的采集驱动 FFmpeg Devices Documentation 

-sources dshow:显示当前主机dshow驱动下可用采集设备 
-pix_fmts:FFmpeg Video scaling and pixel format converter Documentation 
-sample_fmts:FFmpeg Resampler Documentation
-sinks :显示所有可用的输出驱动
-dispositions :显示支持的流配置
-buildconf:显示ffmpeg编译前选择的构建配置
-hwaccels:显示支持的硬件加速器
以下可以在ffmpeg -h中可以查看有哪些具体参数的 类型
ffmpeg -h demuxer=flv :查看解复用器flv可以设置的参数,ffmpeg -demuxers查看有哪些复用器
ffmpeg -h muxer=mp4 :查看复用器mp4可以设置的参数 FFmpeg Formats Documentation 
ffmpeg -h decoder=aac:查看解码器aac可以使用的参数  FFmpeg Codecs Documentation 
ffmpeg -h encoder=h264:查看编码器h264可以使用的参数 FFmpeg Codecs Documentation 
ffmpeg -h filter=drawtext:查看滤镜drawtext可以使用的参数 FFmpeg Filters Documentation 
ffmpeg -h bsf=setts:查看比特流过滤器setts可以使用的参数。FFmpeg Bitstream Filters Documentation 
ffmpeg -h protocol=rtmp:查看协议rtmp可以使用的参数,ffmpeg -protocols 查看有哪些协议 FFmpeg Protocols Documentation  

查看 该版本的ffmpeg中 音频编码器 aac 可以使用的参数(不同版本的编码器参数会有差异,支持度也不同)
ffmpeg -v error -encoders | findstr audio     :在encoders中找音频的编码器
ffmpeg -v error -encoders | findstr Audio      :在encoders中找音频的编码器
ffmpeg -v error -h encoder=aac                   :找到了aac后查看aac所支持的参数,带“-”的都是该编码器支持的参数,包括了 参数类型 和参数说明。

ffmpeg -i E:/1/22-.mp4 -ss 11:0 -t 1:0 -b:v 1M -vf setpts=N/FRAME_RATE/TB -af asetpts=N/SR/TB -vcodec hevc_nvenc E:/1/2-.mp4
-vf setpts=N/FRAME_RATE/TB :重置视频时间戳。vf是video filter的缩写,设置视频滤镜。N/FRAME_RATE/TB 中的N表示第N帧,FRAME_RATE 或者 FR 表示视频采样频率(frame rate)也就是帧率,TB是timebase的缩写,表示时间基。计算pts的表达式为N/(TB*FR),PTS是以TB为单位进行计数的。另外一种计算pts表达式为PTS-STARTPTS
参考:FFmpeg Filters Documentation -toc-setpts_002c-asetpts
-af asetpts=N/SR/TB:重置音频的时间戳,N/SR/TB中的N是NB_SAMPLES的缩写,表示当前音频帧的帧数,SR为SAMPLE_RATE的缩写,表示音频采样率,TB表示音频的时间基。
“-vcodec hevc_nvenc”:对视频进行重编码时,设置视频编码器为hevc_nvenc(主要是利用显卡编码速度快)。hevc_nvenc为英伟达的硬件编码,安装有英伟达支持硬件编码的显卡才能使用该选项,具有加速编码的效果。下面 t 表示以 秒 为单位计数的时间。
流媒体中时间相关的三个公式:N = PTS*TB*FR   PTS = N/(TB*FR)   t=N/FR=PTS*TB

ffmpeg支持的硬编码解码器,有的加速明显,有的加速比较慢。

“-codec copy ”:表示对原始编码的视频和音频直接拷贝,相当于“-vcodec copy ”和“-acodec copy”。对视频进行时如果视频帧率或音频采样率不同会出现https://blog.csdn.net/qiushangren/article/details/132418796 中所提到的问题
“-i E:/1/22-.mp4”:设置输入视频
“-ss 1:1:1”:截取视频时设置开始时间1:1:1  。如果-ss 参数在-i参数之前,会定位到该时间点之后最近的i帧或p帧,有时会出现开头视频解码错误(可能定位到了一个p帧),这时可以通过截取1分钟视频,将时间往前调几秒钟进行尝试。在视频文件中两i帧之间的间隔从几毫秒到几十秒不等。
对截取视频进行重新编码的方案,会先找目标时间点附近往前的最近的i帧,然后精确定位到时间点的帧进行重编码。

“-t 1:1:1”:截取视频时设置时长1:1:1  ,放在-i之前,表示对输入视频进行时长限制,读取到对应时长就不读了,放在-i之后表示对输出进行时长限制,写完对应时长就不写了。
“-to 2:2:2”:截取视频时设置截止时间2:2:2 ,放在-i之前,表示对输入视频进行截止时间限制,读取到对应截止时间就不读了,放在-i之后表示对输出进行截止时间限制,写完对应截止时间就不写了。这个与-ss一起使用时,需要注意与-ss 放置的位置要一致
"-b:v 1M":设置视频流码率1M”

ffmpeg -ss 22:30 -accurate_seek -i E:/1/1.mp4 -t 2:0 -avoid_negative_ts 1 -c copy  E:/1/11-.mp4
“-avoid_negative_ts 1” :结合-c copy 使用。直接跳转到目标时间点最近的I帧开始,避免出现视频解码错误的现象。avoid_negative_ts的值为[-1,2],为正数时才会进行跳转,默认值为0.
“-accurate_seek” :结合-ss使用,允许ss是否精确定位。(暂时没发现有什么特殊之处)
“-start_at_zero” :结合-ss使用,当-ss 放在 -i前面时才用到该参数。

ffprobe -show_frames a.mp4 :列举并显示视频文件a.mp4 中所有的帧的信息
ffprobe a.mp4 -show_frames - :
ffprobe -v error -i G:/1/111.mp4 -show_streams -select_streams v :显示111.MP4中的视频流信息
ffprobe -v error -i G:/1/111.mp4 -show_streams -select_streams a :显示111.MP4中的音频流信息
ffprobe -v error -i G:/1/111.mp4  -select_streams v -show_entries stream=nb_frames,codec_name:显示流中nb_frames和codec_name字段的信息。
ffplay -v error -i G:/1/1.mp4 -vf "setpts='print(PTS,1);print(N,1);PTS'" :打印视频的当前帧号和当前帧的pts(时间戳),表达式 ’print(PTS,1);print(N,1);PTS‘ 最终会取最后这个表达式的值。
-v error表示error级别的日志,等价于-loglevel error,日志级别包括:‘quiet, -8’,‘panic, 0’ ,‘fatal, 8’, ‘error, 16’, ‘warning, 24’, ‘info, 32’, ‘verbose, 40’ ,‘debug, 48’ ,‘trace, 56’
-vf "setpts='print(PTS,1);print(N,1);PTS' " :PTS、N都是setpts或asetpts过滤器中才有的参数,所以显示帧号或时间戳必须在setpts过滤器中操作。详细参数参考:FFmpeg setpts_002c-asetpts
print(value[,loglevel]),value表示需要打印的内容,loglevel(可选项)设置打印结果的日志级别,需要输入数字(0-8之间表示fatal,8到16之间表示error,依次类推)。日志有level和repeat两个flags,使用方法为:-v [repeat+[level+]]error

ffmpeg -f mp4 -i E:/1/1.mp4 -c copy -f flv E:/1/1.flv:将1.mp4转换为1.flv
-f mp4:指定输入的格式为mp4,省略不写时ffmpeg 会根据输入文件的后缀进行判断。-f可以指定输入或的输出格式(formats),在指定输入时还可以指定输入所采用的驱动(devices)。FFmpeg Formats        FFmpeg Devices 
-f flv:指定输出的格式为flv,省略不写时ffmpeg 会根据输出文件的后缀进行判断。

ffmpeg -f concat -i E:/1/videos.txt -safe 0 -codec copy E:/1/a.mp4    //拼接多个视频文件。(视频拼接需要视频的码率、帧率、宽、高等等参数一致,对于有差异的视频需要通过filter对其进行处理后格式变成一致才能进行拼接。判断视频参数是否一致,需要通过ffprobe进行探查)

“-f concate”:将多个视频进行拼接。
“-i E:/1/videos.txt” :指定存放要拼接的文件的内容。可以对满足拼接条件的多个文件进行拼接。
-safe 0:允许使用不安全的文件名,这对于指定文件路径非常有用。如果不加这个参数,当文件名包含特殊字符时,可能会导致拼接失败。

ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex concat=n=2:v=1:a=1 output.mp4
拼接input1.mp4和input2.mp4两个视频文件,output.mp4是拼接后的输出文件。其中,n表示需要拼接的文件个数,v表示是否拼接视频流,v=1表示拼接视频流,v=0表示不拼接视频流,a表示是否拼接音频流。

ffmpeg -i 1.mp3 -i 2.mp3 -filter_complex amerge -ac 2 -c:a libmp3lame -q:a 4 output.mp3:
-ac:设定声音的channel数 
-c:a libmp3lame:指定音频编码器为libmp3lame
-q:a:表示输出的音频质量,一般是1到5之间(1 为质量最高) 

ffmpeg -i 1.mp3 -i 2.mp3 -i 3.mp3 -filter_complex "[1:a]adelay=1000[a1];[2:a]adelay=1000[a2];[0:a][a1][a2]concat=n=3:v=0:a=1" output.mp3: 拼接三段音频,在每段之间加入一秒的空白。
-filter_complex  “[1:a]adelay=1000[a1]”:第2段素材的音频(如果是视频就是[1:v]),延迟1000毫秒播放,并且赋值为a1,供后面使用。同理定义了a2。
-filter_complex  “[0:a][a1][a2]concat=n=3“:将第一段素材的音频、a1和a2拼接,n=3表示三段。
v=0:a=1:不要声音,只要音频。

ffmpeg -i 1.mp4 -i bg.jpg -i font.png -filter_complex "[0:v]scale=1080:-1[video];[1:v][video]overlay=x=0:y=(1920-h)/2[v1];[v1][2:v]overlay" -codec:a copy  output1.mp4:bg.jpg是1080*1920的竖版图片用作背景,font.png是1080*1920的带透明通道的字幕图片。目的是在背景图中间嵌入(合并)视频1.mp4,并对1.mp4保持宽为1080的自适应缩放,最后合并上字幕。
[0:v]scale=1080:-1[video]:第一个素材的只取视频,按比例resize成宽1080,输出赋值为video。
[1:v][video]overlay=x=0:y=(1920-h)/2[v1]:将第video放在背景图上层,左上角起点位置是x,y,输出赋值为v1.
[v1][2:v]overlay:将第三个素材的视频放在v1上层。

音频、视频合并

ffmpeg -i 1.mp4 -i 1.mp3 -filter_complex "[1:a]volume=0.3[a1];[0:a][a1]amix=inputs=2:duration=first[a]" -map 0:v -map "[a]" -c:v copy -c:a aac -y output.mp4:视频合成,  原视频有声音,在保持原视频声音不变的情况下,添加背景音,并让背景音音量变小。
[1:a]volume=0.3[a1]:第二个素材的音频音量取30%,输出赋值为a1;
[0:a][a1]amix=inputs=2:duration=first[a]:第一个素材(视频)的声音和背景音混合,时长为第一个素材的声音,输出赋值a;
-map 0:v:视频流式拼接,这里只有一个视频;
-map "[a]":音频流式拼接,这里取刚刚输出的a;
-c:v copy:视频编码不变;
-c:a aac :音频编码acc。
-y:输出文件覆盖

ffmpeg -i 1.mp4 -i 1.mp3 -filter_complex "[0:v]trim=0:10.1[v];[1:a]adelay=1000[a];[v][a]concat=n=1:v=1:a=1" -c:v libx264 -c:a aac -movflags +faststart output.mp4:视频合成,  去掉原视频的声音,重新配音,并且声音前增加1秒的空白。
[0:v]trim=0:10.1[v]:视频取1-10.1秒,这里单位是秒,输出赋值v;
[1:a]adelay=1000[a]:音频演示1000毫秒播放,这里单位是毫秒;
[v][a]concat=n=1:v=1:a=1:音视频合在一起,输出需要视频和音频;
-c:v libx264:视频编码使用x264;
-c:a aac:音频编码acc;
-movflags +faststart :这个参数跟mp4的元数据有关,设为faststart表示会将moov移动到mdat的前面,在线播放的时候会稍微快一些。

ffmpeg -i E:/1/2.mp4 -r 15 E:/1/22-.mp4 
“-r 15” :修改视频帧率时使用,设置目标视频帧率。

ffmpeg -i E:/1/6-.mov -r 29.97 -ar 44100 -map 0:0 -map 0:1 E:/1/6.mov //作用是将文件变换帧率,同时保持原来文件流的序列号。此案例中6-.mov原来stream 0是音频流,stream 1是视频流,但是使用ffmpeg进行重新编码后(此处使用-r就会导致重新编码),ffmpeg会默认将视频流设置为stream 0,音频流设置为stream 1。要保持原来的流序列号。就需要通过-map[stream] (stream 可用 ”文件序号:流序号“ 或者 流别名 表示)来设置先后顺序,第一个map设置第一个输入文件的第一个流为 stream 0 ;第二个map设置第一个输入文件的第二个流为stream 1

-map  input_file_index:stream_number:挑选流和设置流序列号。
-ar 44100 : 设置音频的采样率为44100

ffmpeg -i E:/1/6-.mov -video_track_timescale 30K -r 29.97 -c:v libx264 -b:v 7M  E:/1/6.mov
-video_track_timescale 30K   设置tbn为30K,在新版的ffmpeg中tbc已经被抛弃了。设置tbn必须通过这个参数进行。拼接的两个视频的tbn不一致的时候,会导致合成的目标视频出现时长紊乱。
参考:
https://superuser.com/questions/1362410/what-is-fps-tbr-tbn-tbc-in-ffmpeg
https://video.stackexchange.com/questions/33134/ffmpeg-resizing-mp4-changes-the-timebase-tbn-tbc

ffmpeg -i E:/1/1.mp4  -r 25 -vf scale=848:1520 -b:v 1M -c:v hevc_nvenc E:/1/1-.mp4:缩放视频长宽|视频尺寸|视频大小|width|height|video size
-vf scale=848:1520 表示将1.MP4的视频的长宽通过伸缩的方式改为848:1520。scale=w:h。当w为-1时表示保持原来的长宽比,并将h设置为新的值;h亦然。(视频合拼后出现乱码,很有可能是因为视频的尺寸对不上
 

ffmpeg -i E:/1/1.mp4 -vf crop=1280:720:200:200 E:/1/1-.mp4
-vf crop=1280:720:200:200   表示将1.MP4的视频的长宽通过裁剪的方式截取画幅为1280:720。crop=‘w:h:x:y’:w、h表示裁剪的长高,x、y表示裁剪的起始点。当w或h超出原画幅的width或height时,会报错。x和y可以不进行设置,程序会自动计算,默认居中(crop=1280:720)。当设置w+x超出原画幅的width时,x会被削减,假设原画幅的width为1920,w为1280,x设置为1000与10000都会被削减为1920-1280。

ffmpeg -i E:/1/1.mp4 -ss 2:55:10 -t 30:0 -r 24 -ac 1 -ar 44100 -video_track_timescale 20K -vf "scale=720:1280,setsar=sar=1:1" -b:v 1M -c:v hevc_nvenc E:/1/1-.mp4

  1. PAR图像纵横比:PAR=(每行像素数)/(每列像素数)=分辨率,通过scale或-s可进行设置
  2. SAR样点纵横比:SAR=(像素的宽)/(像素的高)。像素不一定都是正方形的。
  3. DAR显示纵横比:一般说的16:9和4:3指的是DAR。DAR=(每行像素数像素的宽)/(每列像素数像素的高),即DAR=PAR*SAR

-vf "scale=720:1080,setsar=sar=1:1" :设置视频幅度为720:1080 ,设置sar=1:1  
-ac 1 :设置声音为单通道,如果stereo应该设置为2通道
-ab 56K :设置声音的比特率 等价于"-b:a 56K"
-ar 44100 : 设置音频的采样率为44100

ffmpeg -i D:/1/1.mp4 -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" D:/1/b.mp4  将视频上半部分水平镜像到下半部分形成新的视频。

                [main]
input --> split ---------------------> overlay --> output
            |                             ^
            |[tmp]                  [flip]|
            +-----> crop --> vflip -------+
input就是原输入流,上图整个流程就做了这些操作,
首先使用split滤波器将input流分成两路流(main和tmp),然后分别对两路流进行处理。对于tmp流,先经过crop滤波器进行裁剪处理,再经过flip滤波器进行垂直方向上的翻转操作,输出的结果命名为flip流。再将main流和flip流输入到overlay滤波器进行合成操作。上图的input就是上面提过的buffer源滤波器,output就是上面的提过的buffersink滤波器。

以上操作使用命令实现是
ffmpeg -i INPUT -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" OUTPUT
同一个线性链中的过滤器用逗号分隔,不同的过滤器线性链用分号分隔。
在我们的例子中,裁剪,vflip在一个线性链中,分割和叠加在另一个链中是分开的。线形链连接的点用方括号括起来的名称进行标记。
在本例中,拆分过滤器生成与标签[main]和[tmp]相关联的两个输出。
一些过滤器接受输入的参数列表:它们在过滤器名称和等号之后指定,并用冒号分隔。
描述:前景窗口(第二输入)覆盖在背景窗口(第一输入)的指定位置。
​
语法:[main_name][overlay_name]overlay[=x:y[[:rgb={0, 1}]]
    参数 x 和 y 是可选的,默认为 0。
    参数 rgb 参数也是可选的,其值为 0 或 1,默认为 0。
​
参数说明:
    x                   从左上角的水平坐标,默认值为 0
    y                   从左上角的垂直坐标,默认值为 0
    rgb                 值为 0 表示输入颜色空间不改变,默认为 0;值为 1 表示将输入的颜色空间设置为 RGB
​
变量说明:如下变量可用在 x 和 y 的表达式中
    main_w 或 W          主输入(背景窗口)宽度
    main_h 或 H          主输入(背景窗口)高度
    overlay_w 或 w       overlay 输入(前景窗口)宽度
    overlay_h 或 h       overlay 输入(前景窗口)高度

ffmpeg -i 1.mp4 -vf pad=2*iw 4.mp4  :将宽度扩展一倍,用黑色填充。
-vf pad=2*iw:将宽度扩展为原来的两倍,pad=w:h:x:y:violet  (violet 紫色)

ffmpeg -i 1.mp4 -vf split[a][b];[a]pad=2*iw[1];[b]hflip[2];[1][2]overlay=w:0 7.mp4
    F1: split过滤器创建两个输入文件的拷贝并标记为[a],[b]
    F2: [a]作为pad过滤器的输入,pad过滤器产生2倍宽度并输出到[1].
    F3: [b]作为hflip过滤器的输入,vflip过滤器水平翻转视频并输出到[2].
    F4: 用overlay过滤器把 [2]覆盖到[1]的旁边.

ffmpeg -i .test.mp4 -i test1.mp4 -lavfi hstack output.mp4 :将两个相同格式的视频左右拼接(对于不同格式视频的拼接需要先用vf将视频进行修正)
-lavfi hstack :左右拼接, vstack 上下拼接

ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -lavfi hstack=inputs=3 output.mp4 :3个视频左右拼接
ffmpeg -i test.mp4 -vf "transpose=1" out.mp4 :顺时针旋转90° transpose=2 逆时针90°
视频滤镜 transpose :0:逆时针旋转90度并垂直翻转,1:顺时针旋转90度,2:逆时针旋转90度,3:顺时针旋转90度后并垂直翻转。参考FFmpeg Filters - transpose
ffplay -vf "rotate=angle=PI*5/180" -i G:/1/1.mp4  :顺时针旋转5度
视频滤镜 rotate:angle表示以弧度计算的角度,参考FFmpeg Filters - rotate 
ffmpeg -i test.mp4 -vf hflip out.mp4 :水平翻转视频画面 vflip垂直翻转

ffmpeg -i ring.mp4 -i ring_100x87.png -filter_complex overlay=W-w:H-h-56 -max_muxing_queue_size 1024 ring_logo_b.mp4  :对ring.mp4添加水印。


ffmpeg -i ring.mp4 -itsoffset 8.6 -i ring_100x87.png -filter_complex overlay=W-w:56 -max_muxing_queue_size 1024 ring_logo_delay.mp4:背景窗口播放 8.6 秒后,图标开始显示。注意 “-itsoffset 8.6” 作为第二个输入文件的输入选项,参数位置不能放错。

ffmpeg -i D:/1/a.mp4 -filter_complex "[0:v]split=3[v0][v1][v2];[v0]trim=0:10,setpts=PTS-STARTPTS[vout0];[v1]trim=10:20,setpts=PTS-STARTPTS[vout1];[v2]trim=20:30,setpts=PTS-STARTPTS[vout2];[0:a]asplit=3[a0][a1][a2];[a0]atrim=0:10,asetpts=PTS-STARTPTS[aout0];[a1]atrim=10:20,asetpts=PTS-STARTPTS[aout1];[a2]atrim=20:30,asetpts=PTS-STARTPTS[aout2]" -c:v hevc_nvenc -map [vout0] -map [aout0] D:/1/output0.mp4 -map [vout1] -map [aout1] D:/1/output1.mp4 -map [vout2] -map [aout2] D:/1/output2.mp4 -y  将一个30s的视频按时间先后拆分成三个10s的视频。ffmpeg 中的video filter 和audio filter是分开的,所以对声音和视频需要分开处理。按时间先后顺序拆分视频,最便捷的截取方式应该是 通过-ss和 -t参数进行操作

ffmpeg -f lavfi -i "aevalsrc=10:d=2" -f lavfi -i "anullsrc=duration=1" -filter_complex "[0:a][1:a]amix=inputs=2:duration=first:dropout_transition=0" output.wav:在音频之间多次插入随机静音的效果
aevalsrc=0:d=2:aevalsrc为音频滤镜,这段作用表示生成2秒钟的静音音频
anullsrc=duration=1:anullsrc为音频滤镜,这段作用为生成1秒钟的空白音频
[0:a][1:a]amix=inputs=2:duration=first:dropout_transition=0:amix为音频滤镜,这段作用表示将静音音频和空白音频混合在一起, amix作用是混合音频,音量大小等于1/n,amix混合不同时长的音频时,会出现音频音量前后不一致, ffmpeg使用amix混合多个音频时音量变小或音量不一致问题-CSDN博客 
FFmpeg音频滤镜(12) - 简书

ffmpeg -i G:/1/tt.mp3 -af "amovie=filename='G\:/1/tt1.mp3'[1];[0:a][1]amix=inputs=2"  G:/1/tt2.mp3 -y
-amovie:音频过滤器,与movie的参数一致,可以用于导入音频文件。对于文件路径中的 ":" 需要用反斜杠转义,避免被错误解析成操作符,详细参数参考:FFmpeg Filters-movie Documentation
ffmpeg -i G:/1/tt.mp3 -af "amovie='G\:\\1\\tt1.mp3'[1];[0:a][1]amix=inputs=2"  G:/1/tt2.mp3 -y
ffmpeg -i G:/1/tt.mp3 -filter_complex "amovie='G\:\\1\\tt1.mp3'[1];[0:a][1]amix=inputs=2[out]" -map [out] G:/1/tt2.mp3 -y


将图片制作成一个小视频,然后添加到长视频开头:

(1)ffmpeg -f lavfi -t 0.1 -i anullsrc=r=44100:cl=mono -c:a aac -ab 69K D:/1/test.aac -y :制作0.1秒的静音音频流文件,采样率ar、编码器c:a、通道数cl、码率b:a 要与目标文件一致。
(2)ffmpeg -t 0.1 -f image2 -loop 1 -i D:/1/1.jpeg -r 22.37 -video_track_timescale 17152 -vf "setsar=sar=1:1" -b:v 1M -c:v hevc_nvenc D:/1/11-.mp4 制作0.1秒长的视频流文件,分辨率(不一样的时候可以使用vf 中的scale|crop|pad等进行操作,保证输出的视频流文件与目标的一致)、帧率-r、tbn、sar 与目标文件的视频流保持一致。
(3)ffmpeg -i D:/1/11-.mp4 -i D:/1/test.aac -map 0:0 -map 1:0 D:/1/1-.mp4:将音频流和视频流合并,-map 的位置极为重要,他设置了视频流和音频流的下标,这里-map 0:0 表示第一个输入文件的第一个流作为输出文件的第一个流,-map 1:0 表示第二个输入文件的第一个流,必须保证与目标流下标对应。就此制作完成
(4)ffmpeg -f concat -i D:/1/videos.txt -c copy D:/1/a.mp4 ,拼接两个文件。

vf中的concat :1.mkv 2.mkv 3.mkv每个视频都有3个流,分别是v[0] a[1] a[2]。使用vf将三个视频拼接成一个视频

ffmpeg -i 1.mkv -i 2.mkv -i 3.mkv -filter_complex \
  '[0:0] [0:1] [0:2] [1:0] [1:1] [1:2] [2:0] [2:1] [2:2]
   concat=n=3:v=1:a=2 [v] [a1] [a2]' \
  -map '[v]' -map '[a1]' -map '[a2]' output.mkv
concat=n=3:v=1:a=2 ,表示目标文件和输入文件的流有3个,v有一个,a有两个。

对part1.mp4和part2.mp4的视频进行缩放后拼接成一个文件,操作如下:
movie=part1.mp4, scale=512:288 [v1] ; amovie=part1.mp4 [a1] ;
movie=part2.mp4, scale=512:288 [v2] ; amovie=part2.mp4 [a2] ;
[v1] [v2] concat [outv] ; [a1] [a2] concat=v=0:a=1 [outa]

其他参数

ffmpeg -i E:/1/1.mp4 -metadata title=xxx -metadata copyright=xxx.com -metadata comment=xxx.com -t 1:0 -b:v 1M -c:v hevc_nvenc E:/1/2-.mp4 设置title copyright comment等参数。

GOP

ffprobe -i D:/1/a.mp4 -select_streams v:0 -show_frames >D:/1/h1.txt :查看gop(计算两个I帧pict_type=I的时间间隔,具体视频流中,每个gop的时间长度有所差异,gop在编码是只是一个参考值)
ffmpeg -i D:/1/a.mp4 -f segment -segment_time 2 -reset_timestamps true -avoid_negative_ts 1 -c copy D:/1/out%d.mp4 -y  :将D:/1/a.mp4的内容按不小于2秒时长进行分段并保存。不会截断gop。
-f segment: 输出分段。详细参考FFmpeg Formats - segment 
-segment_time 2,设置片段时间,如果这是时间长小于一个gop的时长,则表示按gop长度进行分段。

ffmpeg -t 3 -i D:/1/a.mp4 -avoid_negative_ts 1 -c copy D:/1/outtest.mp4 :截取3秒,会截断gop。

如何用ffmpeg准确剪切视频,对初始gop进行重编码(最方便的还是对视频重编码):Can you losslessly ediit H264 at the GOP level? -Stack Exchange 

设备:

ffmpeg -devices 查询当前的设备有哪些,windows下建议使用dshow,mac下建议使用foundation

 ffmpeg -f dshow -list_devices true -i "" 该命令可以查询设备列表(空引号表示列举,也可以用单词 dummy 来代替)  (-i 指定设备 mac 下 1表示桌面(命令查询mac下的索引号))

-f dshow :指定输入为dshow驱动的输入格式。

ffmpeg -f dshow -list_options true -i video="USB  Live  Camera"  :该命令查看设备“USB Live Camera”支持的格式 ​​​​​​。可以看到该设备有pin 0 和pin 1,两者支持的格式不一样,pin 1中支持h264。
ffplay -f dshow -vcodec h264 -video_pin_name 1 -framerate 30 -video_size 1920*1080 -x 640 -y 480 -i video="USB  Live  Camera" -f dshow -i audio="麦克风 (USB  Live  Camera   audio  Devi)"  :捕捉设备"USB  Live  Camera" pin 1中的h264编码分辨率为1920*1080,帧率为30帧的格式的画面。并显示成640*480画幅的画面,并采集"麦克风 (USB  Live  Camera   audio  Devi)"的声音。 这里的 video_pin_name framerate video_size 都是dshow的参数,dshow详细参数参考:FFmpeg Devices - dshow 
ffplay -f dshow -show_video_device_dialog true -show_audio_device_dialog true -i video="USB  Live  Camera":audio="麦克风 (USB  Live  Camera   audio  Devi)" 同时采集摄像头的声音和视频。
-show_video_device_dialog true 打开摄像头的视频画面调整器
ffplay -f dshow -vcodec mjpeg  -framerate 30 -video_size 1920*1080 -x 640 -y 480 -i video="USB  Live  Camera":捕捉设备"USB  Live  Camera" pin 0(默认pin值)中的h264编码分辨率为1920*1080、帧率为30帧的格式的画面。并缩放显示成640*480画幅的画面。
ffplay -f gdigrab -offset_x 10 -offset_y 20  -video_size 640:480 -i desktop :通过gdigrab捕捉桌面区域。
-offset_x -offset_y 是gdigrab的参数,用于设置捕获(截取)的画面的偏移,-video_size是设置捕获(截取)画面的长宽。这两个参数用于控制捕获行为。
ffplay -f gdigrab -i desktop -x 640 -y 480 :通过gdigrab捕捉桌面,并缩放成640*480来显示 -x -y 设置输出显示的画幅
ffplay -f gdigrab -i desktop -vf "scale=640:480" :通过gdigrab捕捉桌面,并缩放成640*480来显示
ffmpeg -f gdigrab -framerate 6 -i title=tools out1.mp4 :使用gdigrab采集窗口名字为tools 的窗口的画面。
ffplay -f vfwcap -i 0 :捕捉设备编号为0 的画面采集设备的画面。
ffmpeg -t 5 -f dshow -vcodec mjpeg  -framerate 30 -video_size 1920*1080 -i video="USB  Live  Camera" -s 640x480 -y E:/video/test.mp4 : 捕获相机画面缩放成640*480的画面并保存到文件中,时长为5s。
-s 是ffmpeg命令中才有的参数,用于设置编码输出的分辨率。

rawvideo在ffmpeg中是一种格式,也是编码器和解码器。作为格式时,rawvideo有framerate pixel_format video_size三个参数,rgb yuv等等无压缩的格式都会被ffmpeg当做rawvideo。ffmpeg输出的rgb、bgr等等格式数据文件需要以为.rgb后缀进行保运,yuv相关的格式数据需要以.yuv为后缀进行保存。  参考 ffmpeg Formats- rawvideo
ffmpeg -f dshow -t 2 -i video="USB  Live  Camera" -vf "format=rgb24"  E:/video/out.rgb -y  :从摄像头获取画面并用滤镜转换成rgb24格式保存。ffmpeg命令行中生成rgb或者bgr相关格式的内容文件必须保存为.rgb后缀
ffplay -autoexit -video_size 640x480 -pixel_format rgb24 -i E:/video/out.rgb :播放rgb24格式的内容
ffmpeg -f dshow -t 2 -i video="USB  Live  Camera" -f rawvideo -pix_fmt yuv420p E:/video/out.yuv :从摄像头采集yuv画面    
ffmpeg -i input.mp4 -an -c:v rawvideo -pix_fmt 420p out.yuv :将imput.mp4 转换成YUV420p格式的文件out.yuv,-c:v rawvideo表示输出视频无编码,
ffplay -autoexit -pixel_format yuv420p -video_size 608x368 out.yuv :播放yuv格式文件。-s指定输入画面的长宽,在这里是必须的参数
-autoexit :文件播放完后自动退出播放界面
ffplay -autoexit -f rawvideo -pixel_format yuv420p -video_size 640x480 -i E:/video/out.yuv -vf extractplanes='y' :提取出y分量播放,参考FFmpeg Filters extractplanes 
ffmpeg -i input.mp4 -filter_complex  "extractplanes= y+u+v[y][u][v]" -map "[y]" y.yuv -map "[u]" u.yuv -map "[v]" v.yuv :从mp4文件中提取出y u v 分量的文件。
ffmpeg -f rawvideo -video_size 640x480 -i E:/video/out.yuv  -filter_complex  "extractplanes=y+u+v[y][u][v]" -map "[y]" E:/video/y.yuv -map "[u]" E:/video/u.yuv -map "[v]" E:/video/v.yuv  -y:从yuv文件中提取y、u、v分量
ffplay -autoexit -pixel_format gray -video_size 640x480  y.yuv :播放y分量的文件
ffplay -autoexit -pixel_format gray -video_size 320x240  u.yuv :播放u分量的文件
ffmpeg -i out.mp4 -vn -ar 44100 ac 2 -f s16le out.pcm:提取音频无编码的原始数据
-f s16le:设置抽取出的音频pcm数据的格式,s16le s表示short类型,16位,packed格式,le(little end) 表示小端模式。f32be 表示float类型32位大端模式(big end)  


详细的pcm情况可以查阅:可以在 Microsoft 365 上播放的视频格式 - Microsoft 支持 
FFmpeg PCM数据存储:Packed与Planar的区别及采样格式解析-CSDN博客 
ffplay -autoexit -ar 44100 -ac 2 -f s16le out.pcm:播放音频原数据
ffmpeg -i test.jpg -s 640x480 -pix_fmt yuv420p test.yuv :jpg格式图片转yuv格式
ffmpeg -i test.mp4 -ss 10 -t 2 -r 10 out.gif :视频转gif。截取视频中前两秒的视频转为gif,并将帧率改为10fps -r修改帧率。
ffmpeg -i 1.mp4 -ss 100 -to 1000 -vf fps=0.01 pic/output_%04d.png -y :从1.mp4中按100秒1帧的速度从100秒开始到1000秒时间段内的视频片段截取图片。并放到当前已经创建好的文件夹pic中,图片名字为output_0001.png这样的形式,数字逐个累加。
ffmpeg -i 1.mp4 -ss 100 -frames 10 -vf fps=0.01 pic/output_%04d.png -y:从视频第100s开始按100秒的间隔截取10帧图片
ffmpeg -i 1.mp4 -threads 1 -ss 100 -t 100 -r 0.1  E:/video/1/output_%04d.png -y :从视频第100s开始的100s的片段中截取图片,10s取一帧。
-threads 1 表示使用一个线程处理这个事情(修改数量效率几乎没有提升)。
ffmpeg -i test.mp4 -ss 10 -t 4 -r 1 -f image2 image-%3.jpeg:从视频中提取jpeg图片。
ffmpeg -framerate 3 -i 1/output_%04d.png -vf "scale=320:-1:flags=lanczos" 1/output.gif -y 
-framerate 3:设置GIF的帧率为3帧每秒。
-i frame%d.png:指定输入文件的名称模式,%d会被ffmpeg替换成实际的数字。
-vf "scale=320:-1:flags=lanczos":使用视频滤镜(scale)来设置GIF的宽度为320像素,高度按比例自动调整,并使用lanczos算法进行缩放。
ffmpeg -i 1/1.png -vf "scale=128:-1" 1/2.png:对图片进行缩放。 
ffplay -autoexit -loop 3 1/output.gif:循环3次播放gif图片,loop为-1时表示一直循环播放
ffmpeg -i 1/1.mp4 -vn -c:a libfdk_aac -ar 44100 -channels 2 -profile:a aac_he_v2 1/out.aac :单独从1.mp4中提取音频,并采用profile aac_he_v2进行编码。aac_he_v2压缩能比aac和aac_he_v1同质量的情况下保持更高的压缩率。
ffmpeg -i input.mp4 -aframes 100 output.aac :输出 100 帧音频
ffmpeg -i input.mp4 -vframes 100 -c copy output.mp4:输出 100 帧视频,包含了声音
ffmpeg -i input.mp4 -frames 100 -vn -c:a copy output.mp3:输出 100 帧音频
-aframes 参数用于设置 要输出的 音频帧 帧数
ffmpeg -f dshow -i audio="麦克风 (USB  Live  Camera   audio  Devi)" -t 10 -af "asetpts=N/SR/TB" E:/video/out.pcm -y :从麦克风中采集10s的音频,并重置音频的时间戳。
ffmpeg -f dshow -i audio="麦克风 (USB  Live  Camera   audio  Devi)" -t 10 -af "asetpts=PTS-STARTPTS" E:/video/out.pcm -y:与上面一样

-vsync 1:表示输入视频同步   -async 1:表示输入音频同步
-b:v 200k -maxrate 250k -bufsize 400k:表示输出视频码率200k,最大码率250k,缓存大小400k
-coder 1:表示使用cabac进行熵编码
-refs 3 -bf 5:表示编码时用到的参考帧数量为3帧,b帧连续数量最大为5帧
-flags +loop -deblock -1:-1 :表示使用去块化的滤波器,后面是它的参数
-partitions i4x4+i8x8+p8x8+b8x8:-partitions设置宏块分析,可以包含i4x4、i8x8、p8x8、b8x8,
 -me_method umh:设置运动估算算法,umh表示不均衡的六边形算法
-g 60 keyint_min 30:设置gop为60 ,最小gop为30
-qmin 0 -qmax 69 -qdiff 2:设置量化器参数,-qdiff设置q p step 设置设置的是2

ffplay -f dshow -i video="USB  Live  Camera" -vf "drawtext=text='%{pts\:hms}':x=10:y=10:fontsize=40:fontcolor=red"  捕获摄像头视频并打上时间

ffmpeg -re -i input.mp4 -c copy -f rtsp rtsp://127.0.0.1:8554/stream :用rtsp协议推流
ffmpeg -re -i input.mp4 -c copy -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/stream :用rtsp协议推流,采用tcp传输
ffmpeg -re -stream_loop -1 -i 'input.mp4' -c:v libx264 -preset slow -tune film  -b:v 2000k -maxrate 2500k -bufsize 4000k -g 60 -c:a aac -b:a 128k -f flv -rtmp_live live -rtmp_keepalive 10  'rtmp://server-address/stream-name' 将视频进行推流,
-re:用于以原始速度读取输入文件(通常是视频或音频文件)。这个参数特别在模拟实时流媒体传输或实时编码转换时有用。
-rtmp_live live :指定为直播流;
-rtmp_keepalive 10:keepalive功能避免连接中断,表示每10秒发送一个心跳包
-stream_loop -1选项可以指定循环读取视频源的次数,-1为无限循环
-preset :是h264的一个预设选项,可用于设置编码速度和质量的平衡,控制FFmpeg的编码器。
-tune :是h264的一个预选项,主要配合视频类型和视觉优化的参数,或特别的情况。如果视频的内容符合其中一个可用的调整值又或者有其中需要,则可以使用此选项,否则建议不使用(如tune grain是为高比特率的编码而设计的)
【x264】x264编码器参数配置-CSDN博客 
x264编码参数详解与最佳实践-CSDN博客

通过preset参数,我们可以非常方便地设置输出视频的速度、质量等内容,达到我们需要的效果。
-preset参数的取值范围依据编码器而不同。这里我们以视频编码器x264为例,介绍几个比较常用的-preset参数:

-preset ultrafast :编码速度非常快,但输出视频质量不高
-preset superfast :编码速度非常快,但输出视频质量比ultrafast略微高一些
-preset veryfast :编码速度比较快,输出视频质量较好
-preset faster :编码速度比较快,输出视频质量比veryfast略微差一些
-preset fast :编码速度适中,输出视频质量较好
-preset medium :编码速度适中,输出视频质量非常好,是默认值
-preset slow :编码速度较慢,但输出视频质量比medium更好
-preset slower :编码速度比slow略微慢一些,但输出视频质量更好
-preset veryslow :编码速度最慢,但输出视频质量最好

-preset参数的其他用途
-preset参数不仅可以用于控制编码速度和质量,还可以用于优化视频和音频的编码。例如,我们可以使用-preset tune选项来进行编码优化,以适应不同的情况。可以通过x264的–tune参数或ffmpeg的-x264-params参数来指定。

下面是一份x264的-tune选项列表:

film :该选项用于处理电影或其他传统镜头的视频,适用于视频的动态图像较少。缺省设置为无。
animation :该选项用于处理动画或卡通片,适用于视频的动态图像较多。缺省设置为no。
grain :该选项用于处理具有高噪声的视频。缺省设置为no。
stillimage :该选项适用于处理静止图像。缺省设置为no。
psnr :该选项用于计算视频的PSNR值。缺省设置为no。
ssim :该选项用于计算视频的SSIM值。缺省设置为no。
fastdecode: 可以快速解码的参数;
zerolatency:零延迟,牺牲视频质量减少延迟,比如视频会议
                        
原文链接:https://blog.csdn.net/lixiaowu119/article/details/136705644

-bufsize:设置缓存大小,让推流过程更平滑。
 -f flv :将mp4格式转换成flv格式,因为flv存放格式与rtmp的包格式是极为相近的,只是使用的包头不同

ffmpeg 命令行中的表达式,FFmpeg Utilities Expression-Evaluation 
ffmpeg表达式中没有命名的变量,当时可以通过st(idx, expr)设置无名变量,以及id(inx)和st(inx)来获取无名变量值。idx的范围为0~9。并不是所有的函数都可以访问变量,必须是文档中函数参数中有idx的函数才能访问变量值,比如random(idx)。就可以通过idx使用到变量值
ffplay -i test2.mp4 -vf drawtext=“fontfile=Songti.ttc:text=‘指定时间段内才能看见’:x=‘if((gte(t,5) * (lte(t,10))),w-t*50,NAN)’:fontcolor=darkorange:fontsize=30”  :指定时间段(5-10秒)显示滚定文字
“if((gte(t,5) * (lte(t,10))),w-t*50,NAN) ”:gte(t,5)等价于C++中的 "t>=5?1:0",其中的t是drawtext中的变量,表示当前时间;lte(t,10)等价于C++中的t<=10?1:0;整个表达式结构为if(x,y,z) ,等价于C++重的x?y:z,x、y、z都可以是表达式。

x264编码参数详细解释:
X264 Settings - MeWiki :http://www.chaneru.com/Roku/HLS/X264_Settings.htm 
介绍类似CABAC变成coder的详细映射关系:https://sites.google.com/site/linuxencoding/x264-ffmpeg-mapping

ffmpeg常用命令 - 风雪逆旅 - 博客园

FFmpeg 常用命令_ffmpeg改变视频帧率_wk灬丨的博客-CSDN博客

FFmpeg个人使用指南_ffmpeg force_style_jerrylin07的博客-CSDN博客

FFMPEG命令入门到提高,一篇文章就够了 - 知乎

FFmpeg Filter过滤器_ffmpeg configure_filtergraph_生椰_李点点的博客-CSDN博客

使用ffmpeg将图片拼接为视频--技术员007 ଘ(੭ˊᵕˋ)੭

ffmpeg 基本命令介绍 - 简书 
FFmpeg+SDL播放器开发实践:解析、解码、渲染全流程详解 - 知乎

FFmpeg —— 屏幕录像和录音并推流(命令行的方式) - 知乎


http://www.kler.cn/a/488733.html

相关文章:

  • Zstandard压缩算法
  • 03_Redis基本操作
  • docker-compose安装canal并利用rabbitmq同步多个mysql数据
  • Kubernetes Gateway API-5-后端协议和网关基础设置标签
  • docker 基本使用
  • mybatisX插件的使用,以及打包成配置
  • 【Uniapp-Vue3】在组件中通过props进行数据传递
  • Vue.js 组件开发:从基础到进阶
  • 蓝桥杯嵌入式速通(1)
  • Java的 BIO、NIO、AIO?分别的作用和用法
  • YCM托管YashanDB报错 /home/yashan/.yasboot/.env is not existed
  • Github 2025-01-08 C开源项目日报 Top10
  • 青少年编程与数学 02-006 前端开发框架VUE 13课题、事件处理
  • 2012mfc,自绘列表控件
  • 【Linux】Linux常见指令(上)
  • RK3588上CPU和GPU算力以及opencv resize的性能对比测试
  • RabbitMQ基础(简单易懂)
  • 协同过滤算法私人诊所系统|Java|SpringBoot|VUE|
  • 2025年01月07日Github流行趋势
  • spring task使用
  • STM32: 默认开启ADC中断
  • 记录IDEA与maven兼容版本
  • 升级 Spring Boot 3 全项目讲解 — 给项目增加聊天对话功能
  • 汽车基础软件AutoSAR自学攻略(三)-AutoSAR CP分层架构(2)
  • 如何在 Linux、MacOS 以及 Windows 中打开控制面板
  • ue5玩家角色添加武器。切换武器位置,手上武器放到背上。演示一下人体插槽和武器的连接。仅仅演示,实际项目不是这么用的