2014-12-19 76 views
2

我試圖用HLS自適應比特率流媒體Android supprot HLS自適應比特率流?

我做出變型播放列表: 文件名是test.m3u8

#EXTM3U 
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=200000 
low/low.m3u8 
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=311111 
middle/middle.m3u8 
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=484444 
high/high.m3u8 

每個M3U8文件:

#EXTM3U 
#EXT-X-VERSION:4 
#EXT-X-TARGETDURATION:10 
#EXT-X-MEDIA-SEQUENCE:0 
#EXTINF:6.040000, 
#EXT-X-BYTERANGE:[email protected] 
http://myserver/hls/Test/low/low.ts 
#EXTINF:4.200000, 
#EXT-X-BYTERANGE:[email protected] 
http://myserver/hls/Test/low/low.ts 
#EXTINF:10.000000, 
#EXT-X-BYTERANGE:[email protected] 
http://myserver/hls/Test/low/low.ts 
.......... 
#EXT-X-ENDLIST 

我的文件夾結構:

/hls/Test/test.m3u8 
/hls/Test/low/low.m3u8 
/hls/Test/middle/middle.m3u8 
/hls/Test/high/high.m3u8 

我的問題是:

iOS設備調用此URL(http://myserver/hls/Test/test.m3u8
視頻播放工作。

Android設備調用此URL(http://myserver/hls/Test/test.m3u8
視頻無法播放。
但是,我打電話url(http://myserver/hls/Test/low/low.m3u8
視頻播放工作。

Android設備:三星Galaxy Note 3

Android客戶端源:

@Override 
protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_video); 

    initUI(); 
    Uri uri = Uri.parse("http://myserver/hls/Test/test.m3u8"); 

    MediaController mc = new MediaController(this); 
    video_videoView.setMediaController(mc); 

    video_videoView.setVideoURI(uri); 
    video_videoView.start(); 
} 

private void initUI() { 
    video_videoView = (VideoView) findViewById(R.id.video_videoView); 
} 

的Android logcat的錯誤:

12-19 11:20:12.547: I/MediaPlayer(1704): path is null 
12-19 11:20:12.567: D/MediaPlayer(1704): setDataSource IOException happend :  
12-19 11:20:12.567: D/MediaPlayer(1704): java.io.FileNotFoundException: No content provider: http://myserver/hls/Test/test.m3u8 
12-19 11:20:12.567: D/MediaPlayer(1704): at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1053) 
12-19 11:20:12.567: D/MediaPlayer(1704): at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:907) 
12-19 11:20:12.567: D/MediaPlayer(1704): at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:834) 
12-19 11:20:12.567: D/MediaPlayer(1704): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:978) 
12-19 11:20:12.567: D/MediaPlayer(1704): at android.widget.VideoView.openVideo(VideoView.java:338) 
12-19 11:20:12.567: D/MediaPlayer(1704): at android.widget.VideoView.access$2100(VideoView.java:71) 
12-19 11:20:12.567: D/MediaPlayer(1704): at android.widget.VideoView$7.surfaceCreated(VideoView.java:618) 
12-19 11:20:12.567: D/MediaPlayer(1704): at android.view.SurfaceView.updateWindow(SurfaceView.java:602) 
12-19 11:20:12.567: D/MediaPlayer(1704): at android.view.SurfaceView.access$000(SurfaceView.java:94) 
12-19 11:20:12.567: D/MediaPlayer(1704): at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:183) 
12-19 11:20:12.567: D/MediaPlayer(1704): at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:888) 
12-19 11:20:12.567: D/MediaPlayer(1704): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2199) 
12-19 11:20:12.567: D/MediaPlayer(1704): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254) 
12-19 11:20:12.567: D/MediaPlayer(1704): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6624) 
12-19 11:20:12.567: D/MediaPlayer(1704): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:812) 
12-19 11:20:12.567: D/MediaPlayer(1704): at android.view.Choreographer.doCallbacks(Choreographer.java:612) 
12-19 11:20:12.567: D/MediaPlayer(1704): at android.view.Choreographer.doFrame(Choreographer.java:582) 
12-19 11:20:12.567: D/MediaPlayer(1704): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:798) 
12-19 11:20:12.567: D/MediaPlayer(1704): at android.os.Handler.handleCallback(Handler.java:733) 
12-19 11:20:12.567: D/MediaPlayer(1704): at android.os.Handler.dispatchMessage(Handler.java:95) 
12-19 11:20:12.567: D/MediaPlayer(1704): at android.os.Looper.loop(Looper.java:146) 
12-19 11:20:12.567: D/MediaPlayer(1704): at android.app.ActivityThread.main(ActivityThread.java:5602) 
12-19 11:20:12.567: D/MediaPlayer(1704): at java.lang.reflect.Method.invokeNative(Native Method) 
12-19 11:20:12.567: D/MediaPlayer(1704): at java.lang.reflect.Method.invoke(Method.java:515) 
12-19 11:20:12.567: D/MediaPlayer(1704): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) 
12-19 11:20:12.567: D/MediaPlayer(1704): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 
12-19 11:20:12.567: D/MediaPlayer(1704): at dalvik.system.NativeStart.main(Native Method) 
12-19 11:20:12.567: D/MediaPlayer(1704): Couldn't open file on client side, trying server side 

請幫助..

+0

您能否提供關於您使用的Android版本的信息? – vipw 2014-12-22 13:28:38

+0

我使用Android 4.4版本 – 2014-12-22 13:36:38

+0

它不直接支持。你需要讓自己的球員做到這一點有點棘手。我早些時候嘗試過,但無法獲得與IOS相同的質量。它通常無法解析和更改不同的m3u8文件。 – NitinG 2014-12-31 11:33:08

回答

1

天然VideoView沒有按」真的支持HLS流媒體。 構建使用ExoPlayer

在Android開發者控制檯中提到的自定義視頻播放器:

「ExoPlayer支持當前未被MediaPlayer的提供的功能,包括通過HTTP(DASH)動態自適應流,SmoothStreaming和通用加密它的設計很容易定製和擴展,使許多組件與自定義實現來代替。因爲ExoPlayer是,你在你的應用程序包括,它可以與你的應用程序」

http://developer.android.com/guide/topics/media/exoplayer.html

一起被容易地更新庫

此外,您可以搜索包裝ExoPlayer的庫。

Ex。 :https://github.com/brianwernick/ExoMedia

+0

雖然此鏈接可能回答問題,但它最好在這裏包含答案的基本部分,並提供參考鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/12237118) – Mohit 2016-05-04 06:30:29

+0

@Mohit注意!我編輯了答案。做審查。謝謝。 – vijaydev 2016-05-04 07:00:35

+0

我有'http url''720p'視頻具有相同的'url'我怎樣才能實現'流像youtube 144p 22op 720p' ..請幫助 – 2018-02-22 07:30:57

相關問題