【发布时间】: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
#EXTM3U987654326#EXT-X-ALLOW-CACHE:NO987654328#EXT-X-KEY:METHOD=AES-128,URI="/hls-vod-enc-key/hlscf.key",IV=0X99b74007b6254e4bd1c6e03631cad15b987654330#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