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-版本)
要在评论中恢复讨论:
1008
是 ERROR_OUT_OF_RANGE
在尝试将段读入缓冲区时返回。通过下载段、解密并尝试播放来检查服务器是否正确响应(参见下面的方法)。
其他要检查的事项:确保 MPEG-TS
段有效。如果您使用 MP4
文件中包含的 H.264
流来创建段,请检查它们是否使用 Annex B
格式(例如,在 ffmpeg
中,您可以使用h264_mp4toannexb
适用于编码流的比特流过滤器 - 您可以将其与 -c:v copy
)
一起使用
要检查加密是否正确,请使用 openssl
。
获取纯十六进制密钥
xxd -p keyfile.key
解密一个.ts
片段
openssl aes-128-cbc -d -in encrypted_segment.ts -out decrypted_segment.ts -nosalt -iv <iv_hex> -K <key_hex>
如果没有定义IV则等于媒体序列。
尝试播放解密片段。
我为 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-版本)
要在评论中恢复讨论:
1008
是 ERROR_OUT_OF_RANGE
在尝试将段读入缓冲区时返回。通过下载段、解密并尝试播放来检查服务器是否正确响应(参见下面的方法)。
其他要检查的事项:确保 MPEG-TS
段有效。如果您使用 MP4
文件中包含的 H.264
流来创建段,请检查它们是否使用 Annex B
格式(例如,在 ffmpeg
中,您可以使用h264_mp4toannexb
适用于编码流的比特流过滤器 - 您可以将其与 -c:v copy
)
要检查加密是否正确,请使用 openssl
。
获取纯十六进制密钥
xxd -p keyfile.key
解密一个
.ts
片段openssl aes-128-cbc -d -in encrypted_segment.ts -out decrypted_segment.ts -nosalt -iv <iv_hex> -K <key_hex>
如果没有定义IV则等于媒体序列。
尝试播放解密片段。