在Android中播放m3u8video

我想直播video,它是M3U8格式。 所以我试了下面的代码

public class StreamingPlayer extends Activity implements OnBufferingUpdateListener, OnCompletionListener, OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback{ private static final String TAG = StreamingPlayer.class.getSimpleName(); private int mVideoWidth; private int mVideoHeight; private MediaPlayer mMediaPlayer; private SurfaceView mPreview; private SurfaceHolder holder; private String path; private boolean mIsVideoSizeKnown = false; private boolean mIsVideoReadyToBePlayed = false; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.mediaplayer_2); mPreview = (SurfaceView) findViewById(R.id.surface); holder = mPreview.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } private void playVideo() { doCleanUp(); try { /* * TODO: Set path variable to progressive streamable mp4 or * 3gpp format URL. Http protocol should be used. * Mediaplayer can only play "progressive streamable * contents" which basically means: 1. the movie atom has to * precede all the media data atoms. 2. The clip has to be * reasonably interleaved. * */ path = "httplive://xboodangx.api.channel.livestream.com/3.0/playlist.m3u8"; if (path == "") { // Tell the user to provide a media file URL. Toast .makeText( this, "Please edit MediaPlayerDemo_Video Activity," + " and set the path variable to your media file URL.", Toast.LENGTH_LONG).show(); } Log.e("PATH", "Path = " + path); // Create a new media player and set the listeners mMediaPlayer = new MediaPlayer(); mMediaPlayer.setDataSource(path); mMediaPlayer.setDisplay(holder); mMediaPlayer.setOnBufferingUpdateListener(this); mMediaPlayer.setOnPreparedListener(this); mMediaPlayer.prepare(); mMediaPlayer.setOnCompletionListener(this); mMediaPlayer.setOnVideoSizeChangedListener(this); mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); } catch (Exception e) { Log.e(TAG, "error: " + e.getMessage(), e); } } public void onBufferingUpdate(MediaPlayer arg0, int percent) { Log.d(TAG, "onBufferingUpdate percent:" + percent); } public void onCompletion(MediaPlayer arg0) { Log.d(TAG, "onCompletion called"); } public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { Log.v(TAG, "onVideoSizeChanged called"); if (width == 0 || height == 0) { Log.e(TAG, "invalid video width(" + width + ") or height(" + height + ")"); return; } mIsVideoSizeKnown = true; mVideoWidth = width; mVideoHeight = height; if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) { startVideoPlayback(); } } public void onPrepared(MediaPlayer mediaplayer) { Log.d(TAG, "onPrepared called"); mIsVideoReadyToBePlayed = true; if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) { startVideoPlayback(); } } public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) { Log.d(TAG, "surfaceChanged called"); } public void surfaceDestroyed(SurfaceHolder surfaceholder) { Log.d(TAG, "surfaceDestroyed called"); } public void surfaceCreated(SurfaceHolder holder) { Log.d(TAG, "surfaceCreated called"); playVideo(); } @Override protected void onPause() { super.onPause(); releaseMediaPlayer(); doCleanUp(); } @Override protected void onDestroy() { super.onDestroy(); releaseMediaPlayer(); doCleanUp(); } private void releaseMediaPlayer() { if (mMediaPlayer != null) { mMediaPlayer.release(); mMediaPlayer = null; } } private void doCleanUp() { mVideoWidth = 0; mVideoHeight = 0; mIsVideoReadyToBePlayed = false; mIsVideoSizeKnown = false; } private void startVideoPlayback() { Log.v(TAG, "startVideoPlayback"); holder.setFixedSize(mVideoWidth, mVideoHeight); mMediaPlayer.start(); } } 

在logcat中显示onBufferingUpdate percent:100但我看不到video。

audio正在工作,但突然它被击中。

我试图这个video链接http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8它工作。 但我的video链接不工作,我改变了httplive://... instead of http://但没有用。

而我看到这个答案还Androidvideostreammms和m3u8 。

在上面的链接显示video不能播放的消息。

Solutions Collecting From Web of "在Android中播放m3u8video"

该video存在于http://www.livestream.com 。 在这里有移动API实时stream媒体。

Api是:

http://www.livestream.com/userguide/index.php?title=Mobile_API#How_to_get_mobile_compatible_clips_from_a_channel.27s_library

在上面的链接有充分的信息为移动兼容。 从通道获取rtsp链接以使用此链接

http://xproshowcasex.channel-api.livestream-api.com/2.0/getstream

replace您的频道名称,而不是proshowcase 。 然后得到所有手机兼容的url,如iPhone,Android,黑莓等,

使用该url,您可以使用video视图或媒体播放器在Android中stream式传输video。

欲了解更多信息,请阅读移动Api链接。

如果有人得到同样的问题,我希望这个答案会帮助你。

祝你好运。

我玩没有问题的stream:

 videoView1.setVideoPath("http://***.net/livedemo/_definst_/stream3.stream/playlist.m3u8?wowzasessionid=773395207"); videoView1.start(); 

关于消息:

video无法播放

也许你需要为你的Manifest文件添加权限:

 <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

我认为你应该这样做:

 mMediaPlayer.setOnPreparedListener(this); 

在电话prepare()之前prepare()

您是否尝试通过networking浏览器直接与本地播放器build立链接? 如果你不能用本地播放器播放,这意味着你的文件不支持你当前的Android版本。 HTTP Live Streaming格式可以具有某些Android不能很好支持的特性,但是它可以在IOS上播放。

我尝试了超过6个月的m3u8video格式,并没有成功。 它是在我的iPhone应用程序和本机应用程序中播放。 我的stream媒体服务器是Red5,它没有RTSP插件。 它给出了RTMPstream媒体,无法在Android中进行stream式传输。 我等了一年才得到支持RTSPstream媒体的操作系统,但谷歌没有。 不过,我正在使用networking视图与Flash播放器stream直播video(它没有太多的清晰度)。 我很遗憾地对我的客户说,并继续search播放Android默认播放器的直播。

我认为你的videourl可能不是RTSP。

如何在Android中播放.M3U8stream媒体

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时遇到问题,这取决于stream媒体使用的编解码器以及与设备的兼容性,例如我的一些.m3u8文件只支持1200 x800或更高的屏幕。