返回首页

在 MacBook Pro M2 Max 上使用 FFmpeg

Apple 芯片上进行硬件加速的框架

Video Toolbox

VideoToolbox 是一个低级框架,可提供对硬件编码器和解码器的直接访问。它提供视频压缩和解压缩服务,以及存储在 CoreVideo 像素缓冲区中的光栅图像格式之间的转换。这些服务以会话对象(压缩、解压缩和像素传输)的形式提供。

VideoToolbox还包括一些命令行工具,例如vttool、vtenc、vtdecode等,可以在终端中使用。这些工具可以用来检查视频的属性、转码视频、将视频转换为图像序列等任务。

Audio Toolbox

AudioToolbox 是一个音频处理框架,支持音频处理的硬件加速,它提供了一系列用于音频编码、解码、转换和处理的API接口。

安装 FFmpeg

创建目录

mkdir /opt/ffmpeg && cd /opt/ffmpeg

方法一:使用 curl

curl https://evermeet.cx/ffmpeg/ffmpeg-6.0.7z | tar -xz
curl https://evermeet.cx/ffmpeg/ffprobe-6.0.7z | tar -xz
curl https://evermeet.cx/ffmpeg/ffplay-6.0.7z | tar -xz

方法二:使用 wget

wget https://evermeet.cx/ffmpeg/ffmpeg-6.0.7z -O- | tar -xz
wget https://evermeet.cx/ffmpeg/ffprobe-6.0.7z -O- | tar -xz
wget https://evermeet.cx/ffmpeg/ffplay-6.0.7z -O- | tar -xz

查看 FFmpeg 中使用硬件加速的编解码器

使用 VideoToolbox 和 AudioToolbox 的编码器

ffmpeg -hide_banner -encoders | grep -i toolbox
 V..... h264_videotoolbox    VideoToolbox H.264 Encoder (codec h264)
 V..... hevc_videotoolbox    VideoToolbox H.265 Encoder (codec hevc)
 A....D aac_at               aac (AudioToolbox) (codec aac)
 A....D alac_at              alac (AudioToolbox) (codec alac)
 A....D ilbc_at              ilbc (AudioToolbox) (codec ilbc)
 A....D pcm_alaw_at          pcm_alaw (AudioToolbox) (codec pcm_alaw)
 A....D pcm_mulaw_at         pcm_mulaw (AudioToolbox) (codec pcm_mulaw)

使用 VideoToolbox 和 AudioToolbox 的解码器

ffmpeg -hide_banner -decoders | grep -i toolbox
 A....D aac_at               aac (AudioToolbox) (codec aac)
 A....D ac3_at               ac3 (AudioToolbox) (codec ac3)
 A....D adpcm_ima_qt_at      adpcm_ima_qt (AudioToolbox) (codec adpcm_ima_qt)
 A....D alac_at              alac (AudioToolbox) (codec alac)
 A....D amr_nb_at            amr_nb (AudioToolbox) (codec amr_nb)
 A....D eac3_at              eac3 (AudioToolbox) (codec eac3)
 A....D gsm_ms_at            gsm_ms (AudioToolbox) (codec gsm_ms)
 A....D ilbc_at              ilbc (AudioToolbox) (codec ilbc)
 A....D mp1_at               mp1 (AudioToolbox) (codec mp1)
 A....D mp2_at               mp2 (AudioToolbox) (codec mp2)
 A....D mp3_at               mp3 (AudioToolbox) (codec mp3)
 A....D pcm_alaw_at          pcm_alaw (AudioToolbox) (codec pcm_alaw)
 A....D pcm_mulaw_at         pcm_mulaw (AudioToolbox) (codec pcm_mulaw)
 A....D qdm2_at              qdm2 (AudioToolbox) (codec qdm2)
 A....D qdmc_at              qdmc (AudioToolbox) (codec qdmc)

[视频] 使用 time 命令测试各种编码使用资源的详情

