常用FFmepg命令整理-多点整理少点搜索

926 阅读15分钟

近期频繁使用到 FFmpeg 相关命令,每次都要 google、chatGPT 搜一通,chatGPT还经常一本正经的给出错误答案,费了不少时间,干脆把经常用到的整理下,以后直接翻出来查看就行了。

主要常用到以下几方面命令

  1. 从音视频中截取一个片段
  2. 压缩音视频尺寸
  3. 从视频中移除音轨
  4. 音轨提取、分离、添加、替换相关命令
  5. 视频格式互相转换
  6. 音频格式互相转换
  7. 字幕合成与分离
  8. 录制摄像头和麦克风
  9. 录制桌面屏幕

视频主要参数涵义:

 -i 设定输入流

-f 设定输出格式    

-ss 开始时间    

-b 设定视频流量,默认为200Kbit/s    

-r 设定帧速率,默认为25    

-s 设定画面的宽与高    

-aspect 设定画面的比例    

-vn 不处理视频    

-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器,一般后面加copy表示拷贝

音频主要参数涵义:

-i 设定输入流

-f 设定输出格式    

-ss 开始时间

-ar 设定采样率    

-ac 设定声音的Channel数

-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器,一般后面加copy表示拷贝

音视频截取片段相关命令

从音频中截取一段音频

ffmpeg -i 1.mp3 -ss 00:00:00 -t 00:00:10 -acodec copy output.mp3

命令解释

-i 1.mp3: 表示从文件 1.mp3中读取源文件

-ss 00:00:00: 表示从文件开头开始寻找指定的时间段

-t 00:00:10: 则表示提取指定时间段后剩余的部分。

-acodec copy output.mp3: 指令使结果保存为新的 mp3 文件,这里不会对音频进行任何更改。

从视频中截取视频片段

ffmpeg -i 1.mp4 -ss 00:00:01 -t 00:00:10 outfile.mp4

ffmpeg -i h265.mp4 -ss 00:03 -to 00:08 -c:v libx264 _h265.mp4 
ffmpeg -ss 00:00:03 -i h264.mp4 -to 00:00:08 -c:v copy -c:a copy h264_.mp4 
ffmpeg -i ts.mp4 -ss 00:03 -to 00:08 -c:v libx264 -crf 30 ts_.mp4

命令解释

-i 1.mp4:指定要截取的视频文件。

-ss 00:00:01:跳过指定的时间点。跳到视频开始的地方即0:00:10。

-t 00:00:10:限制播放的时间间隔。只截取前10秒钟。

outfile.mp4:指定输出文件名。输出文件命名为 outfile.mp4。

该命令将会从视频1.mp4文件中截取前10秒钟的内容并将其输出成 outfile.mp4 文件,而不会对音频或编码有任何改动。

从视频提取1帧图片:

ffmpeg -i 1.mp4 -r 1 -ss 00:00:05 -t 1 image-%3d.jpg

ss 开始 往后到 -t 秒,每秒提取 -r 帧,

ffmpeg -i test.mp4 -r 1 -ss 00:00:05 -t 1 -vframes 1 image-%3d.jpg

-vframes 10:-vframes,表示截取多少帧

压缩相关

压缩视频分辨率

ffmpeg -y -i xx.mp4 -c:a copy -c:v libx264 -profile:v high -r 30 -crf 30 -s 1080x720 xx-out.mp4

命令解释

-y:强制覆盖原来的输出文件;

-i: 文件路径:指定输入视频文件;

-c:a copy:不进行任何修改,直接复制;

-c:v libx264:选择 libx264 解码器作为编解码器;

-profile:v: 设置质量编码选项,这条命令中选择 high 高质量

-r 30:指定帧率;

-crf 30:设置 CRCF (Coofficient Reduction Constant Factor) 值;

-s 1080x720:指定视频分辨率为 1080x720。

压缩wav

ffmpeg -i file.wav -flags +b:v 95.5k -r:v 24 -b:a libvorbisfile.vorbis file_result.flac

命令解释

-i:参数指示要转换的输入文件

-flags:设置为 +b:v 95.5k 表示将影片帧速率降到约为 95.5kHz,然后再对语音进行采样,最终得到的频率将会比原有的声音更加纯净。

