如何在安卓手机上播放m3u8格式的视频?

9

据我了解,Android 3.0及以上版本能够播放广播流m3u8 - http://developer.android.com/guide/appendix/media-formats.html

我将此链接 - http://content.mobile-tv.sky.com/content/ssna/live/ssnraudio.m3u8 放入MediaPlayer中,但在LogCat中我得到以下信息:

06-01 09:04:44.287: INFO/LiveSession(33): onConnect 'http://content.mobile-tv.sky.com/content/ssna/live/ssnraudio.m3u8'
06-01 09:04:44.287: INFO/NuHTTPDataSource(33): connect to content.mobile-tv.sky.com:80/content/ssna/live/ssnraudio.m3u8 @0
06-01 09:04:44.747: INFO/NuHTTPDataSource(33): connect to content.mobile-tv.sky.com:80/content/ssna/live/ssnraudio.m3u8 @0
06-01 09:04:45.019: INFO/NuHTTPDataSource(33): connect to content.mobile-tv.sky.com:80/content/ssna/live/ssnraudio/ssnr_052311_071632_78731.aac @0
**06-01 09:04:45.817: ERROR/LiveSession(33): This doesn't look like a transport stream...**
06-01 09:04:45.967: INFO/HTTPLiveSource(33): input data EOS reached.

这是我的源代码:

    mp = new MediaPlayer();        
    start.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub              
            try {

                mp.setDataSource("http://content.mobile-tv.sky.com/content/ssna/live/ssnraudio.m3u8");
                mp.prepare();
                mp.start();

            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
        }
    });

    stop.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            try {

                mp.stop(); 
                mp.reset();

            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
        }
    });
}

你可以查看这篇帖子:videoview - evan
6个回答

5

尝试使用ExoMedia,流媒体播放就像这样简单:

emVideoView.setVideoURI(Uri.parse("https://archive.org/download/Popeye_forPresident/Popeye_forPresident_512kb.mp4"));

我很擅长使用m3u8。


5

我自己没有尝试过,但我参考的链接表明它应该可以在2.3和3.0中使用“httplive”URL方案和v3.1+正常的“http”。 - Maks

4
也许你可以尝试使用Vitamio插件,http://vov.io/vitamio/ Vitamio是适用于所有Android设备的多媒体框架。Vitamio与Android默认的MediaPlayer类似,但它包含更强大的功能。而且它是完全免费的!网络协议
以下网络协议支持音频和视频播放:
MMS
RTSP (RTP, SDP)
HTTP progressive streaming
HTTP live streaming (M3U8), for Android 2.1+

我从 Git hub 下载了代码,但由于 videoView.setPath 未定义(已将 ZI 和 Bundle 作为库项目添加),因此无法编译代码。请帮助我。 - Code_Life
Vitamio存在的问题是:对于某些流媒体来说,它不够流畅。 - mxg
2
此外,Vitamio库对APK大小有很大的影响 - 它们会增加约20MB的APK大小,并且这些库会被提取到每个设备上的应用程序/data/目录中,占用30MB的设备存储空间。 - Elad Nava

4
这是我关于在Android中播放.M3U8流媒体的示例。
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <VideoView
        android:id="@+id/myVideoView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

Main.java

package com.grexample.ooyalalive;

import java.net.URL;
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.widget.MediaController;
import android.widget.VideoView;

public class Main extends Activity {

    private String urlStream;
    private VideoView myVideoView;
    private URL url;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_vv);//***************
            myVideoView = (VideoView)this.findViewById(R.id.myVideoView);
            MediaController mc = new MediaController(this);
            myVideoView.setMediaController(mc);         
            urlStream = "http://jorgesys.net/i/irina_delivery@117489/master.m3u8";
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    myVideoView.setVideoURI(Uri.parse(urlStream)); 
                }
            });
    }
}

我看到很多人在播放.M3U8文件时遇到问题,这取决于流媒体使用的编解码器以及与设备的兼容性。例如,我的一些.m3u8文件只支持屏幕分辨率为1200 x 800及以上的设备。


1

0
我也搜索了很多关于在ExoPlayer中播放m3u8视频的方法,如果我们使用普通的exo player来播放m3u8类型的视频,它将无法播放。我们需要做一些改变,我已经做了,并且对我来说运行得很好。
在Kotlin中:
 private var exoPlayer: ExoPlayer? = null
    private val playbackStateListener: Player.Listener = playbackStateListener()
    private var currentItem = 0
    private var playbackPosition = 0L
    var url = ""

    //Call this method from onStart() of the Activity.
    private fun initializePlayer() {
        exoPlayer = ExoPlayer.Builder(this).build()
        videoView.player = exoPlayer
        videoView.setKeepContentOnPlayerReset(true)
        var mediaItem =  MediaItem.Builder().
        setUri("YOUR m3u8 url to play video ")
            .setMimeType(MimeTypes.APPLICATION_M3U8).build()

        exoPlayer?.let { exoPlayer ->
            exoPlayer.setMediaItem(mediaItem)
            exoPlayer.playWhenReady = true
            exoPlayer.seekTo(currentItem, 20L)
   
            exoPlayer.prepare()
        }

    }

现在您需要添加依赖项,请不要忘记在gradle中添加依赖项:

 implementation 'com.google.android.exoplayer:exoplayer-hls:2.17.1'

现在为了方便起见,我将展示XML。

    activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_height="match_parent">



    <com.google.android.exoplayer2.ui.StyledPlayerView
        android:id="@+id/videoView"
        app:show_buffering="always"
        app:resize_mode="fit"
        app:keep_content_on_player_reset="false"
        app:use_controller="true"
        android:layout_width="match_parent"
        android:layout_height="480dp" >

    </com.google.android.exoplayer2.ui.StyledPlayerView>


</LinearLayout>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接