Skip to content

FFmpeg 音视频格式详解,像美食家一样品味音视频

提示:如果你的电脑已经安装了 FFmpeg,那么可以直接在命令行中使用。如果没有安装,可以下载预编译好的 FFmpeg 工具包。 例如,在 pyVideoTrans 的 Windows 预打包 FFmpeg 目录下,已经包含了 ffmpeg.exe 文件。 你可以进入该文件夹,然后在地址栏输入 cmd 并回车,这样就可以执行 ffmpeg 命令了。 例如,输入 ffmpeg -h 可以查看 FFmpeg 的帮助信息。

此外,为了方便使用,你可以将 FFmpeg 的安装目录添加到系统环境变量中。 具体方法是:右键点击“此电脑”,选择“属性”,然后点击“高级系统设置”。 在“系统属性”窗口中,点击“环境变量”按钮。 在“系统变量”区域,找到名为 “Path” 的变量,选中它并点击“编辑”。 在弹出的窗口中,点击“新建”,然后浏览到 FFmpeg 的安装目录并添加进去。 这样,你就可以在任意位置打开 CMD 或 PowerShell 窗口,直接执行 ffmpeg 命令了,包括下面的示例。

一、视频格式:视频世界的“通用语”与“地方方言”

视频格式就像不同的语言,它们都用来传递视频信息,但编码方式和压缩方式却各有千秋。 选择合适的视频格式,就像选择合适的语言进行交流一样,能够更好地表达你的想法。

  1. MP4 (.mp4):视频界的“普通话”,兼容性之王

    • 特点: MP4 格式是目前应用最广泛、兼容性最好的视频格式,几乎所有设备和平台都支持它。 就像普通话一样,在哪里都能畅通无阻。 因此,MP4 格式是视频分享的首选格式。

    • 编码: MP4 格式常用的视频编码是 H.264 (AVC) 和 H.265 (HEVC)。 H.264 历史悠久,兼容性极佳;而 H.265 是一种更先进的编码方式,它可以在保证相同画质的前提下,将文件体积压缩得更小。

    • FFmpeg 搭配:

      • 将其他格式的视频转换为 H.264 编码的 MP4:

        bash
        ffmpeg -i input.avi -c:v libx264 output.mp4
      • 将其他格式的视频转换为 H.265 编码的 MP4:

        bash
        ffmpeg -i input.avi -c:v libx265 output.mp4
        • -c:v:这个参数用于指定视频编码器。 libx264 是 H.264 编码器,libx265 是 H.265 编码器。 FFmpeg 支持多种编码器,你可以根据需要选择合适的编码器。
        • -preset slow:这个参数用于控制编码速度和质量。 编码速度越慢,视频质量通常也越好。 slow 是一种在保证质量的前提下,兼顾速度的选择。 你还可以选择其他选项,例如 ultrafast (速度最快,但质量较差) 到 veryslow (速度最慢,但质量最好) 等。 一般来说,mediumslow 是比较常用的选择。
        • -crf 23:这个参数用于控制视频的质量。 它的取值范围通常在 18-28 之间,数值越小,视频质量越好,但文件体积也会越大。 这个参数在使用 libx264libx265 编码器时非常重要,可以帮助你平衡视频的质量和文件体积。
    • 适用场景: 网络视频、移动设备、通用存储。 几乎所有需要用到视频的场景都可以选择 MP4 格式。 无论是上传到视频网站,还是在手机上观看,MP4 格式都是一个不错的选择。

  2. AVI (.avi):老牌“方言”,历史悠久但略显过时

    • 特点: AVI 格式是一种历史悠久的视频格式,但它的压缩效率相对较低,文件体积通常比较大。 就像老式相机拍出的照片,虽然经典,但清晰度可能不如现代相机。

    • 编码: AVI 格式可以包含多种视频编码,例如 DivX、Xvid 等。 AVI 格式就像一个容器,它可以装载不同的编码方式。

    • FFmpeg 搭配:

      • 转换成其他格式: 由于 AVI 格式压缩效率较低,因此通常需要将其转换为更现代的格式,例如 MP4。

        bash
        ffmpeg -i input.avi -c:v libx264 output.mp4
      • 修复 AVI 文件: 有时 AVI 文件可能会损坏,这时可以使用 FFmpeg 尝试修复。

        bash
        ffmpeg -i input.avi -c copy -copyts output.avi
        • -c copy:这个参数表示直接复制视频和音频流,不做重新编码。 它的优点是速度非常快。 这种方式适用于只是容器损坏,但编码本身没有问题的情况。
  3. MKV (.mkv):功能强大的“万能容器”,海纳百川

    • 特点: MKV 格式是一种非常灵活的视频格式,它可以容纳多种视频、音频、字幕轨道。 就像一个功能强大的“集装箱”,可以将各种元素打包在一起。 因此,MKV 格式也被称为“万能容器”。

    • 编码: MKV 格式支持多种视频编码,例如 H.264、H.265 等;同时,它也支持多种音频编码,例如 AAC、MP3 等。 MKV 格式的包容性很强,几乎可以支持所有常见的编码方式。

    • FFmpeg 搭配:

      • 提取 MKV 文件中的视频或音频: 从 MKV 格式中提取出视频或音频流。

        bash
        ffmpeg -i input.mkv -c:v copy -an video.mp4   # 提取视频
        ffmpeg -i input.mkv -c:a copy -vn audio.aac   # 提取音频
        • -an:这个参数表示去除音频。
        • -vn:这个参数表示去除视频。
      • 将视频和音频合并到 MKV 文件中: 将视频和音频合并成一个 MKV 文件。

        bash
        ffmpeg -i video.mp4 -i audio.aac -c copy output.mkv
  4. MOV (.mov):苹果的“官方语言”,高品质之选

    • 特点: MOV 格式是苹果公司开发的视频格式,它常用在 QuickTime 播放器和 macOS 系统中。 MOV 格式通常具有较高的视频质量。 就像苹果手机一样,以精致和高品质著称。

    • 编码: MOV 格式常用的视频编码是 H.264。

    • FFmpeg 搭配:

      • 与其他格式互相转换: 与 MP4 类似,MOV 格式可以方便地转换为其他格式。

        bash
        ffmpeg -i input.mov -c:v libx264 output.mp4
  5. WebM (.webm):互联网的“通用语言”,开源免费

    • 特点: WebM 格式是一种开源、免费的视频格式,它专为网络视频而设计,适合在 HTML5 网页中播放。 使用 WebM 格式,无需安装任何插件即可在网页上播放视频。

    • 编码: WebM 格式常用的视频编码是 VP8 和 VP9。 其中,VP9 是一种压缩率更高的编码方式,因此也是 WebM 格式的推荐编码。

    • FFmpeg 搭配:

      • 将其他格式的视频转换为 VP9 编码的 WebM 格式:

        bash
        ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 output.webm
        • -b:v 0:这个参数表示使用基于质量的可变比特率 (VBR) 编码。 这种编码方式可以根据视频内容的复杂程度,自动调整比特率,从而在保证视频质量的前提下,尽量减小文件体积。 -crf 参数也适用于这种编码方式。

