使用ffmpeg将多个音轨和字幕添加到仪表板清单(mpd)

问题描述 投票:0回答:1

我正在尝试创建一个网站以流式传输一些视频。对于每个视频,我分别在3个不同的文件夹中提取视频,音频和字幕。一个视频有多个音轨和多个字幕。我做了很多研究,但我不知道如何在清单中添加所有这些内容。现在,我使用以下命令:

ffmpeg -f webm_dash_manifest \
-i video1.mp4 -f webm_dash_manifest \
-i video2.mp4 -f webm_dash_manifest \
-i audio1.webm -f webm_dash_manifest \
-i audio2.webm -f webm_dash_manifest \
-i subtitles.vtt \
-c copy -map 0 -map 1 -map 2 -map 3 \
-f webm_dash_manifest -adaptation_sets "id=0,streams=v id=1,streams=a" manifest.mpd

我的两个视频具有不同的分辨率和比特率,并且效果很好。但是我没有任何字幕,我的两个音轨被视为一条具有两种不同比特率的相同音轨(就像视频一样)。我认为我应该有很多adaptive_sets,但我不知道如何创建它们。

如何创建正确的清单?

ffmpeg stream manifest mpeg-dash mpd
1个回答
0
投票

几天后,我找到了解决方法。

我的目标是将视频转换为mpeg-dash内容,这对于流媒体来说确实很棒。

我将视频编码为h264,将音频编码为aac,将字幕编码为webvtt。这是与大型浏览器兼容的良好设置。vp9真的很好,但是对我来说太长了。

[所需工具:


假设我们有一个带有这些流的1080p视频文件“ video.mkv”:

  • 0:视频流
  • 1:音频流,它是语言
  • 2:音频流,英语
  • 3:字幕流,它是语言
  • 4:字幕流,英语

1。提取差异流

1.1视频

我提取视频流并将其转码为不同的分辨率和比特率:

ffmpeg -i video.mkv -an -sn -c:0 libx264 -x264opts 'keyint=24:min-keyint=24:no-scenecut' -b:v 5300k -maxrate 5300k -bufsize 2650k -vf 'scale=-1:1080' tmp/video/video-1080.mp4

ffmpeg -i video.mkv -an -sn -c:0 libx264 -x264opts 'keyint=24:min-keyint=24:no-scenecut' -b:v 2400k -maxrate 2400k -bufsize 1200k -vf 'scale=-1:720' tmp/video/video-720.mp4

ffmpeg -i video.mkv -an -sn -c:0 libx264 -x264opts 'keyint=24:min-keyint=24:no-scenecut' -b:v 600k -maxrate 600k -bufsize 300k -vf 'scale=-1:360' tmp/video/video-360.mp4

1.2音频

ffmpeg -i video.mkv -map 0:1 -ac 2 -ab 192k -vn -sn tmp/audio/audio-it.mp4

ffmpeg -i video.mkv -map 0:2 -ac 2 -ab 192k -vn -sn tmp/audio/audio-en.mp4

1.3字幕

ffmpeg -i video.mkv -map 0:3 -vn -an tmp/subtitle/subtitle-it.vtt
ffmpeg -i video.mkv -map 0:4 -vn -an tmp/subtitle/subtitle-en.vtt

您可以使用“ -loglevel警告”选项以查看较少的信息。

2。片段视频和音频

2.1视频

mp4fragment tmp/video/video-1080.mp4 tmp/video/f-video-1080.mp4
mp4fragment tmp/video/video-720.mp4 tmp/video/f-video-720.mp4
mp4fragment tmp/video/video-360.mp4 tmp/video/f-video-360.mp4

2.2音频

mp4fragment tmp/audio/audio-it.mp4 tmp/audio/f-audio-it.mp4
mp4fragment tmp/audio/audio-en.mp4 tmp/audio/f-audio-en.mp4

3。分割文件并创建破折号清单

mp4dash --mpd-name=manifest.mpd tmp/video/f-video-1080.mp4 tmp/video/f-video-720.mp4 tmp/video/f-video-360.mp4 tmp/audio/f-audio-it.mp4 tmp/audio/f-audio-en.mp4 \[+format=webvtt,+language=it\]tmp/subtitle/subtitle-it.vtt \[+format=webvtt,+language=en\]tmp/subtitle/subtitle-en.vtt

您现在可以删除tmp文件夹

rm -rf tmp

(以及您的源文件,如果您不再需要它)

您现在可以流式传输mpeg-dash内容。您必须提供文件(允许cors并启用字节范围请求)。我使用angular和rx-player作为播放器。我可以切换语言,字幕,并且视频质量可以适应客户的带宽!

Rx播放器:https://github.com/canalplus/rx-player

© www.soinside.com 2019 - 2024. All rights reserved.