-r:v 是一个设置影片帧速率参数,在这个例子中设置为 24,这意味着影片帧速率会减至 24kHz

-b:a 是指定将声讯编码为哪个格式,在这个例子中,设定为 libvorbisfile.vorbis 表示利用 Ogg Vorbis 标准编码。

其他压缩示例

ffmpeg -i 1.mp3 -b:a 192k audio_output.mp3 
#-b:a 降低比特率 

ffmpeg -i 1.mp4 -b:v 1000k -bufsize 1000k video_output.mp4 
#-b:v 降低视频比特率
#-crf 28 恒定质量因子,较小的crf意味着较大的码率; -r 指示帧率

移除音轨相关片段

从视频中移除第一个音轨

ffmpeg.exe -i 1.mp4 -c:v copy -an output.mp4

命令解释

-c:v copy将视频轨道复制到output.mp4

-an告诉 FFmpeg不要复制音频

删除特定的音轨

命令的一般语法 -map input_file_index:stream_type_specifier:stream_index

ffmpeg.exe -i videoWithAudio.mp4 -map 0 -map 0:a:1 -copy videoOutput.mp4

命令解释

这个命令的作用是从videoWithAudio.mp4中的音频流分离出来并在videoOutput.mp4中直接复制一份与videoWithAudio.mp4一样的视频文件。它使用了以下三个命令:

-i videoWithAudio.mp4: 指定要处理的目标视频文件名称。

-map 0: 表示从目标视频中选择第一个音视频流。

-map 0:a:1: 表示从选择的第一个音视频流中选择第1个音视频子流。

-copy videoOutput.mp4: 将选取的音视频流复制到另一个名为videoOutput.mp4的新文件中。 因为选择了第一个音视频流和第1个音视频子流,所以整个音视频流都得到了分离了。

如果希望保留原有的音视频信息的话,只需要删除--map参数即可。

音轨提取、分离、添加、替换相关命令

从视频中提取出第一个音轨为音频文件

ffmpeg -i 1.mp4 -acodec pcm_s16le -ac 1 -ar 16000 -f wav output.wav

命令解释

-i 文件路径:指定输入音频和视频文件,在此示例中是名为 1.mp4 的视频文件;

-acodec pcm_s16le:指定输出声音格式为 PCM(无压缩),采样率是 16 kHz,比特率为 16 bit;

-ac 1:仅将第 1 个声道转换为 WAV;

-ar 16000:设置输出的音频速率为 16 kHz;

-f wav:指定输出格式为 WAV 流式文件。

其他相关命令示例:

  1. ffmpeg -i 1.mp4 -ss 00:03:05 -t 00:00:45.0 -q:a 0 -map a output.mp3

提取视频指定时间段内的音频:3分零5秒开始,往后45秒,即到3分50秒结束,不指定t选项,则一直到末尾

  1. ffmpeg -i aa.mp3 -ss 00:08:06 -to 00:10:30 ab.mp3

提取音频指定时间段内的音频,-to 直接是最终时间;-acodec copy 表示音频编码格式和来源相同,就可以直接复制了

  1. ffmpeg -i 1.mp4 -vn -acodec copy onlyAudio.aac

这个代表不改变音频编码,直接提取出音频文件aac,注意:如果是mp3或者wav,需要指定编码格式

  1. ffmpeg -i 1.mp4 -vn -c:a libmp3lame -q:a 1 onlyAudio.mp3

这个代表提取为 mp3 文件,-q:a:范围从 0-6,其中 0 是高质量音频,6 是低端。

  1. ffmpeg -i 1.mp4 -vcodec copy -acodec flac output.flac提取为 flac 格式音频

将视频、音频完全独立分离出来

ffmpeg.exe -i 1.mp4 -y -vcodec copy video.mp4 -acodec copy audio.mp3

命令解释

这个命令的功能是把视频WithAudio.mp4的视频信息复制到一个新的MP4文件video.mp4中,同时将音频信息转换成MP3格式放在一个新的MP3文件audio.mp3中。

-i: 视频 1.mp4:指定输入的视频文件;

