FFmpeg 音视频格式全解析:像品尝美食一样了解音视频
在pyVIdeotrans的windows预打包ffmpeg目录下已包含
ffmpeg.exe
文件,进入该文件夹,在地址栏输入cmd
回车,可执行调用ffmpeg命令
,例如ffmpeg -h
如果你当将目录添加到系统环境变量,桌面计算机右键-属性-高级系统设置-高级-环境变量-系统变量-Path-编辑-新建-浏览,找到该文件夹并加入,即可在任意位置打开cmd执行
ffmpeg命令
,包括下方示例
一、视频格式:视频界的“语言”,各有千秋
视频格式就像不同的语言,虽然都传递视频信息,但编码方式和压缩方式却千差万别。选择合适的视频格式,就像选择合适的语言交流,才能更好地表达你的想法。
MP4 (.mp4): 视频界的“普通话”,兼容性之王
特点: 应用最广泛、兼容性最好,几乎所有设备和平台都支持,是视频分享的首选格式。
编码: 常用的视频编码是 H.264 (AVC) 和 H.265 (HEVC)。 H.264 历史悠久,兼容性极佳;H.265 压缩率更高,画质更好。
FFmpeg 搭配:
编码成 MP4 (H.264): 将其他格式的视频转换为 H.264 编码的 MP4。
bashffmpeg -i input.avi -c:v libx264 output.mp4
编码成 MP4 (H.265): 将其他格式的视频转换为 H.265 编码的 MP4。
bashffmpeg -i input.avi -c:v libx265 output.mp4
-c:v
:指定视频编码器。libx264
是 H.264 编码器,libx265
是 H.265 编码器。-preset slow
:控制编码速度和质量。slow
在保证质量的前提下平衡速度。 你还可以选择ultrafast
(速度最快,质量差) 到veryslow
(速度最慢,质量最好) 等选项。 一般来说,medium
和slow
是比较常用的选择。-crf 23
:控制视频的质量。 值越小质量越好,但文件体积越大。 通常在 18-28 之间调整。 这个参数在使用 libx264 和 libx265 编码时非常重要,可以帮助你平衡质量和体积。
适合场景: 网络视频、移动设备、通用存储。 几乎所有需要用到视频的场景都可以选择 MP4 格式。
AVI (.avi): 老牌“方言”,历史悠久
特点: 历史悠久,但压缩效率较低,文件体积较大。 就像老式相机拍出的照片,虽然经典,但不够清晰。
编码: 可以包含多种视频编码,如 DivX、Xvid 等。 AVI 格式就像一个容器,可以装载不同的编码。
FFmpeg 搭配:
转换成其他格式: 由于 AVI 格式压缩效率较低,通常需要转换为更现代的格式。
bashffmpeg -i input.avi -c:v libx264 output.mp4
修复 AVI 文件: 有时 AVI 文件会损坏,可以用 FFmpeg 尝试修复。
bashffmpeg -i input.avi -c copy -copyts output.avi
-c copy
:表示直接复制视频和音频流,不做重新编码,速度很快。 适用于只是容器损坏,但编码没有问题的情况。
MKV (.mkv): “万能容器”,海纳百川
特点: 可以容纳多种视频、音频、字幕轨道,就像一个“集装箱”,可以将各种元素打包在一起。
编码: 视频编码可以是 H.264、H.265 等,音频编码也可以是 AAC、MP3 等。 MKV 格式的包容性很强,几乎可以支持所有常见的编码。
FFmpeg 搭配:
提取 MKV 中的视频/音频: 从 MKV 格式中提取出视频或音频流。
bashffmpeg -i input.mkv -c:v copy -an video.mp4 # 提取视频 ffmpeg -i input.mkv -c:a copy -vn audio.aac # 提取音频
-an
:表示去除音频。-vn
:表示去除视频。
合并视频和音频到 MKV: 将视频和音频合并成一个 MKV 文件。
bashffmpeg -i video.mp4 -i audio.aac -c copy output.mkv
MOV (.mov): 苹果的“方言”,高品质之选
特点: 苹果公司开发的格式,常用在 QuickTime 播放器和 macOS 系统中,通常具有较高的视频质量。
编码: 常用的视频编码是 H.264。
FFmpeg 搭配:
与其他格式互相转换: 与 MP4 类似,可以方便地转换为其他格式。
bashffmpeg -i input.mov -c:v libx264 output.mp4
WebM (.webm): 互联网的“方言”,开源免费
特点: 开源、免费,专为网络视频设计,适合 HTML5 网页播放,无需安装插件即可播放。
编码: 常用的视频编码是 VP8、VP9。 VP9 压缩率更高,是 WebM 的推荐编码。
FFmpeg 搭配:
编码成 WebM (VP9): 将其他格式的视频转换为 VP9 编码的 WebM 格式。
bashffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 output.webm
-b:v 0
:使用基于质量的 VBR 编码。 这种编码方式可以根据视频内容的复杂程度自动调整比特率,从而在保证质量的前提下尽量减小文件体积。-crf
参数也适用于这种编码方式。
二、音频格式:让你的耳朵享受“不同风味”,选择最动听的声音
音频格式决定了声音的质量、文件大小和兼容性。 就像选择不同的音响设备,不同的音频格式能带给你不同的听觉体验。
MP3 (.mp3): 音频界的“普通话”,随处可听
特点: 压缩率高,体积小,兼容性好,几乎所有设备都支持。 但会损失一些音质,就像经过压缩的照片,细节会丢失。
FFmpeg 搭配:
编码成 MP3: 将其他格式的音频转换为 MP3 格式。
bashffmpeg -i input.wav -c:a libmp3lame -q:a 4 output.mp3
-c:a
:指定音频编码器。libmp3lame
是常用的 MP3 编码器。-q:a
:指定音频质量,值越小质量越高 (0-9)。 这个参数控制 MP3 的压缩程度,值越小,压缩率越低,音质越好,但文件体积也越大。
AAC (.aac): MP3 的升级版,音质更好
特点: 比 MP3 音质更好,压缩率更高,是 MP4 视频的常用音频编码。 就像高清照片,细节更丰富,色彩更鲜艳。
FFmpeg 搭配:
编码成 AAC: 将其他格式的音频转换为 AAC 格式。
bashffmpeg -i input.wav -c:a aac -b:a 128k output.aac
-b:a
:指定音频比特率 (bitrate),128k 是一个常见的选择。 比特率越高,音质越好,文件体积也越大。
WAV (.wav): “原汁原味”,音质至上
特点: 无损格式,保留了所有音频信息,音质最好,但文件体积大。 就像未经任何处理的原始照片,保留了所有细节,但体积也最大。
FFmpeg 搭配:
与其他格式互相转换: WAV 格式通常作为高质量的原始音频,用于转换为其他格式。
bashffmpeg -i input.mp3 output.wav
FLAC (.flac): 无损压缩的“高手”,体积与质量兼顾
特点: 无损压缩格式,既能保证音质,又能减少文件体积,是音乐发烧友的首选。 就像经过无损压缩的照片,既保留了所有细节,又减小了文件体积。
FFmpeg 搭配:
编码成 FLAC: 将其他格式的音频转换为 FLAC 格式。
bashffmpeg -i input.wav -c:a flac output.flac
OGG (.ogg): 开源的“新秀”,网络流媒体的理想选择
特点: 开源、免费,音质好,适合网络流媒体,无需授权即可使用。 就像开源软件,免费且功能强大。常用的音频编码是 Vorbis。
FFmpeg 搭配:
编码成 OGG (Vorbis): 将其他格式的音频转换为 OGG 格式,并使用 Vorbis 编码。
bashffmpeg -i input.wav -c:a libvorbis -q:a 5 output.ogg
三、FFmpeg 常用参数:化繁为简,掌握音视频处理的核心
FFmpeg 的强大之处在于它的灵活性,可以通过各种参数来控制音视频处理过程。 掌握这些参数,你就能像一位技艺精湛的厨师,烹饪出各种美味的音视频佳肴。
-i input.xxx
:指定输入文件。input.xxx
是你要处理的音视频文件的路径。output.xxx
:指定输出文件。output.xxx
是 FFmpeg 处理后生成的文件路径。-c:v
:指定视频编码器。 例如libx264
、libx265
、libvpx-vp9
等。 选择合适的编码器,可以控制视频的压缩效率和兼容性。-c:a
:指定音频编码器。 例如libmp3lame
、aac
、libvorbis
等。 选择合适的音频编码器,可以控制音频的质量和文件大小。-b:v
:指定视频比特率。 例如2000k
(2000kbps)、5M
(5Mbps) 等。 比特率越高,视频质量越好,文件体积也越大。-b:a
:指定音频比特率。 例如128k
(128kbps)、192k
(192kbps) 等。 比特率越高,音频质量越好,文件体积也越大。-r
:指定帧率 (frames per second)。 控制视频的流畅度。 一般来说,电影的帧率为 24fps,电视节目的帧率为 30fps。-s
:指定分辨率。 例如1280x720
(720p)、640x480
(480p) 等。 分辨率越高,视频画面越清晰。-ss
:指定开始时间。 例如00:00:10
表示从第 10 秒开始处理。 可以用于截取视频片段。-t
:指定持续时间。 例如00:00:05
表示持续 5 秒。 可以用于截取视频片段。-vn
:禁用视频。 只处理音频,不处理视频。-an
:禁用音频。 只处理视频,不处理音频。-filter:v
:添加视频滤镜。 例如scale=640:480
改变分辨率。 FFmpeg 提供了丰富的滤镜,可以对视频进行各种处理。-filter:a
:添加音频滤镜。 可以对音频进行各种处理,例如调整音量、降噪等。-threads
:指定线程数,提升编码速度。 多线程可以充分利用 CPU 的性能,加快编码速度。
四、-c copy
:复制流的魔法,快如闪电
-c copy
: 表示直接复制原始的视频或音频流,不做任何重新编码。 就像复制文件一样,速度非常快,而且不会损失质量。 但使用-c copy
必须满足特定的条件。
什么情况下可以使用 -c copy
? 就像玩拼图游戏,只有拼图的形状和大小都匹配,才能顺利完成。
-c copy
的核心在于“复制”,所以只有在输入和输出格式兼容,且你不需要改变编码方式时才能使用。 具体来说:
容器格式的改变,但内部编码不变: 就像换一个包装盒,但里面的东西还是一样。
例如:从
input.mp4
提取视频流到output.mkv
,如果input.mp4
中的视频编码已经是 H.264,而你只是想把 H.264 的视频放到 MKV 容器里,就可以用-c copy
。比如:把 MP4 文件转为 ts 文件,只是改变封装格式
bashffmpeg -i input.mp4 -c copy output.ts
提取视频或音频流: 就像从一个大蛋糕里切下一块,只是取出一部分,不需要改变它的形状。
从一个视频文件中提取音频,且音频编码不需要改变 (例如都是 AAC)。
例如:从
input.mkv
中提取 H.264 编码的视频到output.mp4
,且output.mp4
的容器格式也能很好地支持 H.264 编码。bashffmpeg -i input.mkv -c:v copy -an output.mp4 # 提取视频 ffmpeg -i input.mkv -c:a copy -vn output.aac # 提取音频
修复文件: 就像修复破损的包装盒,里面的东西没有损坏,只需要重新包装一下。 (有些情况下,文件损坏只是容器层面的问题)
bashffmpeg -i input.avi -c copy -copyts output.avi
-copyts
可以复制时间戳,有助于修复一些时间轴错乱的问题。 时间戳就像视频的 “日记”,记录了每一帧的播放时间。
哪些情况下不能使用 -c copy
? 就像试图把正方形的积木塞进圆形的孔里,无论如何都塞不进去。
需要改变编码方式: 就像需要把一种语言翻译成另一种语言,必须进行转换。
- 例如:把 H.264 编码的视频转换为 H.265 编码。
- 把 MP3 音频转换为 AAC 音频。
改变分辨率、帧率等参数: 就像需要把一张照片放大或缩小,必须进行重新处理。
- 只要涉及到视频或音频内容的修改,就不能用
-c copy
,需要指定相应的编码器和参数。
- 只要涉及到视频或音频内容的修改,就不能用
输入和输出格式不兼容: 就像需要把不同类型的插头插在一起,必须使用转换器。
- 虽然比较少见,但有些格式可能无法直接互相复制流数据。
-c copy
的常见使用组合:
视频:
MP4
<->MOV
(如果都是 H.264 编码) 就像使用同一种语言,可以自由交流。MKV
<->MP4/MOV/AVI
(提取/封装,编码不变) 就像把不同的东西装进/取出同一个集装箱。TS
(MPEG Transport Stream) <->MP4/MKV
(编码不变,常用于直播流处理) TS 格式常用于直播,可以方便地转换为其他格式。
音频:
AAC
<->MP4/MOV/MKV
(提取/封装)MP3
<->MP4/MOV/MKV
(提取/封装)WAV
->WAV
(修复)
举例说明:
正确使用
-c copy
:bash# 提取 MKV 中的 H.264 视频到 MP4 ffmpeg -i input.mkv -c:v copy -an output.mp4 # 将 AAC 音频封装到 MP4 容器中 ffmpeg -i input.aac -vn -c:a copy output.mp4
错误使用
-c copy
:bash# 错误! 试图把 H.264 转换为 H.265,不能用 copy ffmpeg -i input.mp4 -c:v libx265 output.mp4 -c copy #错误,不应该添加-c copy
五、实战演练:几个常见的 FFmpeg 任务,让你的音视频处理能力更上一层楼
视频格式转换: 将视频从一种格式转换为另一种格式,就像翻译语言,让更多人能够理解。
bashffmpeg -i input.mov -c:v libx264 -c:a aac output.mp4
视频裁剪: 截取视频的精彩片段,就像剪辑电影,突出最精彩的部分。
bashffmpeg -i input.mp4 -ss 00:00:10 -t 00:00:05 -c copy output.mp4
提取音频: 从视频中提取音频,就像从歌曲中提取伴奏,方便你进行二次创作。
bashffmpeg -i input.mp4 -vn -c:a copy output.aac
合并视频和音频: 将视频和音频合并成一个文件,就像把菜和饭混合在一起,方便食用。
bashffmpeg -i video.mp4 -i audio.aac -c copy output.mkv
调整视频分辨率: 改变视频画面的大小,就像调整照片的尺寸,适应不同的设备和平台。
bashffmpeg -i input.mp4 -vf scale=640:480 output.mp4
-vf
等同于-filter:v