我想要直播视频,它是 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
但我看不到视频。
音频正常,但突然被击中。
我尝试了这个视频链接http://devimages.apple.com/iphone/samples/bibpbop/gear1/prog_index.m3u8它正在工作。但我的视频链接不起作用,我更改了
httplive://... instead of http://
但没有用。
我也看到了这个答案Android视频流彩信和m3u8。
在上面的链接中显示视频无法播放消息。
该视频存在于http://www.livestream.com。这里有用于直播的 Mobile Api。
API 是:
在上面的链接中有移动兼容的完整信息。要从频道获取 rtsp 链接以使用此链接
http://xproshowcasex.channel-api.livestream-api.com/2.0/getstream
替换您的频道名称而不是
proshowcase
。然后获取所有移动设备兼容的 url,如 iPhone、Android、黑莓等,
使用该 URL,您可以使用视频视图或媒体播放器在 Android 中流式传输视频。
有关更多信息,请阅读移动 Api 链接。
如果有人遇到同样的问题,我希望这个答案能帮助你。
祝你好运。
我播放流没有问题:
videoView1.setVideoPath("http://***.net/livedemo/_definst_/stream3.stream/playlist.m3u8?wowzasessionid=773395207");
videoView1.start();
关于消息:
视频无法播放
也许您需要向 Manifest 文件添加权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
我认为你应该移动这个:
mMediaPlayer.setOnPreparedListener(this);
在致电
prepare()
之前
您是否尝试直接通过网络浏览器使用本机播放器播放您的链接? 如果您无法使用本机播放器播放,则说明您当前的 Android 版本不支持您的文件。 HTTP 直播格式可能有一些特殊性,Android 不能很好地支持,但它可以在 IOS 上播放。
我尝试了 m3u8 视频格式 6 个多月,但没有成功。它正在我的 iPhone 应用程序和本机应用程序中播放。我的流媒体服务器是 Red5,它没有 RTSP 插件。它提供 RTMP 流媒体,但无法在 Android 中进行流媒体播放。我等了一年才得到一个支持 RTSP 流媒体的操作系统,但谷歌还没有。我仍然使用带有 Flash 播放器的 Web 视图来流式传输实时视频(清晰度不太高)。我很羞耻地对我的客户说这句话,并继续搜索在 Android 默认播放器中播放直播。
我认为您的视频网址可能不是 RTSP。
如何在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";
myVideoView.setVideoURI(Uri.parse(urlStream));
}
}
我看到很多人在播放 .M3U8 时遇到问题,这取决于用于流媒体的编解码器以及与设备的兼容性,例如我的一些 .m3u8 文件仅在屏幕为 1200 x800 及更高的设备上支持。
我认为这里面有些混乱。 M3u8 不是视频格式,它是播放列表的格式,这意味着如果您在文本编辑器中打开 m3u8 文件,您将找到实际音频或视频内容的链接列表(互联网 URL 或文件路径)。 您必须自己读取 m3u8 文件并将链接发送到 setsourcepath 中的媒体播放器。 您可能会遇到另一个障碍,因为 m3u8 可能包含 UTF-8 字符,并且在 java/android 中管理 utf-8 文件路径相当困难