-y:强制覆盖原始文件,也就是说不创建备份文件;

-vcodec copy:指定输出视频信息码率模式;

-acodec copy:指定输出声音信息的编解码器方式。

注意这里的copy指的是无损压缩,也就是不会损失原始的信息。

在使用中添加音轨,即音视频合成

ffmpeg -i 1.mp4 -i audio.mp3 -c copy -map 0:v:0 -map 1:a:0 out.mp4

命令解释

-map 0:v:0 选择第 0 个输入文件(我们的视频输入)的第 0 个轨道。

-map 1:a:0 选择第一个输入文件(我们的音频输入)的第 0 个音轨。

-c copy 将两个音轨(音频和视频)复制到输出而无需重新编码。如果您想重新编码,您可以使用适当的音频/视频编解码器和您选择的质量设置。

-i 选项传入输入 audio.mp3 文件,指定我们要获取音频的部分。

为音频增加封面图片

ffmpeg -loop 1 -i image.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest output.mp4

替换视频中的音频

命令的一般语法是 -map input_file_index:stream_type_specifier:stream_index-map 1:a:2因此,您可以通过说因为编号从 0 开始来选择第二个输入的第三个音轨。

ffmpeg -i video_with_audio.mp4 -i newAudio.wav -map 0:0 -map 1:0 -c:v copy -c:a libmp3lame -q:a 1 -shortest video_with_newAudio.mp4

命令解释

-map 0:0 从第 1 个输入(视频)中选择第 0 个音轨

-map 1:0 从第 2 个输入(音频)中选择第 0 个音轨。

-c:v copy 视频将被复制而不是重新编码

-c:a copy 音轨将被复制而不是重新编码。

-shortest:确保在达到两个输入中较短输入的长度时停止转换

视频格式转换

*mp4 -> 1.avi

ffmpeg -i 1.mp4 -vcodec copy -acodec copy 1.avi

命令解释

-i 参数指明导入的视频文件是 1.mp4。

-vcodec copy 参数保持视频质量不变,只将其编码为无损的视频;

-acodec copy 参数保留原有音频。

avi -> mp4

ffmpeg -i 1.avi -vcodec copy -acodec copy 1.mp4

命令解释

-i 参数指向要转化为 MP4 格式的电影文件。

-vcodec copy 参数保持视频质量不变

-acodec copy 保持原先的音频。

mp4->mov

ffmpeg -i 1.mp4 -vcodec copy -acodec copy output.mov

命令解释

-i 参数指明导入的电影文件名称为 1.mp4

-vcodec copy -acodec copy 维持原始电影的质量和音频等效性,最后输出为 MOV 格式。

mov->mp4

ffmpeg -r 30 -i input.mov -o output.mp4

命令解释 -i 是指向输入的视频或音频文件的路径

-o 指定输出文件的目标位置。

-r 30 选项来设置每秒帧率为 30

mp4 -> ts

ffmpeg.exe -i in.mp4 -acodec copy -vcodec copy -f mpegts out.ts

mkv -> mp4

ffmpeg.exe -i obj.mkv -y -vcodec copy -acodec copy output.mp4

mp4 -> mkv

ffmpeg –i test.mp4 test1.mkv

avi -> mpg

ffmpeg –i test.avi test1.mpg

avi -> gif ffmpeg -ss 60 –i original_video.avi –t 20 gif_uncompressed.gif

音频格式转换

wav->mp3

ffmpeg -i wavefile.wav -an -vn -codec copy -c:-acodec copy -c :acodec libmp3lame -bitrate 64k output.mp3

命令解释

-an:删除非必要的元数据

-vn:参数去除无效的信息

-c:copy:将原始音轨复制下来

-c:-acodec copy-c :-acodec libmp3lame 选择相应的编码器

-bitrate 64k 指定每秒钟可使用的比特数,也就是每个时间段内能够产生多少位音频波形。

mp3->wav

ffmpeg -i input.mp3 -af "format=s16be" output.wav

命令解释

-i input.mp3 :指定要转换的 Mp3 文件

-af "format=s16be":将编码模式更改为双字节无损编码,从而生成高质量的 WAV 文件。

