使用FFMPEG为多比特率VOD创建多个格式副本后创建主播放列表

使用FFMPEG为多比特率VOD创建多个格式副本后创建主播放列表,ffmpeg,manifest,playlist,master,Ffmpeg,Manifest,Playlist,Master,我正在尝试将视频上载到服务器,将视频文件转换为3个不同分辨率的视频(即1080p、720p、480p),然后使用FFMPEG从每个分辨率中创建一个主播放列表,所有这些分辨率都在同一个命令中?这可能吗?到目前为止,我能够上传视频并创建3种不同的分辨率,但我还不能使用ffmpeg创建主清单。到目前为止,我的FFMPEG命令如下所示: ffmpeg -hide_banner -y -i beach.mkv \ -vf scale=w=640:h=360:force_original_aspect

我正在尝试将视频上载到服务器,将视频文件转换为3个不同分辨率的视频(即1080p、720p、480p),然后使用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 
此命令基于此页面中的研究


要生成主播放列表,我需要在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\u segment\u filename
更改为:

-hls_segment_filename "beach-v%v-%03d.ts" "beach-v%v.m3u8"
如果要避免放大,请将
过滤器
选项更改为:

-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"