简介

FFmpeg 是一个功能强大的多媒体处理工具,它可以用来转码编辑流式传输音频和视频

FFmpeg 的优势:

  • 多平台支持:FFmpeg 可在多个操作系统上运行,包括 Linux、Windows、macOS 等。
  • 支持硬件加速:利用 GPU 和硬件加速器来提高音频和视频处理性能。
  • 开源和自定义功能:FFmpeg 是开源的,可以根据需要自定义和扩展功能。

以下是 FFmpeg 的一些主要功能:

  1. 音频和视频转码:转换不同格式的音频和视频文件,包括编解码格式的转换。
  2. 音频和视频剪切和合并:剪切和合并音频和视频片段,以及将多个文件合并成一个。
  3. 分辨率和帧率调整:改变视频的分辨率、帧率和比特率,以适应不同的播放设备和需求。
  4. 水印和字幕添加:在视频上添加水印、字幕和其他图形元素。
  5. 音频和视频提取:从多媒体文件中提取音频或视频流,以便进一步处理或分析。
  6. 多媒体格式封装和解封装:支持各种多媒体容器格式,如 MP4、FLV、MKV、AVI 等,以及封装和解封装多媒体数据。
  7. 音频和视频编辑:进行音频和视频编辑,包括剪切、混音、降噪、降低音频/视频质量等。
  8. 音频和视频效果处理:应用各种效果和滤镜,如模糊、锐化、色彩校正等。
  9. 音频和视频编码和解码:支持各种音频和视频编解码器,如 H.264、H.265、AAC、MP3 等。
  10. 流式传输:从摄像头、麦克风或其他输入源流式传输音频和视频数据到网络或多媒体服务器,如 RTMP、HTTP 等。
  11. 屏幕录制:录制屏幕活动并将其保存为视频文件。
  12. 流媒体处理:用于创建流媒体服务器、推流、拉流以及处理流媒体数据。

总之,FFmpeg 是一个功能强大且灵活的多媒体处理工具,适用于各种多媒体处理任务,从简单的文件格式转换到复杂的视频编辑和流媒体处理。由于其广泛的支持和活跃的开发社区,它已成为多媒体处理领域的重要工具之一。

三个命令工具

FFmpeg 项目包括以下三个主要的命令行工具:

ffmpeg:这是最常用的编辑工具,用于音频和视频转码、编辑、剪辑和处理。它支持大量的音频、视频、字幕和图像格式,并提供了各种滤镜和选项来处理媒体内容。

ffplay:这是一个简单的媒体播放器,基于 FFmpeg 的库。它可以用来预览媒体文件和流。

ffprobe:这个工具用于分析媒体文件,提供关于其内容的详细信息,例如流信息、编码、比特率、时长等。

常用基本术语

  • 音频比特率 (Bitrate):在音频编码中,比特率表示每秒用于表示声音的比特数。较高的音频比特率通常意味着更好的音质,但也需要更多的存储空间。

    比特率单位为 bps (bits per second,比特每秒) 或 kbps (kilobits per second,千比特每秒)。

  • 视频比特率:在视频编码中,比特率表示每秒用于表示视频和声音的比特数。较高的视频比特率通常意味着更高的视频质量,但也需要更多的带宽和存储空间。

  • 赫兹 (Hz):是表示声音频率振动频率的单位。它衡量了声波或振动的周期性,即每秒内发生的往复振动次数。

  • 采样率 (Sample Rate):它表示在一秒钟内对模拟信号进行采样 (采集样本) 的次数。采样频率通常以赫兹(Hz)为单位来表示。

    以下是一些常见的采样频率和它们的应用领域:

    • 44.1 kHz:这是 CD 音质标准采样频率,用于音乐录制和播放。它能够准确地捕捉人类听觉范围内的声音。
    • 48 kHz:广播、视频制作和数字音频设备常用的采样频率。
    • 96 kHz192 kHz高保真音乐录制和音频制作中使用的高采样频率。它们提供更高的音频质量,但需要更多的存储空间。
    • 8 kHz16 kHz电话通信中常用的采样频率。电话音质相对较低,所以较低的采样频率足以表示声音。
  • 位深度 (Bit Depth):也称为比特深度,是用来衡量音频或图像信号精度的参数。在音频领域,位深度表示每个音频样本的振幅级别可以用多少位的二进制数字来表示。位深度越高,样本的精度越高,能够表示的振幅级别就越多,从而提供更高的音频质量。

    以下是一些常见的位深度值和它们的含义:

    • 16 位深度:这是最常见的音频位深度,通常用于 CD 音质和音频文件。每个音频样本使用 16 个二进制位来表示,可以表示 2^16(约65,536)个不同的振幅级别。
    • 24 位深度:24 位深度用于高保真音频录制和制作,以提供更高的音频质量。每个样本使用 24 个二进制位来表示,能够表示更大的动态范围。
    • 32 位深度:32 位深度在某些音频处理应用中使用,尤其是在数字音频工作站中。它提供更高的精度,但需要更多的存储空间。
  • 声道 (Channel):声道是指音频中的声音通道或独立声音源。在音频领域,声道通常用于描述声音播放的方式,包括单声道 (Mono) 和多声道 (Stereo、立体声) 等。

    以下是一些常见的声道配置:

    • 单声道 (Mono):单声道音频包含一个声道,所有声音从同一位置播放。这是最简单的声道配置,通常用于广播、电话通信等。

    • 双声道 (Stereo):双声道音频包含两个声道,通常分别称为左声道和右声道。左声道和右声道的声音可以分别听到,用于模拟空间感和立体声效果。

    • 多声道 (Multichannel):多声道音频可以包含三个或更多声道,用于音乐制作电影制作环绕声音响系统

      常见的多声道配置包括 5.1 声道(前置三声道+中置声道+后置两声道+低音炮声道)和 7.1 声道(前置三声道+中置声道+后置四声道+低音炮声道)等。

