【问题标题】:Android HLS- Streaming failed to fetch segmentAndroid HLS-流式传输无法获取段
【发布时间】:2015-08-27 09:30:41
【问题描述】:

我为 Android 编写了一个 Videoplayer,以通过 HLS 流式传输视频。在我的服务器上,我有 m3u8-Playlist 和 .ts-Segments。 我的代码如下所示:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    vidSurface = (SurfaceView) findViewById(R.id.surfView);
    vidHolder = vidSurface.getHolder();
    vidHolder.addCallback(this);
}


public void surfaceCreated(SurfaceHolder arg0) {
    try {
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setDisplay(vidHolder);
        mediaPlayer.setDataSource(vidAddress);
        mediaPlayer.prepareAsync();
        mediaPlayer.setOnPreparedListener(this);
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    }
    catch(Exception e){
        e.printStackTrace();
    }
}    

播放器适用于 Apple bipbopall.m3u8 示例。但是当我尝试播放我的播放列表时会出现此错误:

E/PlaylistFetcher﹕ failed to fetch .ts segment at url 'http://example.com/USSM.mp4Frag1Num0.ts'
E/LiveSession﹕ XXX Received error -1008 from PlaylistFetcher.
E/MediaPlayer﹕ error (1, -1008)

我认为文件的 AES-128 解密存在问题。 MediaPlayer是否自己解密文件,如何检查解密是否成功? (我用的是最新的安卓版本)

【问题讨论】:

  • 1008 在尝试获取文件时是 ERROR_OUT_OF_RANGE。你的播放列表是什么样的?
  • @ aergistal #EXTM3U 987654326 #EXT-X-ALLOW-CACHE:NO 987654328 #EXT-X-KEY:METHOD=AES-128,URI="/hls-vod-enc-key/hlscf.key",IV=0X99b74007b6254e4bd1c6e03631cad15b 987654330 #EXTINF:8, 987654332 #EXTINF:8, 987654334 #EXTINF:8, 987654336 #EXTINF:8, 987654338@#EXT-X-ENDLIST
  • MediaPlayer 能够解密文件。 HLS 支持AES,因为 v1 和 Android 能够在 3.x 上使用 v2,在 4.x 上使用 v3。您可以在 VLC Android 应用程序(不是测试版)中尝试相同的流,看看它是否有效。您还可以在其中启用调试日志。
  • 谢谢,这似乎是 Apache 服务器上的错误。但是我可以流式传输一个 mp4- 文件,并且我会按照描述的方式来配置我的 Web 服务器。 “交付内容不需要自定义服务器模块,并且通常只需要在 Web 服务器上进行很少的配置。推荐的配置通常仅限于为 .M3U8 文件和 .ts 文件指定 MIME 类型关联。”(Apple 开发人员 HLS)
  • mp4 文件使用渐进式下载以不同方式流式传输。要检查加密,请使用openssl 并尝试使用提供的密钥和 iv 解密其中一个段。使用的算法是aes-128-cbc

标签: android streaming http-live-streaming m3u8


【解决方案1】:

在 cmets 中继续讨论:

1008ERROR_OUT_OF_RANGE 在尝试将段读入缓冲区时返回。通过下载片段、解密并尝试播放来检查服务器是否正确响应(参见下面的方法)。

要检查的其他事项:确保 MPEG-TS 段有效。如果您使用包含在MP4 文件中的H.264 流来创建分段,请检查它们是否使用Annex B 格式(例如,在ffmpeg 中,您可以使用h264_mp4toannexb 比特流过滤器编码流 - 您可以将其与 -c:v copy) 一起使用

要检查加密是否正确,请使用openssl

  1. 获取纯十六进制的密钥

    xxd -p keyfile.key

  2. 解密.ts

    openssl aes-128-cbc -d -in encrypted_segment.ts -out decrypted_segment.ts -nosalt -iv <iv_hex> -K <key_hex>
    

    如果没有定义IV,则它等于媒体序列。

  3. 尝试播放解密的片段。

【讨论】:

    猜你喜欢
    • 2012-02-28
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 2020-10-19
    • 2013-06-29
    • 1970-01-01
    相关资源
    最近更新 更多