近期频繁使用到 FFmpeg 相关命令,每次都要 google、chatGPT 搜一通,chatGPT还经常一本正经的给出错误答案,费了不少时间,干脆把经常用到的整理下,以后直接翻出来查看就行了。
主要常用到以下几方面命令
- 从音视频中截取一个片段
- 压缩音视频尺寸
- 从视频中移除音轨
- 音轨提取、分离、添加、替换相关命令
- 视频格式互相转换
- 音频格式互相转换
- 字幕合成与分离
音视频截取片段相关命令
从音频中截取一段音频
ffmpeg -i 1.mp3 -ss 00:00:00 -t 00:00:10 -acodec copy output.mp3
命令解释
-i example.mp3
: 表示从文件example.mp3中读取源文件
-ss 00:00:10
: 表示从文件开头开始寻找指定的时间段
-t 00:00:10
: 则表示提取指定时间段后剩余的部分。
-acodec copy output.mp3
: 指令使结果保存为新的 mp3 文件,这里不会对音频进行任何更改。
从视频中截取视频片段
ffmpeg -i 222.mp4 -ss 00:00:01 -t 00:00:10 outfile.mp4
命令解释
-i video1.mp4
:指定要截取的视频文件。
-ss 00:00:01
:跳过指定的时间点。跳到视频开始的地方即0:00:10。
-t 00:00:10
:限制播放的时间间隔。只截取前10秒钟。-o outfile.mp4:指定输出文件名。输出文件命名为 outfile.mp4。
该命令将会从视频1.mp4文件中截取前10秒钟的内容并将其输出成 outfile.mp4 文件,而不会对音频或编码有任何改动。
压缩相关
压缩视频分辨率
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 标准编码。
移除音轨相关片段
从视频中移除第一个音轨
css
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
go
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 -f s16le -ac 1 -ar 16000 -f wav output.wav
命令解释
-i
文件路径:指定输入音频和视频文件,在此示例中是名为1.mp4
的视频文件;
-acodec pcm_s16le
:指定输出声音格式为 PCM(无压缩),采样率是 16 kHz,比特率为 16 bit;
-f s16le
:指定编码器模式以确保帧同步;
-ac 1
:仅将第 1 个声道转换为 WAV;
-ar 16000
:设置输出的音频速率为 16 kHz;
-f wav
:指定输出格式为 WAV 流式文件。
css
ffmpeg -i videoWithAudio.mp4 -vn -acodec copy onlyAudio.aac
这个代表不改变音频编码,直接提取出音频文件aac,注意:如果是mp3或者wav,需要指定编码格式
less
ffmpeg.exe -i videoWithAudio.mp4 -vn -c:a libmp3lame -q:a 1 onlyAudio.mp3
这个代表提取为 mp3 文件,-q:a
:范围从 0-6,其中 0 是高质量音频,6 是低端。
ffmpeg -i input.mp4 -vcodec copy -acodec flac output.flac
提取为 flac 格式音频
将视频、音频完全独立分离出来
ffmpeg.exe -i videoWithAudio.mp4 -y -vcodec copy video.mp4 -acodec copy audio.mp3
命令解释
这个命令的功能是把视频WithAudio.mp4的视频信息复制到一个新的MP4文件video.mp4中,同时将音频信息转换成MP3格式放在一个新的MP3文件audio.mp3中。
-i
: 视频WithAudio.mp4:指定输入的视频文件;
-y
:强制覆盖原始文件,也就是说不创建备份文件;
-vcodec copy
:指定输出视频信息码率模式;
-acodec copy
:指定输出声音信息的编解码器方式。注意这里的copy指的是无损压缩,也就是不会损失原始的信息。
在使用中添加音轨,即音视频合成
ffmpeg -i video.mp4 -i audio.mp3 -c copy -map 0:v:0 -map 1:a:0 videoWithAudio.mp4
命令解释
-map 0:v:0
选择第 0 个输入文件(我们的视频输入)的第 0 个轨道。
-map 1:a:0
选择第一个输入文件(我们的音频输入)的第 0 个音轨。
-c copy
将两个音轨(音频和视频)复制到输出而无需重新编码。如果您想重新编码,您可以使用适当的音频/视频编解码器和您选择的质量设置。-i 选项传入输入_audio.mp3 文件,指定我们要获取音频的部分。
替换视频中的音频
命令的一般语法 是-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
音频格式转换
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文件复制到输出中,不进行任何修改
字幕合成与分离
添加硬字幕
ini
ffmpeg -i 1.mp4 -vf subtitles=222.srt output_srt.mp4
硬字幕在任何地方都会显示,与播放器无关,但是subtitles= 后要直接跟字幕文件名.srt,不可有路径。 视频需要重新编码,非常慢,而且播放器无法显示或隐藏字幕,始终都会显示。
添加软字幕
css
ffmpeg -i sample_video_ffmpeg.mp4 -i sample_video_subtitle_ffmpeg.srt -c copy -c:s mov_text -metadata:s:s:0 language=eng output_soft_english.mp4
软字幕需要播放器支持才能显示,可在播放器选择显示或不显示
命令解释
-i sample\_video\_ffmpeg.mp4
是在命令行中指定的视频路径,即要加入字幕的视频文件名。
-i sample\_video\_subtitle\_ffmpeg.srt
是在命令行中指定的字幕路径,即要加入字幕的 SRT 文件名。-c copy
指定使用全量复制视频和字幕文件内容,不进行任何修改。
-c:s mov_text
指定字幕使用的格式,即采用 movidx 格式(如.movidx
)作为字幕文件的内容类型。
-metadata:s:s:0 language=eng
指定字幕语言为英语,在整个视频播放过程中始终保持字幕显示的语言。
output_soft_english.mp4
指定输出的导出的软链接名称,即将视频和字幕合并在一起。
双字幕
go
ffmpeg -i ouptut_soft_english.mp4 -i subtitle.chinese.srt -map 0 -map 1 -c copy -c:s mov_text -metadata:s:s:1 language=chi output_soft_chinese.mp4Copy
命令解释
-map 0
选项指的是输入视频output_soft_english.mp4
-map 1
选项指的是输入字幕文件subtitle.chinese.srt。能够选择英文或中文字幕。
拼接视频
less
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音频
css
ffmpeg -i 1.wav -i 2.wav -filter_complex "[0:a][1:a]concat=n=2:v=0:a=1" o.wav