2011-11-25 25 views
23

Voglio riprodurre in streaming il video ed è in formato m3u8. Così ho provato il codice qui sottoRiproduzione video m3u8 in android

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 mostra onBufferingUpdate percent:100 ma non riesco a vedere il video.

L'audio funziona ma improvvisamente è stato colpito.

E ho provato questo collegamento video http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8 sta funzionando. Ma il mio collegamento video non funziona e ho cambiato httplive://... instead of http:// ma non uso.

E ho visto questa risposta anche Android video stream mms and m3u8.

Nel collegamento sopra mostra Il messaggio video non può essere riprodotto.

+0

Hai provato a testarlo su un dispositivo reale? a volte l'emulatore fa schifo quando si tratta di HTTP Live Streaming. – yorkw

+0

@yorkw Grazie per la vostra risposta. Sì ho provato nel dispositivo reale non in emulatore. – Ramakrishna

+0

L'URI h t t p: //myvideo.m3u8 mi sembra strano, dove ospiterai i media? un server remoto? Se hai accesso al codice di trasmissione sul lato server, prova a cambiarlo in un URL più solido come h t t p: //dominio-nome/servizio-nome/myvideo.m3u8. Non sono sicuro se questo lavoro, ma vale la pena di provare. – yorkw

risposta

14

Il video era presente in http://www.livestream.com. In questo c'è Mobile Api per lo streaming live.

L'API è:

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

Nel link qui sopra ci sono le informazioni per la piena compatibilità mobile. Per ottenere il collegamento RTSP dal canale di utilizzare questo link

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

Sostituire il nome del canale, invece di proshowcase. E poi ottieni tutti gli url compatibili per cellulari come IPhone, Android, Blackberry, ecc.,

Utilizzando tale URL è possibile eseguire lo streaming del video in Android utilizzando la visualizzazione video o il lettore multimediale.

Per ulteriori informazioni, consultare il link Mobile Api.

Se qualcuno ottiene lo stesso problema, spero che questa risposta ti possa aiutare.

Buona fortuna.

+0

è possibile vedere il codice funzionante? di fronte allo stesso numero –

+0

@GuillermoVarini Il codice sopra riportato non ha funzionato con me. Per favore, leggi la mia risposta e dimmi il tuo problema in dettaglio quindi ti dirò risposta se lo so. – Ramakrishna

+0

il problema è che ho bisogno di riprodurre un video m3u8 su 2.1 app e non posso trovare un esempio reale di come farlo. trovato 2 post qui ma non ha funzionato. anche controllato su developer.android.com/ ma niente: dici che con questa api funziona? hai un esempio di come implementare? –

1

Credo che si dovrebbe spostare questo:

mMediaPlayer.setOnPreparedListener(this); 

Per essere prima della chiamata a prepare()

+0

Grazie per la tua risposta. Ho implementato la tua idea ma non funziona. Fino a quando mostra suBufferingUpdate percent: 100 e non vedo il video – Ramakrishna

1

Hai provato a giocare il vostro legame con il giocatore nativo direttamente tramite browser web? Se non riesci a riprodurlo con il lettore nativo, significa che il tuo file non è supportato dalla tua versione Android corrente. Il formato HTTP Live Streaming può avere alcune specificità che non sono ben supportate da Android, mentre possono essere riprodotte su IOS.

+0

Grazie per la tua risposta. Funziona su Android player nativo e anche su IOS. Ci sono già completato questo compito. – Ramakrishna

0

Ho provato il formato video m3u8 per più di 6 mesi e non è riuscito. Sta giocando nella mia app per iPhone e nelle applicazioni native. Il mio server di streaming è Red5 e non ha un plug-in RTSP. Distribuisce streaming RTMP e non può essere trasmesso in streaming su Android. Ho aspettato un anno per ottenere un sistema operativo con supporto per lo streaming RTSP ma google no. Sto ancora usando una vista web con un flash player per trasmettere video in diretta (non ha molta chiarezza). Mi vergogno di dire questo al mio cliente e di continuare la ricerca per riprodurre il live streaming nel player Android predefinito.

Penso che l'URL del tuo video non sia RTSP.

4

Non ho alcun problema a giocare flusso:

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

Circa il messaggio:

Il video non può essere riprodotto

Forse avete bisogno di aggiungere le autorizzazioni al file manifesto :

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
+3

non è necessario. – Jorgesys

+0

Stesso problema. Hai trovato una soluzione? –

+0

Sergey

0

Come si gioca .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)); 
       } 
      }); 
    } 
} 

ho visto un sacco di persone hanno problemi di riproduzione .M3U8, dipende dai codec usati per lo streaming a nd compatibilità con il dispositivo, ad esempio alcuni dei miei file .m3u8 sono supportati solo in dispositivi con schermi di 1200 x800 e superiori.

+3

Non è necessario chiamare runOnUiThread all'interno di onCreate, è già acceso Thread dell'interfaccia utente – busylee

Problemi correlati