二、音频格式:让耳朵享受“天籁之音”,选择最适合的声音

音频格式决定了声音的质量、文件大小和兼容性。 就像选择不同的音响设备一样,不同的音频格式能够带给你不同的听觉体验。

  1. MP3 (.mp3):音频界的“普通话”,随处可听

    • 特点: MP3 格式是一种压缩率高、体积小、兼容性好的音频格式,几乎所有设备都支持它。 就像音频界的“普通话”,无论在什么设备上都能播放。 然而,MP3 格式会损失一些音质。

    • FFmpeg 搭配:

      • 将其他格式的音频转换为 MP3 格式:

        bash
        ffmpeg -i input.wav -c:a libmp3lame -q:a 4 output.mp3
        • -c:a:这个参数用于指定音频编码器。 libmp3lame 是一种常用的 MP3 编码器。
        • -q:a:这个参数用于指定音频质量,它的取值范围是 0-9。 数值越小,音频质量越高,但文件体积也会越大。 这个参数控制 MP3 的压缩程度。
  2. AAC (.aac):MP3 的升级版,音质更好,体积更小

    • 特点: AAC 格式是一种比 MP3 音质更好、压缩率更高的音频格式。 它是 MP4 视频的常用音频编码方式。 就像高清照片一样,细节更丰富,色彩更鲜艳。

    • FFmpeg 搭配:

      • 将其他格式的音频转换为 AAC 格式:

        bash
        ffmpeg -i input.wav -c:a aac -b:a 128k output.aac
        • -b:a:这个参数用于指定音频比特率 (bitrate)。 128kbps 是一个常见的选择。 比特率越高,音质越好,但文件体积也会越大。
  3. WAV (.wav):保留“原汁原味”,音质至上

    • 特点: WAV 格式是一种无损格式,它保留了所有音频信息,因此音质是最好的。 就像未经任何处理的原始照片一样,保留了所有细节,但文件体积也会最大。

    • FFmpeg 搭配:

      • 与其他格式互相转换: WAV 格式通常作为高质量的原始音频,用于转换为其他格式。

        bash
        ffmpeg -i input.mp3 output.wav
  4. FLAC (.flac):无损压缩的“高手”,体积与质量兼顾

    • 特点: FLAC 格式是一种无损压缩格式,它既能保证音质,又能减少文件体积。 因此,FLAC 格式是音乐发烧友的首选。 就像经过无损压缩的照片一样,既保留了所有细节,又减小了文件体积。

    • FFmpeg 搭配:

      • 将其他格式的音频转换为 FLAC 格式:

        bash
        ffmpeg -i input.wav -c:a flac output.flac
  5. OGG (.ogg):开源的“新秀”,网络流媒体的理想选择

    • 特点: OGG 格式是一种开源、免费的音频格式,它音质好,适合网络流媒体。 使用 OGG 格式,无需任何授权即可使用。 就像开源软件一样,免费且功能强大。 常用的 OGG 编码是 Vorbis。

    • FFmpeg 搭配:

      • 将其他格式的音频转换为 OGG 格式,并使用 Vorbis 编码:

        bash
        ffmpeg -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:指定视频编码器。 例如 libx264libx265libvpx-vp9 等。 选择合适的编码器,可以控制视频的压缩效率和兼容性。
  • -c:a:指定音频编码器。 例如 libmp3lameaaclibvorbis 等。 选择合适的音频编码器,可以控制音频的质量和文件大小。
  • -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 的核心在于 “复制”,因此只有在输入和输出格式 兼容,并且你 不需要改变编码方式 时才能使用。 具体来说:

  1. 容器格式的改变,但内部编码不变: 就像换一个包装盒,但里面的东西还是一样。

    • 例如:从 input.mp4 提取视频流到 output.mkv,如果 input.mp4 中的视频编码已经是 H.264,而你只是想把 H.264 的视频放到 MKV 容器里,就可以使用 -c copy

    • 再比如:把 MP4 文件转换为 TS 文件,这只是改变了封装格式。

      bash
      ffmpeg -i input.mp4 -c copy output.ts
  2. 提取视频或音频流: 就像从一个大蛋糕里切下一块,只是取出一部分,不需要改变它的形状。

    • 从一个视频文件中提取音频,且音频编码不需要改变 (例如都是 AAC)。

    • 例如:从 input.mkv 中提取 H.264 编码的视频到 output.mp4,且 output.mp4 的容器格式也能很好地支持 H.264 编码。

      bash
      ffmpeg -i input.mkv -c:v copy -an output.mp4   # 提取视频
      ffmpeg -i input.mkv -c:a copy -vn output.aac   # 提取音频
  3. 修复文件: 就像修复破损的包装盒,里面的东西没有损坏,只需要重新包装一下。 (有些情况下,文件损坏只是容器层面的问题)

    bash
    ffmpeg -i input.avi -c copy -copyts output.avi

    -copyts 参数可以复制时间戳,有助于修复一些时间轴错乱的问题。 时间戳就像视频的 “日记”,记录了每一帧的播放时间。

