首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ffmpeg --我如何以多种质量创建HLS多语言流?

Ffmpeg --我如何以多种质量创建HLS多语言流?
EN

Stack Overflow用户
提问于 2021-10-19 07:46:35
回答 1查看 1.6K关注 0票数 1

前言

我正在用多种语言将视频从4k转换成多个质量,但多语言叠加存在问题,有时质量下降,有时不同步。(这在德语音频中不是什么问题,因为这是声音而不是任何声音)

我们作为一个团队,在视频/音频+ HLS方面是一个完完全全的失败者--我是一个没有经验的前端开发人员,所以如果我的问题措辞不好很抱歉

视频

我有一个4k格式的视频和删除原来的声音,因为我有英语和德语音频文件,需要被覆盖。然后,我将这些文件合并到一个.ts文件中,如下所示:

代码语言:javascript
复制
$ 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),并使用以下命令进行尝试:

代码语言:javascript
复制
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"

这创造了所需的品质,但我现在不知道如何处理音频

音频

对于音频,我运行以下命令:

代码语言:javascript
复制
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

这将创建所需的音频段。

问题是

我意识到这是一个相当大的问题,但我们的投入有什么问题吗?有什么办法可以做到这一点更精简一点吗?

任何答案都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2021-10-19 11:02:51

让我们说你有:

VideoA

AudioB->语言1

AudioC->语言2

AudioD->语言3

虽然可以同时执行,但最好对每种语言实例使用不同的命令。

请注意,以下是图表,只有-一些值和参数将需要由您填写。但是,这提供了一个如何连接实体的方案。此外,我只是简单地设置了大小,而不是使用了刻度过滤器。您可以使用刻度过滤器代替。过滤器将取代大小参数(-s 1280x720等)。

代码语言:javascript
复制
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

以上给出了一种将VideoA与AudioB相结合的两种分辨率方案,即720 p和1080 p。要对AudioC执行相同的方案,请重复如下:

代码语言:javascript
复制
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

并相应地为每一种语言绘制地图:

代码语言:javascript
复制
-map [0:v] -map [1:a]
-map [0:v] -map [2:a]
-map [0:v] -map [3:a]
etc.

但是我觉得这样长的命令会使我的阅读、维护和修正变得困难。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69626882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档