【问题标题】:How to loop an MPEG TS stream如何循环播放 MPEG TS 流
【发布时间】:2015-02-17 13:43:44
【问题描述】:

我正在寻找一种将 TS 文件流式传输为无限循环 http 流的方法。我试过只是连接文件,但这会导致播放损坏。

我有读取 TS 数据包标头的基本代码,但我不确定数据包与底层视频流的关系。帧是否与数据包对齐(因此我可以通过重复正确的数据包来循环它)还是我必须完全解复用/重新复用原始 TS 流才能使其工作?

托管 http 流的服务将在其中一个基于 Amlogic S802 的 Android STB 上运行,是否可以通过 Java 将这些数据通过 ffmpeg 的 Android 版本进行管道传输,或者任何解决方案都必须是纯 Java 的?

【问题讨论】:

    标签: android ffmpeg stream mpeg mpeg2-ts


    【解决方案1】:

    TS 文件包含时间戳(PTS 和 DTS),有些播放器依赖它们,有些则不依赖。

    例如,如果您从 HLS 流中获取 .ts 文件并将它们连接起来,它们通常会正常播放,因为时间戳在块中是连续的。

    在您的情况下,您可以尝试在 ffmpeg 中使用连接格式或过滤器 - https://trac.ffmpeg.org/wiki/Concatenate

    您也可以手动解析 TS 数据包,但我建议使用 libav 库的解复用器来提取视频和音频数据包。

    如果你在安卓上运行,那么你可以看看谷歌的开源播放器实现TsExtractor - https://github.com/google/ExoPlayer/blob/master/library/src/main/java/com/google/android/exoplayer/hls/parser/TsExtractor.java

    【讨论】:

    • 我花了一些时间玩 ffmpeg 生成的 HLS 序列,但不幸的是它们不会循环播放,而是在序列结束时视频停顿大约 1 秒,然后开始序列的开始。在序列的最后一个循环中(我现在只循环了几次)它一直播放到最后。我已经尝试连接由 ffmpeg 生成的单独的 ts 文件以及多次编辑 m3u8 以包含相同的文件。
    • 如果它停止了,请确保你把#EXT-X-ENDLIST放在最后,否则玩家会期待更多的数据
    • 不是这样,当我有 #EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:3 #EXT-X-MEDIA-SEQUENCE:8 out0.ts out1.ts out2 .ts out0.ts out1.ts out2.ts out0.ts out1.ts out2.ts #EXT-X-ENDLIST 它总是在 out2.ts 和 out0.ts 之间停顿
    • 哦,我明白了,我没有意识到您将 .ts 文件放入 HLS 的循环中。然后尝试把#EXT-X-DISCONTINUITY放在out0.ts之前-tools.ietf.org/html/…
    猜你喜欢
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 2018-06-28
    相关资源
    最近更新 更多