哪些情况下不能使用 -c copy? 就像试图把正方形的积木塞进圆形的孔里,无论如何都塞不进去。

  1. 需要改变编码方式: 就像需要把一种语言翻译成另一种语言,必须进行转换。

    • 例如:把 H.264 编码的视频转换为 H.265 编码。
    • 把 MP3 音频转换为 AAC 音频。
  2. 改变分辨率、帧率等参数: 就像需要把一张照片放大或缩小,必须进行重新处理。

    • 只要涉及到视频或音频内容的修改,就不能使用 -c copy,而是需要指定相应的编码器和参数。
  3. 输入和输出格式不兼容: 就像需要把不同类型的插头插在一起,必须使用转换器。

    • 虽然这种情况比较少见,但有些格式可能无法直接互相复制流数据。

-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 任务,让你的音视频处理能力更上一层楼

  1. 视频格式转换: 将视频从一种格式转换为另一种格式,就像翻译语言,让更多人能够理解。

    bash
    ffmpeg -i input.mov -c:v libx264 -c:a aac output.mp4
  2. 视频裁剪: 截取视频的精彩片段,就像剪辑电影,突出最精彩的部分。

    bash
    ffmpeg -i input.mp4 -ss 00:00:10 -t 00:00:05 -c copy output.mp4
  3. 提取音频: 从视频中提取音频,就像从歌曲中提取伴奏,方便你进行二次创作。

    bash
    ffmpeg -i input.mp4 -vn -c:a copy output.aac
  4. 合并视频和音频: 将视频和音频合并成一个文件,就像把菜和饭混合在一起,方便食用。

    bash
    ffmpeg -i video.mp4 -i audio.aac -c copy output.mkv
  5. 调整视频分辨率: 改变视频画面的大小,就像调整照片的尺寸,适应不同的设备和平台。

    bash
    ffmpeg -i input.mp4 -vf scale=640:480 output.mp4
    • -vf 等同于 -filter:v