我的工作流程是:
- 使用ffmpeg,我向WOWZA App1发送RTMP流
- App1将流发送到内部第二个应用程序(App2(
- App2对hls进行代码转换和打包,是Cloudfront分发的起源
- Cloudfront为用户提供流服务。
- 用户上的播放器是基于HLS.js的
为了为不同的场景做准备,我在测试传输期间强制App2重新启动,在这种情况下,App1仍在接收来自ffmpeg的流,并试图将其发送到App2,在App2准备好后,再次建立此链接,App1继续将流发送给App2,但客户端没有视频。
- 在重新启动之前,
chunklist.m3u8
列出了许多块,直到第17个:media-u3510ez40_17.ts
- 然后,当App2重新启动chunklist.m3u8时,cloudfront发送404错误。
- 然后,当App2返回时,chunklist.m3u8会列出一个新的块列表,该列表从1开始,具有新的id:
media-u1ofkjj9w_1.ts
问题是没有视频,网络流量显示浏览器没有下载新列出的块。
chunklist.m3u8
不断添加新的区块,但浏览器没有下载任何这些。。。直到出现第18块。。。以及视频重新启动。
我尝试了很多次,问题都是一样的,在重新启动之前,最后一个区块有一个数字N
,而在重新启动之后,在到达deN+1
区块之前没有视频,但Id不同。
我不知道这个问题是在Wowza、Cloudfront还是HLS.js播放器上:/
重启前chunklist.m3u8
:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:9
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-DISCONTINUITY-SEQUENCE:0
#EXTINF:8.333,
media-u3510ez40_1.ts
#EXTINF:8.333,
media-u3510ez40_2.ts
#EXTINF:8.334,
.
.
.
media-u3510ez40_16.ts
#EXTINF:8.333,
media-u3510ez40_17.ts
chunklist.m3u8
重启后:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:17
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-DISCONTINUITY-SEQUENCE:0
#EXTINF:16.396,
media-u1ofkjj9w_1.ts
#EXTINF:8.333,
media-u1ofkjj9w_2.ts
.
.
.
media-u1ofkjj9w_16.ts
#EXTINF:8.333,
media-u1ofkjj9w_17.ts
#EXTINF:8.333,
media-u1ofkjj9w_18.ts
您需要在Wowza流媒体引擎应用程序的"添加自定义属性"部分将cupertinoCalculateChunkIDBasedOnTimecode属性设置为true。请参阅:https://www.wowza.com/docs/how-to-configure-apple-hls-packetization-cupertinostreaming
此外,请注意,在编码器向Wowza发送同步时间代码的情况下,这将有所帮助。对于不发送同步时间码的编码器,我建议实现绝对时间码,无论编码器是否发送。这将有助于应用程序在重新启动后从N+1块号恢复。
下面的页面将帮助您正确配置它。http://thewowza.guru/how-to-set-stream-timecodes-to-absolute-time/
关于会话id更改部分,当使用Wowza作为Cloudfront分发的源时,您需要启用httpOriginMode并禁用httpRandomizeMediaName以使其正常工作。下面的Wowza文档将帮助您正确设置,https://www.wowza.com/docs/how-to-configure-a-wowza-server-as-an-http-caching-origin