web-dev-qa-db-fra.com

Lire la vidéo m3u8 dans Android

Je veux vivre en streaming la vidéo et elle est au 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.

Le son fonctionne mais soudain, il a été frappé. 

Et j'ai essayé ce lien vidéo http://devimages.Apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8 cela fonctionne. Mais mon lien vidéo ne fonctionne pas et j’ai changé de httplive://... instead of http:// mais je n’en ai aucune utilité.

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

Le lien ci-dessus indique que le message vidéo ne peut pas être lu.

23
Ramakrishna

La vidéo existait déjà dans http://www.livestream.com . En cela, il y a Mobile Api pour la diffusion en direct.

L'API c'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, vous trouverez des informations complètes sur les mobiles compatibles. Pour obtenir le lien rtsp du canal utiliser ce lien

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

Remplacez le nom de votre chaîne au lieu de proshowcase. Et puis obtenez toutes les URL compatibles mobiles comme IPhone, Android, Blackberry, etc.

En utilisant cette URL, vous pouvez diffuser la vidéo dans Android en utilisant la vue vidéo ou le lecteur multimédia.

Pour plus d'informations, veuillez lire le lien Mobile Api.

Si quelqu'un a le même problème, j'espère que cette réponse vous aidera.

Bonne chance.

14
Ramakrishna

Je n'ai aucun problème pour jouer en streaming:

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 lue

Peut-être devez-vous ajouter des autorisations à votre fichier Manifest:

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

Je pense que vous devriez déplacer ceci:

mMediaPlayer.setOnPreparedListener(this);

Être avant l'appel à prepare()

1
MByD

Avez-vous essayé de lire votre lien avec un lecteur natif directement via un navigateur Web? Si vous ne pouvez pas le lire avec un lecteur natif, cela signifie que votre fichier n'est pas pris en charge par votre version Android actuelle. ont certaines spécificités qui ne sont pas bien supportées par Android, alors qu’il peut jouer sur IOS.

1
nonococo

J'ai essayé le format vidéo m3u8 pendant plus de 6 mois et ce n'est pas réussi. Il joue dans mon application iPhone et les applications natives. Mon serveur de streaming est Red5 et il n’a pas de plug-in RTSP. Il donne en streaming RTMP et il ne pouvait pas être diffusé dans Android. J'ai attendu un an pour obtenir un système d'exploitation prenant en charge le streaming RTSP, mais pas Google. Néanmoins, j'utilise une vue Web avec un lecteur Flash pour diffuser de la vidéo en direct (la clarté est faible). Je me sens honteux de dire cela à mon client et de poursuivre la recherche pour lire le flux en direct dans le lecteur par défaut d'Android.

Je pense que votre URL de vidéo ne peut pas RTSP.

0
arshad

Comment jouer .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/irina_delivery@117489/master.m3u8";
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    myVideoView.setVideoURI(Uri.parse(urlStream)); 
                }
            });
    }
}

J'ai vu de nombreuses personnes rencontrer des problèmes de lecture du format .M3U8; cela dépend des codecs utilisés pour la diffusion en continu et de la compatibilité avec le périphérique. Par exemple, certains de mes fichiers .m3u8 ne sont pris en charge que sur les périphériques dotés d'écrans de 1200 x800 ou plus.

0
Elenasys