0.FFmpeg 支持多种硬件解码命令行方式
FFmpeg 支持多种硬件解码方式,在命令行中使用硬件解码可以显著提高解码效率。以下是在不同平台上使用 FFmpeg 进行硬件解码的命令行示例:
1. NVIDIA GPU (CUDA)
```
ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc output.mp4
```
2. Intel Quick Sync Video
```
ffmpeg -hwaccel qsv -i input.mp4 -c:v h264_qsv output.mp4
```
3. AMD GPU (AMD AMF)
```
ffmpeg -hwaccel amf -i input.mp4 -c:v h264_amf output.mp4
```
4. Apple Video Toolbox (macOS)
```
ffmpeg -hwaccel videotoolbox -i input.mp4 -c:v h264_videotoolbox output.mp4
```
5. VAAPI (Video Acceleration API, 主要用于 Linux)
```
ffmpeg -hwaccel vaapi -i input.mp4 -c:v h264_vaapi output.mp4
```
6. DXVA2 (DirectX Video Acceleration, Windows)
```
ffmpeg -hwaccel dxva2 -i input.mp4 -c:v h264_dxva2 output.mp4
```
7. OpenCL
```
ffmpeg -hwaccel opencl -i input.mp4 -c:v h264 output.mp4
```
8. VDPAU (Video Decode and Presentation API for Unix, 主要用于 NVIDIA 在 Linux 上)
```
ffmpeg -hwaccel vdpau -i input.mp4 -c:v h264_vdpau output.mp4
```
注意事项:
1. 确保你的 FFmpeg 版本支持相应的硬件加速。你可以使用 `ffmpeg -hwaccels` 命令查看支持的硬件加速方法。
2. 有些平台可能需要额外的设置或驱动程序。例如,VAAPI 可能需要指定渲染设备:
```
ffmpeg -hwaccel vaapi -vaapi_device /dev/dri/renderD128 -i input.mp4 -c:v h264_vaapi output.mp4
```
3. 对于 H.265 (HEVC) 解码,只需将编码器名称中的 "h264" 替换为 "hevc",例如:
```
ffmpeg -hwaccel cuda -i input.mp4 -c:v hevc_nvenc output.mp4
```
4. 如果你只想解码而不重新编码,可以使用 `-c:v copy` 选项:
```
ffmpeg -hwaccel cuda -i input.mp4 -c:v copy output.mp4
```
5. 有时,你可能需要指定输出像素格式,例如:
```
ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc -pix_fmt yuv420p output.mp4
```
6. 对于 Android 设备,通常不直接使用 FFmpeg 命令行,而是通过 NDK 将 FFmpeg 集成到应用程序中,然后使用 MediaCodec 进行硬件解码。
7. 在使用这些命令时,请确保你的硬件和驱动程序支持相应的解码方式。
8. 有时候,硬件解码可能会导致一些质量损失或兼容性问题。如果遇到问题,可以尝试切换回软件解码。
通过这些命令,你应该能够在大多数平台上使用 FFmpeg 进行硬件加速解码。根据具体需求和硬件配置,你可能需要进一步调整这些命令。
1 一个通用的编码函数框架:
```cpp
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/hwcontext.h>
#include <libavutil/opt.h>
#include <libswscale/swscale.h>
}
#include <iostream>
#include <stdexcept>
void encode_video(const char* filename, enum AVHWDeviceType type,
int width, int height, int fps, int64_t bitrate) {
AVFormatContext *output_ctx = nullptr;
AVCodecContext *encoder_ctx = nul