如何使用 FFmpeg 将一个输入文件编码为多个 HLS 流(包括主播放列表)

如何使用 FFmpeg 将一个输入文件编码为多个 HLS 流(包括主播放列表)

场景如下:

我需要对单个输入文件进行编码,假设使用 libx264 到多个 HLS 流,目标是还使用相同的 FFmpeg 片段生成 HLS 主播放列表。

从 FFmpeg 的文档中,他们描述了一种场景,该场景接受多个输入,例如 MPEG 传输流,对其中的音频和视频流进行分类,然后生成如上所述的多个 HLS 流,如下所示这里var_stream_map. 请参阅同一页上的文档。

A之前曾问过类似的问题,但用户的案例描述了FFmpeg记录的场景。

任何线索都可以,谢谢。

跟进:

我对上述查询取得了一些进展。

可以多次设置相同的输入,允许重新映射输入和动态重新编码,然后可以使用编码器将其多路复用到 HLS 中,如下所示h264_nvenc

ffmpeg -loglevel debug -threads 4 -i /home/lin/Desktop/src/sowdtow.webm \
-i /home/lin/Desktop/src/sowdtow.webm \
-map '0:v' -c:v h264_nvenc -s 1920x1080 -preset llhq -rc:v vbr_hq -pix_fmt yuv420p -profile:v main -level 4.1 -b:v 3500k -maxrate:v 4250k -bufsize:v 8400k -map '0:a' -c:a aac -ab 128k \
-map '1:v' -c:v h264_nvenc -s 1280x720 -preset llhq -rc:v vbr_hq -pix_fmt yuv420p -profile:v main -level 4.1 -b:v 2800k -maxrate:v 2996k -bufsize:v 4200k -map '1:a' -c:a aac -ab 128k \
-f hls -var_stream_map "v:0,a:0 v:1,a:1" -hls_segment_filename 'vs%v/file_%03d.ts' -hls_time 5 -master_pl_name 'mainmanifest.m3u8' /home/lin/Desktop/dest/vs%v/manifest.m3u8

但是该命令有以下异常:它输出最后一个流(-map 1:v -map:1:a)两次,完全忽略第一个和第二个流:

less mainmanifest.m3u8

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=3220800,RESOLUTION=1280x720,CODECS="avc1.4d4029,mp4a.40.2"
vs0/manifest.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=3220800,RESOLUTION=1280x720,CODECS="avc1.4d4029,mp4a.40.2"
vs1/manifest.m3u8

这可能有助于将问题缩小到 HLS 多路复用器的重映射问题。

仍在调查。上面的命令中某处有语法错误,一旦我修复了该问题,就会立即更新。

编辑:

这是由 FFmpeg 中的一个 bug 引起的:https://trac.ffmpeg.org/ticket/7073现已修复。

答案1

因此,显然,在备用流中观察到的错误 EXTINF 持续时间是由固定缺陷,见拼凑这里

假设传入视频流的帧速率为 29.97 fps,并且通过 NVENC 编码器使用固定的 GOP 大小,示例代码片段将产生三种不同的 HLS 版本,具体操作如下:

ffmpeg -loglevel debug -threads 4 -vsync 1 -i '/home/lin/Desktop/src/sowdtow.webm' \
-vf yadif -g 29.97 -r 29.97 \
-b:v:0 5250k -c:v h264_nvenc -preset llhq -rc:v vbr_hq -pix_fmt yuv420p -profile:v main -level 4.1 -strict_gop 1 -rc-lookahead 32 -no-scenecut 1 -forced-idr 1 -gpu 0 \
-b:v:1 4200k -c:v h264_nvenc -preset llhq -rc:v vbr_hq -pix_fmt yuv420p -profile:v main -level 4.1 -strict_gop 1 -rc-lookahead 32 -no-scenecut 1 -forced-idr 1 -gpu 1 \
-b:v:1 3150k -c:v h264_nvenc -preset llhq -rc:v vbr_hq -pix_fmt yuv420p -profile:v main -level 4.1 -strict_gop 1 -rc-lookahead 32 -no-scenecut 1 -forced-idr 1 -gpu 2 \
-b:a:0 256k \
-b:a:0 192k \
-b:a:0 128k \
-c:a aac -ar 48000  -map 0:v -map 0:a:0 -map 0:v -map 0:a:0 -map 0:v -map 0:a:0 \
-f hls -var_stream_map "v:0,a:0  v:1,a:1 v:2,a:2" \
-master_pl_name  master.m3u8 -t 300 -hls_time 10 -hls_init_time 4 -hls_list_size 10 -master_pl_publish_rate 10 -hls_flags delete_segments+discont_start+split_by_time  \
"/home/lin/Desktop/dest/vs%v/manifest.m3u8"

标记为已解决。

相关内容