我有一个HLS流,在Android和iOS上掉线,但在网络浏览器(flash)中运行良好。
编码器:线播专业版 5.0.3
编码器设置: 输出格式 - (视频) 闪光灯,h.264 480x270 24fps,365 kbps,每 48 个关键帧(音频) AAC 单声道 96kbps 44.1hz
流地址:http://pablogott.videocdn.scaleengine.net/pablogott-iphone/play/ooftv1/playlist.m3u8
症状:在 iOS/Android 中,首先音频丢失,视频继续播放。然后视频可能会丢失。最终情况会变得更糟。
我尝试过:我降低了编码器的比特率并升级了硬件。我已经进行了速度测试和ping测试,以验证带宽不是问题。我还验证了编码器日志,以确保我的流流畅。我还尝试了 CBR 与 VBR,结果没有变化。
我的 CDN 是规模引擎。
由于网络浏览器播放正常,因此似乎是一个不会被 Flash 播放器拾取的问题,只有 iOS 播放器才能拾取。
我注意到的唯一奇怪的是,您的媒体播放列表中仅引用了 3 个最新片段。三通常被认为是绝对下限,可能会导致某些播放器的播放行为出现问题。我建议您将媒体播放列表的大小增加到至少 10 个片段。
我的媒体播放列表,我指的是"chunklist"文件,内容如下:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:NO
#EXT-X-TARGETDURATION:12
#EXT-X-MEDIA-SEQUENCE:560
#EXTINF:10.367,
media_w958035845_560.ts
#EXTINF:10.033,
media_w958035845_561.ts
#EXTINF:10.134,
media_w958035845_562.ts
您将希望其中至少引用 10 个 .ts 文件。您应该如何实现这一点取决于您使用的打包软件 - 在这一点上我不熟悉 Wirecast 功能。
这可能无关紧要,但我还应该指出,您实际上并不是每 48 帧就有关键帧 - 检查段表明关键帧模式似乎是"自动"的,它让编码器决定并导致相当随机的关键帧距离(可能 48 被认为是最大距离?但是,这不太可能是您遇到问题的原因。
我使用各种工具从不同角度分析流,但例如,可以通过以下步骤查看关键帧的位置:
- 使用 FFmpeg
- 将片段转换为 MP4 并删除音频:FFmpeg.exe -i segment.ts -an -vcodec copy -segment.mp4
- 使用 Bento4 中的 mp4info 转储帧列表:mp4info.exe --show-layout segment.mp4
这将创建段中所有帧的列表,以及它们的大小、时间和类型。在类型为"I"的输出帧中指示关键帧。
如果这对任何人有帮助,我的设置有很多问题,但影响最大的问题与我的火线源有关。
我的所有视频都是 24fps,但由于我是通过火线摄取的,它实际上是 60 个隔行扫描帧。我在源头进行了反隔行扫描(这是 Wirecast 中的一个复选框),性能大大提高。