ffmpeg - 在使用 FFMPEG 为多比特率 VOD 创建多个再现后创建主播放列表
问题描述
我正在尝试将视频上传到服务器,将视频文件转换为具有不同分辨率(即 1080p、720p、480p)的 3 个不同视频,然后使用 FFMPEG 从每个分辨率中创建一个主播放列表命令?这可能吗?到目前为止,我能够上传视频并创建 3 种不同的分辨率,但我无法使用 ffmpeg 创建主清单。到目前为止,我的 FFMPEG 命令如下所示:
ffmpeg -hide_banner -y -i beach.mkv \
-vf scale=w=640:h=360:force_original_aspect_ratio=decrease -c:a aac -ar 48000 -c:v h264 -profile:v main -crf 20 -sc_threshold 0 -g 48 -keyint_min 48 -hls_time 4 -hls_playlist_type vod -b:v 800k -maxrate 856k -bufsize 1200k -b:a 96k -hls_segment_filename beach/360p_%03d.ts beach/360p.m3u8 \
-vf scale=w=842:h=480:force_original_aspect_ratio=decrease -c:a aac -ar 48000 -c:v h264 -profile:v main -crf 20 -sc_threshold 0 -g 48 -keyint_min 48 -hls_time 4 -hls_playlist_type vod -b:v 1400k -maxrate 1498k -bufsize 2100k -b:a 128k -hls_segment_filename beach/480p_%03d.ts beach/480p.m3u8 \
-vf scale=w=1280:h=720:force_original_aspect_ratio=decrease -c:a aac -ar 48000 -c:v h264 -profile:v main -crf 20 -sc_threshold 0 -g 48 -keyint_min 48 -hls_time 4 -hls_playlist_type vod -b:v 2800k -maxrate 2996k -bufsize 4200k -b:a 128k -hls_segment_filename beach/720p_%03d.ts beach/720p.m3u8
此命令基于此页面https://docs.peer5.com/guides/production-ready-hls-vod/的研究
我需要在 FFMPEG 命令中添加什么来生成主播放列表?
解决方案
对于可能遇到相同问题的任何人,这是我发现使用相同编码选项生成主播放列表的方法:
ffmpeg -hide_banner -y -i beach.mkv \
-crf 20 -sc_threshold 0 -g 48 -keyint_min 48 -ar 48000 \
-map 0:v:0 -map 0:v:0 -map 0:v:0 -map 0:a:0 -map 0:a:0 -map 0:a:0 \
-c:v:0 h264 -profile:v:0 main -filter:v:0 "scale=w=640:h=360:force_original_aspect_ratio=decrease" -b:v:0 800k -maxrate:v:0 856k -bufsize:v:0 1200k \
-c:v:1 h264 -profile:v:1 main -filter:v:1 "scale=w=842:h=480:force_original_aspect_ratio=decrease" -b:v:1 1400k -maxrate:v:1 1498k -bufsize:v:1 2100k \
-c:v:2 h264 -profile:v:2 main -filter:v:2 "scale=w=1280:h=720:force_original_aspect_ratio=decrease" -b:v:2 2800k -maxrate:v:2 2996k -bufsize:v:2 4200k \
-c:a:0 aac -b:a:0 96k \
-c:a:1 aac -b:a:1 128k \
-c:a:2 aac -b:a:2 128k \
-var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2" \
-master_pl_name beach-master.m3u8 \
-f hls -hls_time 4 -hls_playlist_type vod -hls_list_size 0 \
-hls_segment_filename "beach-v%v/beach-%03d.ts" "beach-v%v/beach.m3u8"
如果您看到错误:
Only '-vf scale=w=640:h=360:force_original_aspect_ratio=decrease' read, ignoring remaining -vf options: Use ',' to separate filters
Only '-vf scale=w=842:h=480:force_original_aspect_ratio=decrease' read, ignoring remaining -vf options: Use ',' to separate filters
Only '-vf scale=w=1280:h=720:force_original_aspect_ratio=decrease' read, ignoring remaining -vf options: Use ',' to separate filters
Only '-af (null)' read, ignoring remaining -af options: Use ',' to separate filters
根据这个相关的答案,这似乎是一个误报。
目录结构:
beach-master.m3u8
beach-v0/
├──beach.m3u8
├──beach-000.ts
├──beach-001.ts
└──...
beach-v1/
└──...
...
如果要将所有文件放在同一目录中,请更改hls_segment_filename
为:
-hls_segment_filename "beach-v%v-%03d.ts" "beach-v%v.m3u8"
如果您想避免升级,请将filter
选项更改为:
-filter:v:0 "scale=w='min(640,iw)':h='min(360,ih)':force_original_aspect_ratio=decrease"
-filter:v:1 "scale=w='min(842,iw)':h='min(480,ih)':force_original_aspect_ratio=decrease"
-filter:v:2 "scale=w='min(1280,iw)':h='min(720,ih)':force_original_aspect_ratio=decrease"
推荐阅读
- javascript - 使用 lodash 在数组内映射数组
- android - 如何从 RestAPI 的 json 编码数据创建表?
- android - 显示数据库最后一条数据,首先在listView中
- javascript - 在本地计算机上打开单词 - Office URI 方案特殊字符
- powershell - 如何从用户上次登录时间获取非活动天数?
- python - 如何调用这个需要self参数的函数
- reactjs - 使用 gh-pages 部署反应应用程序的问题
- android - phonegap 应用程序未在方向更改时更新样式
- r - R - 仅当每个组满足某些条件时才选择 ID
- ios - 如何声明继承的内置协议以便可以从另一个框架或应用程序导入?