Mp3 格式是一种有损的压缩格式,在转换后可能会丢失一些信息或音质较差。如果需要最高品质的输出,可能需要先将音频转为其他无损格式,然后再将它转换回 WAV 格式。

wav->flac

ffmpeg -i "1.wav" -codec libpng -acodec libflang -profile baseline -b:a 128k -b:p 300k -acodec libvorbis -vcodec libvorbis --voicefile="1.wav.flac" "1.flac"

命令解释

-i "1.wav":指定输入文件路径为“1.wav”。

--codec libpng: 选择 Png 压缩算法作为输入文件的压缩方式。

-acodec libflang: 选择 Aac 压缩算法作为音频的数据流(Audio Stream)的压缩方式。

-profile baseline: 选择基本编解码器(Baseline Codec Profile)模式。

-b:a 128k: 调整音频压缩码率为每秒 128 Kbit,即大约每分钟640K。这会提供较高的音质和较低的大小。

-b:p 300k: 调整音频比特率为每秒 300 Kbit,即将音频压缩的比特率提高一倍,从而使大小增加两倍,但会降低一些音质。

-acodec libvorbis: 指定 Vorbis 语音编码算法。

--voicefile "1.wav.flac":指定转换后的声音文件应该放在哪,这里为"1.wav.flac"。

--vcodec libvorbis: 指定 FFmpeg 使用的 Vorbis 编码器。

最终输出是一个名为“1.flac”的新文件,其中包含了原音频文件的内容(未经压缩)以及添加了额外的声音压缩(Aac)和音效压缩(Vorbis)所产生的压缩效果。

flac->wav

ffmpeg -i input.flac -codec copy output.wav

这将生成一个新的WAV文件,并将原始FLAC文件复制到输出中,不进行任何修改

m4a -> wav

ffmpeg -i in.m4a out.wav

字幕合成与分离

添加硬字幕

ffmpeg -i 1.mp4 -vf subtitles=222.srt output_srt.mp4

硬字幕在任何地方都会显示,与播放器无关,但是subtitles= 后要直接跟字幕文件名.srt,不可有路径。 视频需要重新编码,非常慢,而且播放器无法显示或隐藏字幕,始终都会显示。

添加软字幕

ffmpeg -i 1.mp4 -i 1.srt -c copy -c:s mov_text -metadata:s:s:0 language=eng output_soft_english.mp4

软字幕需要播放器支持才能显示,可在播放器选择显示或不显示

命令解释

-i 1.mp4 是在命令行中指定的视频路径,即要加入字幕的视频文件名。

-i 1.srt 是在命令行中指定的字幕路径,即要加入字幕的 SRT 文件名。 -c copy 指定使用全量复制视频和字幕文件内容,不进行任何修改。

-c:s mov_text 指定字幕使用的格式,即采用 movidx 格式(如 .movidx)作为字幕文件的内容类型。

-metadata:s:s:0 language=eng 指定字幕语言为英语,在整个视频播放过程中始终保持字幕显示的语言。

output_soft_english.mp4 指定输出的导出的软链接名称,即将视频和字幕合并在一起。

双字幕

ffmpeg -i 1.mp4 -i 1.srt -map 0 -map 1 -c copy -c:s mov_text -metadata:s:s:1 language=chi output_soft_chinese.mp4Copy

命令解释

-map 0 选项指的是输入视频 1.mp4

-map 1 选项指的是输入字幕文件 1.srt。

能够选择英文或中文字幕。

拼接视频


ffmpeg -i part1.mp4 -i part2.mp4 -filter_complex "[0]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1[v0];[1]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1[v1];[v0][0:a:0][v1][1:a:0]concat=n=2:v=1:a=1[v][a]" -map "[v]" -map "[a]" out.mp4 


命令解释

-i: 是要添加到新 MP4 片段中的输入流的选项

-filter:v size=480x360:调整输出流的大小到 480 x 360 pixels 尺寸

-filter:a libamr:转换原始音频格式为 AMR 声音码率

-codec:a libamr:使用 AFR (Audio Frequency Reduction) 减少非关键区的声道数量

-codecs copy:复制原流内容

