使用 ffmpeg 将多个音轨和字幕添加到破折号清单 (mpd)
Adding multiple audio tracks and subtitles to dash manifest (mpd) with ffmpeg
我正在尝试创建一个网站来播放一些视频。对于每个视频,我将视频、音频和字幕提取到 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
我的两个视频有不同的分辨率和比特率,但效果很好。但是我没有得到任何字幕,我的两个音轨被认为是一个具有两种不同比特率的相同音轨(就像视频一样)。我想我应该有很多adaptation_sets,但我不知道如何创建它们。
如何以正确的方式创建清单?
几天后,我找到了解决方案。
我的目标是将视频转换为 mpeg-dash 内容,这对于流式传输非常有用。
我会将视频编码为 h264,将音频编码为 aac,将字幕编码为 webvtt。
这是一个很好的浏览器兼容性设置。
vp9 也很不错,但对我来说编码太长了。
所需工具:
- ffmpeg: https://www.ffmpeg.org/download.html
- mp4dash 和 mp4 片段:https://www.bento4.com/downloads/
假设我们有一个 1080p 视频文件"video.mkv",其中包含这些流:
- 0: 视频流
- 1: 音频流,语言
- 2: 音频流,英语
- 3: 字幕流,it语言
- 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 warning”选项来查看更少的信息。
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 作为播放器。我可以切换语言,字幕和视频质量自适应客户端的带宽!
我正在尝试创建一个网站来播放一些视频。对于每个视频,我将视频、音频和字幕提取到 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
我的两个视频有不同的分辨率和比特率,但效果很好。但是我没有得到任何字幕,我的两个音轨被认为是一个具有两种不同比特率的相同音轨(就像视频一样)。我想我应该有很多adaptation_sets,但我不知道如何创建它们。
如何以正确的方式创建清单?
几天后,我找到了解决方案。
我的目标是将视频转换为 mpeg-dash 内容,这对于流式传输非常有用。
我会将视频编码为 h264,将音频编码为 aac,将字幕编码为 webvtt。 这是一个很好的浏览器兼容性设置。 vp9 也很不错,但对我来说编码太长了。
所需工具:
- ffmpeg: https://www.ffmpeg.org/download.html
- mp4dash 和 mp4 片段:https://www.bento4.com/downloads/
假设我们有一个 1080p 视频文件"video.mkv",其中包含这些流:
- 0: 视频流
- 1: 音频流,语言
- 2: 音频流,英语
- 3: 字幕流,it语言
- 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 warning”选项来查看更少的信息。
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 作为播放器。我可以切换语言,字幕和视频质量自适应客户端的带宽!