Lire la vidéo m3u8 sur android

je veux retransmettre en direct la vidéo en format m3u8. J'ai donc essayé le code ci-dessous

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


}

dans logcat il montre onBufferingUpdate percent:100 mais je ne peux pas voir la vidéo.

L'Audio fonctionne mais tout à coup il a été frappé.

et j'ai essayé ce lien vidéo http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8 ça marche. Mais mon lien vidéo ne fonctionne pas et j'ai changé httplive://... instead of http:// mais inutile.

et j'ai vu cette réponse aussi vidéo Android stream mms et m3u8 .

dans le lien ci-dessus il montre le message vidéo ne peut pas être joué.

23
demandé sur Community 2011-11-25 17:48:23

6 réponses

la vidéo existait dans http://www.livestream.com . En cela il y a L'Api Mobile pour le streaming en direct.

L'Api est:

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

dans le lien ci-dessus il y a des informations complètes pour compatible mobile. Pour obtenir le lien rtsp de la chaîne d'utiliser cette le lien

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

remplacer le nom de votre canal au lieu de proshowcase . Et puis obtenir toutes les url compatibles mobile comme IPhone, Android,Blackberry, etc,

en utilisant cette url, vous pouvez diffuser la vidéo sur Android en utilisant video view ou media player.

pour plus d'informations, veuillez lire le lien de L'Api Mobile.

Si on le même problème j'espère que cette réponse vous aidera.

bonne chance.

14
répondu Ramakrishna 2011-12-09 09:46:35

Je n'ai aucun problème à jouer stream:

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

A propos du message:

la vidéo ne peut pas être jouée

peut-être que vous avez besoin d'ajouter des permissions à votre fichier de manifeste:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
4
répondu Sergey 2012-09-06 09:04:01

je pense que vous devriez vous déplacer:

mMediaPlayer.setOnPreparedListener(this);

avant l'appel à la prepare()

1
répondu MByD 2011-11-25 13:51:57

avez-vous essayé de jouer votre lien avec native player directement via un navigateur web? Si vous ne pouvez pas le jouer avec natif player, cela signifie que votre fichier n'est pas pris en charge par votre version actuelle Android. Le format de diffusion en direct HTTP peut avoir certaines spécificités qui ne sont pas bien prises en charge par Android, alors qu'il peut jouer sur IOS.

1
répondu nonococo 2011-11-25 14:09:30

j'ai essayé le format vidéo m3u8 pendant plus de 6 mois et il n'est pas réussi. Il joue dans mon application iPhone et applications natives. Mon serveur de streaming est Red5 et il n'a pas de plugin RTSP. Il donne RTMP streaming et il ne pouvait pas être diffusé sur Android. J'ai attendu un an pour obtenir un OS ayant le soutien pour le streaming RTSP mais google n'a pas. Pourtant, j'utilise une vue web avec un lecteur flash pour diffuser la vidéo en direct(il n'a pas beaucoup de clarté). J'ai honte de dire cela à mon client et poursuite de la recherche pour lire le flux en direct dans le lecteur Android par défaut.

je pense que l'url de votre vidéo peut ne pas être RTSP.

0
répondu arshad 2012-10-02 10:42:41

Comment jouer .M3u8 Streaming sur 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>

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

j'ai vu beaucoup de gens avoir des problèmes pour jouer .M3U8, il dépend des codecs utilisés pour le streaming et la compatibilité avec le périphérique, par exemple certains de mes .les fichiers m3u8 ne sont pris en charge que dans appareils avec des écrans de 1200 x800 et plus.

0
répondu Jorgesys 2014-01-08 23:15:58