如何使用DISCONTINUITY标签将HLS转换为RTMP

时间:2018-08-21 08:31:09

标签: ffmpeg rtmp hls

我们有生成链接的HLS文件的软件。此串联基本上只是播放列表操作。我们将清单的某些部分替换为其他部分。为了使HLS有效,我们在更改前后添加了一个#EXT-X-DISCONTINUITY标签:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:5
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:4.0000,
http://host/stream/1
#EXT-X-DISCONTINUITY
#EXTINF:4.0000,
http://host/stream/2
#EXTINF:4.0000,
http://host/stream/3
#EXTINF:4.0000,
http://host/stream/4
#EXTINF:4.0000,
http://host/stream/5
#EXTINF:4.0000,
http://host/stream/6
#EXTINF:0.2917,
http://host/stream/7
#EXT-X-DISCONTINUITY
#EXTINF:4.0000,
http://host/stream/8
#EXT-X-ENDLIST

在上面的HTML5播放器中,清单将可以正常播放。一切都同步进行,音频和视频播放。

现在,当我尝试将以上内容转换为rtmp格式并将其流式传输到rtmp端点时,它可以工作,但是它在约4秒钟后停顿,然后继续丢失4秒钟,然后运行良好。

基本上,它扮演第1部分,跳过2,然后继续进行3。

我已经检查了重复的ffmpeg日志:

[flv @ 0x7fa696837c00] Non-monotonous DTS in output stream 0:1; previous: 3924, current: 0; changing to 3924. This may result in incorrect timestamps in the output file.
[flv @ 0x7fa696837c00] Non-monotonous DTS in output stream 0:1; previous: 3924, current: 23; changing to 3924. This may result in incorrect timestamps in the output file.
[flv @ 0x7fa696837c00] Non-monotonous DTS in output stream 0:1; previous: 3924, current: 46; changing to 3924. This may result in incorrect timestamps in the output file.

在DTS警告之后,ffmpeg报告它丢弃了95帧:

frame=  102 fps= 22 q=28.0 size=     181kB time=00:00:04.34 bitrate= 341.7kbits/s dup=0 drop=95 speed=0.958x

当我用ffprobe检查时,这当然是有道理的,我可以看到PTS没有对齐(这是预期的):

frame|pkt_pts_time=5.316667|pkt_dts_time=5.316667|pict_type=B
frame|pkt_pts_time=5.358333|pkt_dts_time=5.358333|pict_type=B
frame|pkt_pts_time=5.400000|pkt_dts_time=1.400000|pict_type=P
frame|pkt_pts_time=5.441667|pkt_dts_time=1.441667|pict_type=P
frame|pkt_pts_time=1.483333|pkt_dts_time=1.483333|pict_type=I
frame|pkt_pts_time=1.525000|pkt_dts_time=1.525000|pict_type=B
frame|pkt_pts_time=1.566667|pkt_dts_time=1.566667|pict_type=B

95帧恰好是过去使用PKT_PTS_TIME(和DTS)的帧数。

我用来创建RTMP流的ffmpeg命令是:

ffmpeg -fflags +igndts -re -i http://host/manifest -c:v libx264 -force_key_frames "expr:gte(t,n_forced*2)" -c:a aac -ar 44100 -r 24 -f flv rtmp://domain/some/rtmp/endpoint

我正在寻找的是一种将HLS转换为有效RTMP的方法,而无需过去跳过带有PTS的帧。我希望它只是重新生成PTS: 有没有办法告诉ffmpeg在其输出文件中重新生成PTS / DTS时间戳?

1 个答案:

答案 0 :(得分:0)

RTMP中的不连续性没有官方支持。