FFmpeg是一个开源的多媒体框架,它能够处理几乎所有格式的视频和音频数据。FFmpeg由Fabrice Bellard发起,是一个自由软件项目,广泛用于视频转换、录制、流处理等多种多媒体应用。它包括了libavcodec这是一套领先的音频/视频编解码器库,以及libavformat这是一套音频/视频容器多路复用和解复用库。
优势
开源和免费:FFmpeg是完全开源的,遵循LGPL或GPL许可证,这意味着你可以自由地使用、修改和分发FFmpeg,无需支付任何费用。
跨平台:FFmpeg可以在多种操作系统上运行,包括Linux、Windows和Mac OS X,这使得它在不同平台间具有很好的兼容性。
强大的编解码支持:FFmpeg支持几乎所有的视频和音频编解码器,使得它能够处理各种格式的媒体文件。
灵活的命令行工具:FFmpeg提供了丰富的命令行工具,用户可以通过命令行参数精确控制媒体处理的各个方面。
高效的开发库:FFmpeg的库(如libavcodec、libavformat等)可以被集成到其他应用程序中,为开发者提供了强大的多媒体处理能力。
实时流处理:FFmpeg能够处理实时视频流,适用于直播和实时通信应用。
社区支持:作为一个活跃的开源项目,FFmpeg有一个庞大的社区,用户可以从中获得帮助和支持。
应用场景
视频转换:将视频文件从一种格式转换为另一种格式,比如从AVI转换到MP4。
视频剪辑:剪辑视频文件,提取或合并视频片段。
视频转码:改变视频的编码格式,比如将H.264编码的视频转换为VP9编码。
音频处理:提取音频轨道,改变音频格式,或者对音频进行编码和解码。
视频流处理:处理实时视频流,如直播流的录制和转码。
视频分析:分析视频内容,提取元数据,或者进行视频质量评估。
-
字幕和叠加:在视频上添加字幕或水印。
-
视频滤镜:应用各种视频滤镜和效果,如颜色校正、模糊、锐化等。
-
视频压缩:减少视频文件的大小,同时尽量保持视频质量。
-
视频服务器和播放器开发:作为后端服务或播放器应用的一部分,处理视频的上传、存储、转码和播放。
docker run --rm -it swr.cn-east-3.myhuaweicloud.com/cncr/ffmpeg:amd64-7.1-cli-ls5 \ -version
普通转码
docker run --rm -it \ -v $(pwd):/config \ swr.cn-east-3.myhuaweicloud.com/cncr/ffmpeg:amd64-7.1-cli-ls5 \ -i /config/2024.mp4 -c:v libx264 -preset veryfast -crf 23 -r 29.97 -threads $(nproc) \ -c:a aac -b:a 192k -ar 48000 -ac 2 -f hls -hls_list_size 0 -hls_time 10 -hls_flags delete_segments /config/2024-hk86-libx264/file.m3u8
在这个命令中,我做了以下更改:
-
添加了
-preset veryfast
以加快编码速度,同时保持合理的输出质量。 -
添加了
-crf 23
以控制输出视频的质量。
-
明确设置了音频的采样率
-ar 48000
和声道数-ac 2
,以确保音频设置正确。 -
设置了
-hls_time 10
,表示每个 HLS 分片的时长为 10 秒(您可以根据需要调整这个值)。
普通转码2
docker run --rm -it \ -v $(pwd):/config \ swr.cn-east-3.myhuaweicloud.com/cncr/ffmpeg:amd64-7.1-cli-ls5 \ -i /config/gsl.mp4 -c:v libx264 -c:a aac -strict -2 -f hls -hls_list_size 0 -hls_time 10 /config/gsl/file.m3u8
效果展示
VVC转码
docker run --rm -it \ -v $(pwd):/config \ swr.cn-east-3.myhuaweicloud.com/cncr/ffmpeg:amd64-7.1-cli-ls5 \ -i /config/2024.mp4 -c:v libvvenc -preset 1 -qp 32 -r 29.97 -threads $(nproc) -c:a aac -b:a 192k -ar 48000 -ac 2 -f hls -hls_list_size 0 -hls_time 3600 -hls_flags delete_segments+append_list /config/2024-hk86-vvc/file.m3u8
参数解释:
-
-i /config/2024.mp4
:指定输入文件。 -
-c:v libvvenc
:使用 libvvenc VVC 编码器。 -
-preset 1
:设置编码速度和质量的平衡,数值越小,编码速度越快,但质量可能略有下降。 -
-rc cbr
:使用恒定比特率(CBR)模式进行编码。 -
-b:v 1M
:设置视频比特率为 1 Mbps。 -
-r 29.97
:设置输出视频的帧率为 29.97fps。 -
-threads $(nproc)
:使用$(nproc)
命令动态获取 CPU 核心数,并将其用作线程数,以充分利用多核 CPU 资源。 -
-c:a aac
:使用 AAC 编码器进行音频编码。 -
-b:a 192k
:设置音频比特率为 192kbps。 -
-ar 48000
:设置音频采样率为 48kHz。 -
-ac 2
:设置音频通道数为 2(立体声)。 -
-f hls
:指定输出格式为 HLS。 -
-hls_list_size 0
:设置 HLS 播放列表大小为 0,意味着播放列表中将包含所有片段。 -
-hls_time 3600
:设置每个 HLS 片段的时长为 3600 秒(1 小时)。 -
-hls_flags delete_segments+append_list
:设置 HLS 标志,delete_segments
会在 HLS 播放列表达到最大列表大小时删除旧的片段,append_list
会将新的片段添加到播放列表中。
基本转码
docker run --rm -it \
-v $(pwd):/config \
swr.cn-east-3.myhuaweicloud.com/cncr/ffmpeg:amd64-7.1-cli-ls5 \
-i /config/input.mkv \
-c:v libx264 \
-b:v 4M \
-vf scale=1280:720 \
-c:a copy \
/config/output.mkv
硬件加速(VAAPI)
docker run --rm -it \
--device=/dev/dri:/dev/dri \
-v $(pwd):/config \
swr.cn-east-3.myhuaweicloud.com/cncr/ffmpeg:amd64-7.1-cli-ls5 \
-vaapi_device /dev/dri/renderD128 \
-i /config/input.mkv \
-c:v h264_vaapi \
-b:v 4M \
-vf 'format=nv12|vaapi,hwupload,scale_vaapi=w=1280:h=720' \
-c:a copy \
/config/output.mkv
硬件加速(QSV)
docker run --rm -it \
--device=/dev/dri:/dev/dri \
-v $(pwd):/config \
swr.cn-east-3.myhuaweicloud.com/cncr/ffmpeg:amd64-7.1-cli-ls5 \
-hwaccel qsv \
-c:v h264_qsv \
-i /config/input.mkv \
-c:v h264_qsv \
-global_quality 25 \
/config/output.mkv
Nvidia硬件加速
Nvidia支持需要以及主机上安装的Nvidia驱动程序
docker run --rm -it \
--runtime=nvidia \
-v $(pwd):/config \
swr.cn-east-3.myhuaweicloud.com/cncr/ffmpeg:amd64-7.1-cli-ls5 \
-hwaccel nvdec \
-i /config/input.mkv \
-c:v h264_nvenc \
-b:v 4M \
-vf scale=1280:720 \
-c:a copy \
/config/output.mkv
Vulkan支持
Vulkan支持已添加到x86_64(使用Intel和AMD iGPU测试)()。
docker run --rm -it \
--device=/dev/dri:/dev/dri \
-v $(pwd):/config \
-e ANV_VIDEO_DECODE=1 \
swr.cn-east-3.myhuaweicloud.com/cncr/ffmpeg:amd64-7.1-cli-ls5 \
-init_hw_device "vulkan=vk:0" \
-hwaccel vulkan \
-hwaccel_output_format vulkan \
-i /config/input.mkv \
-f null - -benchmark
查看支持的编码器
docker run --rm -it swr.cn-east-3.myhuaweicloud.com/cncr/ffmpeg:amd64-7.1-cli-ls5 \ ffmpeg -codecs
查看视频信息
docker run --rm -it \ -v $(pwd):/config \ swr.cn-east-3.myhuaweicloud.com/cncr/ffmpeg:amd64-7.1-cli-ls5 \ -i /config/2024.mp4
nginx配置片段
location /file { alias /data/file/; try_files $uri $uri/ =404; add_header Cache-Control "public, max-age=7776000"; # 90天转换为秒是7776000秒 expires 90d; # 直接设置expires头部为90天 }