--output:保存新的 MP4 片段的选项

拼接wav音频

ffmpeg -i 1.wav -i 2.wav -filter_complex "[0:a][1:a]concat=n=2:v=0:a=1" o.wav

录制音视频(摄像头、麦克风、扬声器)

1. 先获取可用的视频设备名称

ffmpeg -list_devices true -f dshow -i dummy

[dshow @ 000002a51f183ec0] "Integrated Webcam" (video) [dshow @ 000002a51f183ec0] Alternative name "@device_pnp_\?\usb#vid_0c45&pid_6710&mi_00#6&904ff05&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global" [dshow @ 000002a51f183ec0] "麦克风 (Realtek Audio)" (audio) [dshow @ 000002a51f183ec0] Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{2176551A-FBC9-42F6-86BC-0382ADB17BD4}"

ffmpeg -encoders |findstr "hevc 265" 查看可用编码器

2. 摄像头、麦克风录制

录制摄像头 ffmpeg -f dshow -i video="Integrated Webcam" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency 1.mp4

录制麦克风

ffmpeg.exe -f dshow -i audio="麦克风 (Realtek Audio)" 1.wav

摄像头麦克风一起录制

ffmpeg -f dshow -i video="Integrated Webcam" -f dshow -i audio="麦克风 (Realtek Audio)" -pix_fmt yuv420p -vcodec libx264 -acodec libvo_aacenc -s 1280x720 -r 25 -q 10 -ar 44100 -ac 2 -tune zerolatency -preset ultrafast -f mpegts - | ffmpeg -f mpegts -i - -c copy -bsf:a aac_adtstoasc -f flv 1.flv 

3. 桌面录屏

要录制扬声器声音,需要安装screen-capture-recorder

安装后显示的 virtual-audio-capturer 是虚拟音频捕获设备(这个录制的不是麦克风的声音,是系统输出的声音)

安装 Screen Capturer Recorder

  • 使用ffmpeg内置gdigrab录屏和麦克风
ffmpeg.exe -f dshow -i audio="麦克风 (Realtek Audio)" -f gdigrab -i desktop  -c:v  libx264 -r 8  -b:v 0.8M -minrate 0.4M -maxrate 2M -bufsize 4M  -y  录屏.mp4

# -r 8 :指定帧率

# -b:v 0.8M -minrate 0.4M -maxrate 2M -bufsize 4M : 指定码率  
示例命令2
ffmpeg.exe -f gdigrab -i desktop -f dshow -i audio="麦克风" -vcodec libx264 -acodec libmp3lame -s 1280x720 -r 15 1.mp4
  • 录制屏幕+麦克风+文字水印 

ffmpeg -f dshow -i audio="麦克风 (Realtek Audio)" -rtbufsize 1000M -thread_queue_size 1024 -f gdigrab -i desktop -pix_fmt yuv420p -vf drawtext="fontcolor=red:fontsize=50:fontfile='msyh.ttf':text='水印文字':x=50:y=50" -y 1.mp4

  • 录制屏幕+声卡+麦克风+水印
ffmpeg 
-rtbufsize 1000M -thread_queue_size 1024 -f dshow 
-i audio="麦克风 (Realtek High Definition Audio)" -rtbufsize 1000M -thread_queue_size 1024 -f dshow 
-i audio="virtual-audio-capturer" # 扬声器声音,安装screen-capture-recorder后显示
-filter_complex amix=inputs=2:duration=first:d.r.o.pout_transition=2 -rtbufsize 1000M -thread_queue_size 1024 -f gdigrab -i desktop -pix_fmt yuv420p 
-vf drawtext="fontcolor=red:fontsize=50:fontfile='msyh.ttf':text='水印文字':x=50:y=50" 
-y 1.mp4

  • 录制桌面特定区域,无音频

ffmpeg -f gdigrab -framerate 6 -offset_x 50 -offset_y 50 -video_size 400x400 -i desktop 1.mp4

  • 录制桌面特定区域有音频

ffmpeg -f gdigrab -framerate 6 -offset_x 50 -offset_y 50 -video_size 400x400 -i desktop -f dshow -i audio="麦克风或扬声器" 1.mp4