it-swarm.com.de

Spielen Sie m3u8-Video in Android

Ich möchte das Video live streamen und es ist im m3u8-Format. Also habe ich den folgenden Code ausprobiert

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();
    }


}

In logcat zeigt es onBufferingUpdate percent:100 Aber ich kann das Video nicht sehen.

Audio funktioniert, aber plötzlich wurde es angeschlagen. 

Und ich habe diesen Videolink ausprobiert http://devimages.Apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8 es funktioniert. Aber mein Videolink funktioniert nicht und ich httplive://... instead of http:// änderte aber keinen Gebrauch.

Und ich sah diese Antwort auch Android-Video-Streams mms und m3u8 .

Im obigen Link wird angezeigt, dass das Video nicht abgespielt werden kann.

23
Ramakrishna

Das Video war in http://www.livestream.com vorhanden. In diesem gibt es Mobile Api für Live-Streaming.

Die API ist:

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

Im obigen Link finden Sie vollständige Informationen für mobile Geräte. Um den Rtsp-Link vom Channel zu erhalten, verwenden Sie diesen Link

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

Ersetzen Sie Ihren Kanalnamen anstelle von proshowcase. Und dann alle mobilen kompatiblen URLs wie iPhone, Android, Blackberry usw. erhalten.

Mit dieser URL können Sie das Video in Android streamen, indem Sie die Videoansicht oder den Mediaplayer verwenden.

Für weitere Informationen lesen Sie bitte den Link Mobile Api.

Wenn jemand dasselbe Problem hat, hoffe ich, dass diese Antwort Ihnen helfen wird.

Viel Glück.

14
Ramakrishna

Ich habe kein Problem, Stream zu spielen:

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

Über die Nachricht: 

Das Video kann nicht abgespielt werden

Möglicherweise müssen Sie Ihrer Manifest-Datei Berechtigungen hinzufügen:

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

Ich denke, du solltest das verschieben:

mMediaPlayer.setOnPreparedListener(this);

Vor dem Aufruf von prepare() sein

1
MByD

Haben Sie versucht, Ihren Link mit dem native Player direkt über den Webbrowser abzuspielen? Wenn Sie es nicht mit dem native Player abspielen können, bedeutet dies, dass Ihre Datei nicht von Ihrer aktuellen Android-Version unterstützt wird haben einige Besonderheiten, die von Android nicht gut unterstützt werden, während es auf IOS läuft.

1
nonococo

Ich habe m3u8 Videoformat seit mehr als 6 Monaten ausprobiert und es ist nicht erfolgreich. Es wird in meiner iPhone-App und in nativen Anwendungen wiedergegeben. Mein Streaming-Server ist Red5 und hat kein RTSP-Plugin. Es gibt RTMP-Streaming aus und konnte nicht in Android gestreamt werden. Ich habe ein Jahr gewartet, um ein Betriebssystem mit Unterstützung für RTSP-Streaming zu erhalten, aber Google hat dies nicht getan. Trotzdem verwende ich eine Webansicht mit einem Flash-Player, um Live-Videos zu streamen (es hat nicht viel Klarheit). Ich schäme mich, dies meinem Kunden zu sagen und die Suche fortzusetzen, um den Live-Stream im Android-Standardplayer abzuspielen.

Ich denke, deine Video-URL darf kein RTSP sein.

0
arshad

So spielen Sie .M3U8-Streaming in Android

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)); 
                }
            });
    }
}

Ich habe gesehen, dass viele Leute Probleme mit der Wiedergabe von .M3U8 haben. Dies hängt von den für das Streaming verwendeten Codecs und der Kompatibilität mit dem Gerät ab. Zum Beispiel werden einige meiner .m3u8-Dateien nur in Geräten mit Bildschirmen mit 1200 x 800 und höher unterstützt.

0
Elenasys