使用ffmpeg将mp4转码为m3u8切片

简介

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编码。

音频处理:提取音频轨道,改变音频格式,或者对音频进行编码和解码。

视频流处理:处理实时视频流,如直播流的录制和转码。

视频分析:分析视频内容,提取元数据,或者进行视频质量评估。

  1. 字幕和叠加:在视频上添加字幕或水印。

  2. 视频滤镜:应用各种视频滤镜和效果,如颜色校正、模糊、锐化等。

  3. 视频压缩:减少视频文件的大小,同时尽量保持视频质量。

  4. 视频服务器和播放器开发:作为后端服务或播放器应用的一部分,处理视频的上传、存储、转码和播放。

FFmpeg是一个功能强大且灵活的工具,适用于从专业视频编辑到日常多媒体处理的各种场景。随着技术的发展和社区的不断贡献,FFmpeg继续在多媒体处理领域扮演着重要的角色。

测试
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容器工具包⁠以及主机上安装的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天
    }

 

 
  • 本文由 机智猫 发表于 2024 年 10 月 31 日 22:28:11
  • 转载请务必保留本文链接:https://www.wtcat.com/49.html
  • git
  • ffmpeg

发表评论