本文主要介绍使用LiveChannel过程中遇到的常见问题及解决方案。
OSS livechannel推流过程
下图为OSS livechannel推流过程图解,了解推流过程后,有助于排查livechannel推流过程中遇到的问题。
更多详情请参见PutLiveChannel、PutLiveChannelStatus。
案例:录制M3u8缺失
问题分析:默认录制成品的M3u8只有最后3片,遵循了HLS协议的默认规则。
解决方案:使用PostVodPlaylist接口将指定时间范围内的ts文件汇聚到M3u8索引。
-
EndTime必须大于StartTime,且时间跨度不能大于1天。 -
OSS会查询指定时间范围内的所有指定LiveChannel推流生成的ts文件,并将其拼装为一个播放列表。
案例:录制的M3u8文件失败
问题分析:录制的M3u8文件成功推流到OSS才算录制成功。
解决方案:建议到客户端抓包查看是否有publish succees的标志,此标志表示与OSS音频包交互成功。所以出现客户端有推流记录,但是没有录制视频的情况,可以尝试抓包分析。
案例:客户端无法推流到OSS
使用ffmpeg推流不成功:
ffmpeg -re -i 0_20180525105430445.aac -acodec aac -strict -2 -f flv rtmp://xxx.oss-cn-beijing.aliyuncs.com/live/test_1000?Expires=1540458859&OSSAccessKeyId=LTAlujianb****&Signature=qwh31xQsanmao6ygCFJgo****%3D&playlistName=playlist.m3u8
解决方案:
-
使用ffmpeg推流不成功时,建议用最原始的命令推流,不添加复杂的参数。
-
推流URL中包含and符号(&)时,请使用双引号(" ")将整个URL括起来。例如,
ffmpeg -re -i 0_20180525105430445.aac -acodec aac -strict -2 -f flv "rtmp://xxx.oss-cn-beijing.aliyuncs.com/live/test_1000?Expires=1540458859&OSSAccessKeyId=LTAlujianb****&Signature=qwh31xQsanmao6ygCFJgo****%3D&playlistName=playlist.m3u8"。 -
尝试更换为OBS进行推流测试,否则无法确认是否因ffmpeg问题导致的推流失败。
如果推流后延时较长,可以在PutLiveChannel接口中调整FragDuration和FragCount参数。
案例:录制M3u8文件卡顿
当转储类型为HLS时,写入当前ts文件的音视频数据时长达到FragDuration指定的时长后,OSS会在收到下一个关键帧时切换到下一个ts文件。如果指定max(2*FragDuration, 60s)后仍未收到下一个关键帧,OSS将强制切换文件,此时可能引起播放卡顿。
案例:录制M3u8文件没有音频或视频
以下几种情况会出现音频或者视频没有录制的情况:
-
没有发送
AVC header或者AAC header,请通过抓包查看。 -
RTMP message长度小于2或者sequence header过小。 -
音频
Message超过缓冲区大小。 -
codec_ ctx是解码上下文的关键信息,如果携带的音视频数据异常,也会导致录制失败。
案例:ffmpeg推流到OSS录制没有音频
解决方案:
-
直接查看ffmpeg记录的日志,确定客户端是否已发送
aac_header。 -
在客户端进行RTMP抓包,查看客户端是否已发送
aac_header。
FFmpeg 日志中音频流显示编码为 aac (LC),编码标识符为 0x000A,确认客户端已发送 aac_header:
Stream #0:0, 0, 1/1000
: Video: h264 (High), 1 reference frame ([7][0][0][0] / 0x0007), yuv420p(progressive, left), 544x...
18 fps, 18 tbr, 1k tbn,
1k tbc
Stream #0:1, 0, 1/1000: Audio: aac (LC) ([10][0][0][0] / 0x000A), 48000 Hz, mono, fltp
Stream mapping:
(copy)
cur_dts is invalid (this is harmless if it occurs once at the start per stream)
Last message repeated 2 times