采样率、位深度、声道数和比特率之间的关系可以用公式表示:比特率 = ∑ (每个声道的采样率 × 位深度)

∑ 表示对每个声道进行求和。

参数解释

为了方便学习,对参数进行了分类。FFmpeg 的命令参数可以根据其功能和用途进行分类。以下是一些常见的 FFmpeg 命令参数的分类:

参数描述
输入输出参数
-i input_file指定输入文件或流。
-f format指定输出文件格式。
-y覆盖已存在的输出文件。
音频和视频编解码参数
-c:v codec指定视频编解码器
-c:a codec指定音频编解码器
-b:v bitrate指定视频比特率。
-b:a bitrate指定音频比特率。
处理时长和时间参数
-t duration指定处理的持续时间。
-ss start_time指定处理的开始时间。
-to end_time指定处理的结束时间。
流选择和映射参数
-map选择特定的流进行处理。
-map_metadata复制元数据到输出文件。
分辨率和帧率参数
-s resolution指定输出分辨率。
-r frame_rate指定输出帧率。
滤镜参数
-vf filter应用视频滤镜。
-af filter应用音频滤镜。
禁用音频和视频参数
-an禁用音频流。
-vn禁用视频流。
质量参数
-q:v quality指定视频质量。
-q:a quality指定音频质量。
元数据参数
-metadata key=value添加元数据到输出文件。
其他参数
-loglevel level设置日志级别。
-fpre file设置预设文件。
-hide_banner隐藏 FFmpeg 的版本信息。

这个表格包含了一些常见的FFmpeg参数,以及它们的描述。这些参数可以根据需要组合使用,以执行各种多媒体处理任务。

这些是一些常见的 FFmpeg 命令参数的分类。完整的命令参数列表可以使用 ffmpeg -h 来查看。

元数据

现在大多数商业发布和流传的音乐文件都包含元数据(meta data)。元数据提供了关于音乐的关键信息,如:歌曲标题、艺术家、专辑、发行年份等,这对于组织、分类和播放音乐特别有用。

不同的音频格式可能有其特定的元数据标准。例如:

  • MP3 使用 ID3 标签。
  • OGG 使用 Vorbis Comment
  • FLAC 也使用 Vorbis Comment。
  • AAC/M4A 文件使用 MP4 元数据标签。

使用

元数据操作

查看
ffprobe ~/lumin.repo/yf-blog-hugo/themes/m10c/static/music/leka.mp3
Input #0, mp3, from '/Users/lumin/lumin.repo/yf-blog-hugo/themes/m10c/static/music/leka.mp3':
  Metadata:
    title           : 意大利之魂
    album           : Easy Come
    artist          : LEKA
    encoder         : Lavf58.76.100
    test            : Test
    comment         : 123123123
  Duration: 00:05:44.63, start: 0.025056, bitrate: 128 kb/s
  Stream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 128 kb/s
    Metadata:
      encoder         : Lavc58.13
  Stream #0:1: Video: png, none(pc), 90k tbr, 90k tbn (attached pic)
    Metadata:
      comment         : Cover (front)
提取音频封面
ffmpeg -i ~/lumin.repo/yf-blog-hugo/themes/m10c/static/music/leka.mp3 -an -vcodec copy cover.jpg
添加元数据

添加歌曲名和艺术家到文件中:

ffmpeg -i input.mp3 -c copy -metadata:s:v:0 title="天亮了" -metadata:s:v:0 artist="韩红" output.mp3

视频转码

假设您有一个视频文件 input.mp4,您希望将其转换为不同的视频编解码器和分辨率。以下是一个示例:

ffmpeg -i input.mp4 -c:v h264 -s 1280x720 output.mp4
  • -i input.mp4:指定输入文件。
  • -c:v h264:指定视频编解码器为 H.264。
  • -s 1280x720:指定输出分辨率为 1280x720 像素。
  • output.mp4:指定输出文件。

这个命令将 input.mp4 转码为 H.264 编码的视频,并将分辨率设置为 1280x720 像素,保存为 output.mp4

音频转码

假设您有一个音频文件 input.wav,您希望将其转换为不同的音频编解码器和比特率。以下是一个示例:

ffmpeg -i input.wav -c:a aac -b:a 192k output.mp3
  • -i input.wav:指定输入音频文件。
  • -c:a aac:指定音频编解码器为 AAC。
  • -b:a 192k:指定音频比特率为 192 Kbps。
  • output.mp3:指定输出文件。

这个命令将 input.wav 转码为AAC编码的音频,并将比特率设置为 192 Kbps,保存为 output.mp3

推流

ffmpeg 支持把流推送给流媒体服务平台,来实现流媒体播放。

ffmpeg -re -i input.mp3 -c:a copy -f flv rtmp://your-rtmp-server/app/stream