以及如何使用

TL; TR:创建可与HLS和DASH一起播放的自适应比特率内容:https://gist.github.com/GnaphronG/ad239570c47141d89a9282913607d83f
- 节奏的Pirataria em tempos
- Plexstorm独家Streamer专访Sprig!
- AV专业人员应该获得CCENT吗?
- 家庭影院HiFi评论:PULSE 2使整个家庭音频轻而易举
- 迪士尼正在重新启动布偶(是的)和一堆其他的休眠物业,以提供新的流媒体服务
最初是平滑流传输, HTTP动态流传输(HDS)和HTTP实时流传输(HLS) ,这是解决向世界发送视频点播问题的三种方法。
前两个非常相似,它们使用清单文件来描述结构,并使用片段化的mp4文件来保存实际视频。 因此,第一个统一很容易,就创建了HTTP动态自适应流(DASH) 。 这种新格式统一了清单和MP4结构。
只保留了HLS,因为它使用了另一种视频容器MPEG传输流(MPEG-TS),但是用了很长时间。 HLS是Apple的产品,Apple是这种格式的主要推动者,但在2016年6月的WDC上,该公司宣布在新版本的HLS规范中支持分段MP4。
现在,什么都可以防止意外发生,拥有一种可以在任何地方播放的视频格式。 并且该格式是(通用媒体应用格式)CMAF。

有视频
有多种获取材料的方法,一种是自己生产,但没有人有时间。 幸运的是,好人分享了他们的工作。 让我们使用Big Buck Bunny的预告片,这个伟大的故事讲述了一个兔子必须与一群欺负的啮齿动物打交道的情况。
$ curl -LO http://mirror.cessen.com/blender.org/peach/trailer/trailer_1080p.mov
$ ffprobe -v安静-show_format -show_streams trailer_1080p.mov
[流]
索引= 0
编解码器名称= h264
codec_long_name = H.264 / AVC / MPEG-4 AVC / MPEG-4第10部分
个人资料=主要
codec_type =视频
codec_time_base = 1/50
codec_tag_string = avc1
codec_tag = 0x31637661
宽度= 1920
高度= 1080
...
比特率= 7162708
...
[/流]
[流]
索引= 1
编解码器名称= aac
codec_long_name = AAC(高级音频编码)
个人资料= LC
codec_type =音频
codec_time_base = 1/48000
codec_tag_string = mp4a
codec_tag = 0x6134706d
sample_fmt = fltp
sample_rate = 48000
频道= 6
channel_layout = 5.1
...
比特率= 428605
...
[/流]
[格式]
filename = trailer_1080p.mov
nb_streams = 2
nb_programs = 0
format_name = mov,mp4,m4a,3gp,3g2,mj2
format_long_name = QuickTime / MOV
start_time = 0.000000
持续时间= 32.995000
大小= 30874052
bit_rate = 7485752
...
[/格式]
现在,我们在MOV容器中有一个视频,有2个流:以H264编码的视频流为7Mb / s,带有5.1 AAC的音频流为400 Kb / s。
把它割下来
虽然可以对整个文件进行处理,但分别处理每个元素更容易。
$ ffprobe -v安静-print_format json -show_format -show_streams trailer_1080p.mov | \
jq -r“ .streams [] | \”-c:\(。codec_type [0:1])复制-map 0:\(。index)\(。codec_type)_ \(。index).mp4 \“” | \
xargs ffmpeg -v安静-y -i trailer_1080p.mov
现在,当前文件夹包含2个新文件video_0.mp4
和audio_1.mp4
,它们以流的类型及其在原点中的位置命名。
缩小
自适应比特率的定义意味着我们可以适应多种比特率,如果这些文件可以遵循通用媒体应用格式(CMAF)并使用DASH和HLS播放器进行播放,那就也很好。
$ ffmpeg -i video_0.mp4 \
-movflags frag_keyframe + empty_moov + default_base_moof + faststart -bf 2 -g 50 -sc_threshold 0 -an-严格实验-profile:v基线-b:v 2048k -f mp4 video_0_2048.fmp4
$ ffmpeg -i audio_1.mp4 \
-movflags frag_keyframe + empty_moov + default_base_moof + faststart -vn-严格实验-profile:v基线-c:a复制-frag_duration 2000000 -f mp4 audio_aac.fmp4
前一个命令行中的重要元素是-g 50
,它将每50帧关闭一组图片(GOP),因为原始材料的帧速率为每秒25帧(fps),这将在完整图像上提供一个同步点每2秒和-movflags frag_keyframe+empty_moov+default_base_moof+faststart
。 movflags
参数是一种神奇的方法,它们将以良好的顺序移动MP4原子以进行流传输。 输出称为片段MP4,它是一个MP4文件,其中内部结构分为多个部分。 音频文件也需要分段,这是使用-frag_duration
完成的,持续时间以微秒为单位。
放回去
一旦生成了碎片化的MP4文件,便可以使用Bento4创建HLS和DASH清单。
$ mp4dash -o输出--no-split --hls --profiles =按需* .fmp4
这将在output
文件夹中创建两个清单DASH和HLS,视频和音频文件也一起移动。
完成了
可以使用您选择的HTTP服务器公开output
目录,以允许流式传输包含的文件。
docker run --rm -v“ $ {PWD}:/ usr / share / nginx / html” -p 8080:80 nginx
可能需要添加跨域资源共享(CORS)标头https://enable-cors.org/server_nginx.html,以允许客户端访问资源。
参考文献:
- HLS:https://tools.ietf.org/html/rfc8216
- 流畅的流式传输:https://docs.microsoft.com/zh-cn/iis/media/on-demand-smooth-streaming/smooth-streaming-technical-overview
- MPEG规格:https://mpeg.chiariglione.org
- FFMPEG:https://ffmpeg.org/ffmpeg-formats.html