【问题标题】:Ffmpeg - How can I create HLS multiple language streams, in multiple qualities?Ffmpeg - 如何以多种质量创建 HLS 多语言流?
【发布时间】:2021-12-06 03:31:46
【问题描述】:

前言

我正在努力将视频从 4k 转换为具有多种语言的多种质量,但遇到了多种语言重叠的问题,有时质量下降,有时不同步。 (这在德语音频中不是问题,因为无论如何这是语音)

我们作为一个团队在视频/音频 + HLS 方面完全是菜鸟——我是一名前端开发人员,没有这方面的经验,如果我的问题措辞不当,敬请见谅


视频

我有 4k 格式的视频并删除了原始声音,因为我有需要叠加的英语和德语音频文件。然后我将这些文件一起放入一个 .ts 文件中,如下所示:

$ ffmpeg -i ep03-ns-4k.mp4 -i nkit-ep3-de-output.m4a -i nkit-ep3-en-output.m4a \
> -thread 0 -muxdelay 0 -y \
> -map 0:v -map 1 -map 2  -movflags +faststart -refs 1 \
> -vcodec libx264 -acodec aac -profile:v baseline -level 30 -ar 44100 -ab 64k -f mpegts out.ts 

这会输出一个 4k out.ts 视频,同时播放两个音轨。

困难的部分

这是我觉得很棘手的地方,我现在需要将此单个文件转换为多个质量级别(480、720、1080、1920),并使用以下命令进行尝试:

ffmpeg -hide_banner -y -i out.ts \
-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:v:0 \
-c:v:0 h264 -profile:v:0 main -filter:v:0 "scale=w=848:h=480:force_original_aspect_ratio=decrease" -b:v:0 1400k -maxrate:v:0 1498k -bufsize:v:0 2100k \
-c:v:1 h264 -profile:v:1 main -filter:v:1 "scale=w=1280:h=720:force_original_aspect_ratio=decrease" -b:v:1 2800k -maxrate:v:1 2996k -bufsize:v:1 4200k \
-c:v:2 h264 -profile:v:2 main -filter:v:2 "scale=w=1920:h=1080:force_original_aspect_ratio=decrease" -b:v:2 5600k -maxrate:v:2 5992k -bufsize:v:2 8400k \
-c:v:3 h264 -profile:v:3 main -filter:v:3 "scale=w=3840:h=1920:force_original_aspect_ratio=decrease" -b:v:3 11200k -maxrate:v:3 11984k -bufsize:v:3 16800k \
-var_stream_map "v:0 v:1 v:2 v:3" \
-master_pl_name master.m3u8 \
-f hls -hls_time 4 -hls_playlist_type vod -hls_list_size 0 \
-hls_segment_filename "%v/episode-%03d.ts" "%v/episode.m3u8"

这创造了所需的品质,但我现在不知道这如何与音频一起工作

音频

对于音频我运行这个命令:

ffmpeg -i out.ts -threads 0 -muxdelay 0 -y -map 0:a:0 -codec copy -f segment -segment_time 4 -segment_list_size 0 -segment_list audio-de/audio-de.m3u8 -segment_format mpegts audio-de/audio-de_%d.aac
ffmpeg -i out.ts -threads 0 -muxdelay 0 -y -map 0:a:1 -codec copy -f segment -segment_time 4 -segment_list_size 0 -segment_list audio-en/audio-en.m3u8 -segment_format mpegts audio-en/audio-en_%d.aac

这会创建所需的音频片段。

问题

我意识到这是一个相当大的问题,但是我们的输入有什么问题吗?有没有一种方法可以让这件事变得更精简?

非常感谢任何答案。

【问题讨论】:

  • 您有视频“A”和音频文件“B”、“C”、“D”等。您想要制作 A+B、A+C、A+D 等视频,并且每一个都具有多种分辨率,例如 1080p、720p、480p 等。我的理解是否正确?
  • @Rajib 这是正确的。我们正在尝试将音频添加到您的示例中的视频中。

标签: ffmpeg video-streaming http-live-streaming video-conversion


【解决方案1】:

假设你有:

视频A

AudioB-> 语言 1

AudioC-> 语言 2

AudioD-> 语言 3

虽然可以一起完成,但最好对每个语言实例使用不同的命令。

请注意,以下只是示意图- 一些值和参数需要您填写。但是,这提供了如何连接实体的方案。我也简单地设置了大小,NOT 使用了比例过滤器。您可以改用比例过滤器。过滤器将代替尺寸参数(-s 1280x720 等)。

ffmpeg -i VideoA -i AudioB -map [0:v] -map [1:a] -s 1280x720 -acodec aac -b:a 128k \
-vcodec libx264 -pix_fmt yuv420p [your other parameters go here] -movflags +faststart \
OutputAB_720p.mp4 -map [0:v] -map [1:a] -s 1920x1080 -acodec aac -b:a 128k -vcodec \
libx264 -pix_fmt yuv420p  [your other parameters go here] -movflags +faststart \
OutputAB_1080p.mp4

上面显示了 720p 和 1080p 两种分辨率的方案,将 VideoA 与 AudioB 合并。要对 AudioC 执行相同的方案,您需要重复:

ffmpeg -i VideoA -i AudioC -map [0:v] -map [1:a] -s 1280x720 -acodec aac -b:a 128k \
-vcodec libx264 -pix_fmt yuv420p [your other parameters go here] -movflags +faststart \
OutputAC_720p.mp4 -map [0:v] -map [1:a] -s 1920x1080 -acodec aac -b:a 128k -vcodec \
libx264 -pix_fmt yuv420p  [your other parameters go here] -movflags +faststart \
OutputAC_1080p.mp4

您可以将所有输入放在一起:

ffmpeg -i VideoA -i AudioB -i AudioC -i AudioD

并相应地为每种语言映射每个:

-map [0:v] -map [1:a]
-map [0:v] -map [2:a]
-map [0:v] -map [3:a]
etc.

但我觉得这么长的命令会导致难以阅读、维护和纠正。

【讨论】:

  • 嘿@Rajib,感谢您的帮助。我更多地考虑将文件拆分为 HLS 字节,以便更轻松地从我们的服务器流式传输它们。我们面临的问题是音频与视频不同步。如果 HLS .m3u8 清单只有一个与音频绑定的视频,这仍然适用吗?我认为我们必须分别拆分音频通道和不同分辨率的视频
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
  • 2016-06-20
  • 2010-10-23
相关资源
最近更新 更多