user(s)system(s)cputotal(s)FFmpeg 命令输入大小输出大小
430.074.401080%40.194ffmpeg -hwaccel videotoolbox -i input.mts output.mp4217M169M
390.165.081081%36.547ffmpeg -hwaccel videotoolbox -i input.mts -c:v libx264 output.mp4217M162M
3.922.1833%18.466🚀 ffmpeg -hwaccel videotoolbox -i input.mts -c:v h264_videotoolbox output.mp4217M33M
27.770.74160%17.775ffmpeg -i input.mts -c:v h264_videotoolbox output.mp4217M33M
75.580.961136%6.734ffmpeg -i input.mts -preset ultrafast output.mp4217M290M
4.002.2133%18.578ffmpeg -hwaccel videotoolbox -i input.mts -c:v h264_videotoolbox -preset ultrafast output.mp4217M33M
16.161.1764%26.750ffmpeg -hwaccel videotoolbox -i input.mts -c:v h264_videotoolbox -c:a aac_at output.mp4217M32M
3.852.2232%18.460ffmpeg -hwaccel videotoolbox -i input.mts -c:v h264_videotoolbox -c:a aac output.mp4217M33M
  • -hwaccel videotoolbox 指定比不指定好。
  • -preset 对软编码才起作用。
  • -c:a 音频使用软编码更有效。

🚀 最佳使用方法:

ffmpeg -hwaccel videotoolbox -i input.mts -c:v <硬编码: x_videotoolbox> -c:a <软编码> output.mp4

[音频]

mp3 转 wav

ffmpeg -i input.mp3 -ar 16000 -ac 1 -c:a pcm_s16le output.wav

FFmpeg 硬件加速

Intel

  • QSV(libmfx): 从 SDK 到 driver 都已开源,同时支持 Windows 和 Linux,Intel 主推方案。
  • VAAPI: Linux 开源接口,可支持 AMD/Nvidia 驱动,FFmpeg 社区比较喜欢。

Nvidia

  • NVENC/CUVID/NVDEC
  • VDPAU: 不支持 Encode,Nvidia 官方基本上不维护了。

AMD

  • AMF on Windows
  • VAAPI on Linux

OS 厂商

  • Windows: D3D9(DXVA2), D3D11
  • Android: MediaCodec, OpenMax
  • Apple: VideoToolbox

视频相关资料

I 帧、P 帧和 B 帧是视频编码中的三种基本帧类型

I 帧(Intra-coded picture)

I 帧也称为关键帧,它是一种独立编码的帧,不依赖于其他帧,包含完整的图像信息。I 帧通常在视频的开始或转场处出现,用于描述场景的静态特征或关键元素,如场景的背景、人物等。因为 I 帧包含完整的图像信息,所以它的文件大小通常比其他帧大,但是它的压缩率也相对较低,有助于提高视频质量。

P 帧(Predicted picture)

P 帧是一种参考帧,它依赖于前面的 I 帧或 P 帧。P 帧只编码图像中发生变化的部分,通过参考前面的帧预测当前帧的运动信息,并通过差分编码的方式来减小文件大小。P 帧通常用于描述场景的动态特征,如人物的动作、物体的移动等。因为 P 帧依赖于前面的帧,所以它的文件大小通常比 I 帧小,但是它的压缩率也相对较高,可能会导致一些细节的损失。

B 帧(Bi-predictive picture)

B 帧是一种双向参考帧,它既依赖于前面的 I 帧或 P 帧,也依赖于后面的 P 帧。B 帧可以在两个方向上预测运动信息,通过比较前后帧的运动信息来更加准确地编码图像信息。B 帧通常用于描述快速运动的场景,如球赛、车赛等。因为 B 帧既依赖于前面的帧又依赖于后面的帧,所以它的文件大小通常比 P 帧小,但是它的压缩率也相对较高,可能会导致更多的细节损失。

在视频编码过程中,I 帧、P 帧和 B 帧的比例对于视频质量和文件大小都有很大的影响。通常情况下,适当增加 I 帧的数量可以提高视频的质量,但会增加文件大小;适当增加 P 帧和 B 帧的数量可以减小文件大小,但可能会影响视频的细节和流畅度。

参考资料

🤖

智能问答助手

⏳ 初始化...

💡 配置和聊天记录仅保存在本地浏览器中