Android HLS- Streaming 无法获取片段

Android HLS- Streaming failed to fetch segment

我为 Android 编写了一个视频播放器以通过 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是否自己解密文件,如何查看是否解密成功? (我用的是最新的Android-版本)

要在评论中恢复讨论:

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. 尝试播放解密片段。​​