web-dev-qa-db-ja.com

androidでm3u8ビデオを再生する

ビデオをライブストリーミングしたいのですが、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/bipbop/gear1/prog_index.m3u8 それは動作しています。しかし、私のビデオリンクは機能していません。変更しましたhttplive://... instead of http://使用しない。

そして、この答えも見ました Android video stream mms and m3u8

上記のリンクでは、「ビデオを再生できません」というメッセージが表示されます。

24
Ramakrishna

ビデオは http://www.livestream.com に存在していました。これには、ライブストリーミング用のMobile Apiがあります。

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

proshowcaseの代わりにチャンネル名を置き換えます。そして、iPhone、Android、Blackberryなどのすべてのモバイル互換URLを取得します。

そのURLを使用すると、ビデオビューまたはメディアプレーヤーを使用して、Androidでビデオをストリーミングできます。

詳細については、Mobile Apiリンクをご覧ください。

誰かが同じ問題を抱えているなら、この答えがあなたの助けになることを願っています。

幸運を祈ります。

15
Ramakrishna

ストリームを再生しても問題ありません。

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

メッセージについて:

ビデオを再生できません

マニフェストファイルにアクセス許可を追加する必要がある場合があります。

<uses-permission Android:name="Android.permission.INTERNET"/>
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>
6
Sergey

これを動かすべきだと思う:

_mMediaPlayer.setOnPreparedListener(this);
_

prepare()の呼び出しの前に

1
MByD

Webブラウザから直接ネイティブプレーヤーでリンクを再生しようとしましたか?ネイティブプレーヤーで再生できない場合は、現在のAndroidバージョン。HTTPLive Streaming形式はAndroidで十分にサポートされていない特定の機能を持つ可能性がありますが、 IOSで再生できます。

1
nonococo

M3u8ビデオ形式を6か月以上試しましたが、成功しませんでした。私のiPhoneアプリとネイティブアプリケーションで再生しています。私のストリーミングサーバーはRed5で、RTSPプラグインはありません。 RTMPストリーミングを提供し、Androidではストリーミングできませんでした。 RTSPストリーミングをサポートするOSを入手するのに1年待ちましたが、Googleはそうではありませんでした。それでも、私はライブビデオをストリーミングするためにフラッシュプレーヤーを備えたWebビューを使用しています(あまり明確ではありません)。クライアントにこれを言って、Androidデフォルトプレーヤーでライブストリームを再生するために検索を続けるのは残念です。

動画のURLはRTSPではない可能性があります。

0
arshad

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/[email protected]/master.m3u8";
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    myVideoView.setVideoURI(Uri.parse(urlStream)); 
                }
            });
    }
}

多くの人が.M3U8の再生に問題があるのを見てきました。ストリーミングに使用されるコーデックとデバイスとの互換性に依存します。たとえば、私の.m3u8ファイルの一部は、1200 x800以上の画面を持つデバイスでのみサポートされます.

0
Jorgesys