2016-04-30 241 views
11

我正在構建一個應用程序,從樹莓派直播流視頻到我的Android設備。我有玩這個流三個功能方面:RTSP實時視頻流

rtsp://media.smart-streaming.com/mytest/mp4:sample_phone_150k.mp4

  1. 媒體播放器+ SurfaceView
  2. VideoView
  3. Intent.ACTION_VIEW

的問題是應用程序播放上述^流但不玩我的(rtsp://192.168.1.143:8554/vid.mp4)... 但VLC確實

我曾嘗試使用VLC和LIVE555以多種視頻格式進行流媒體播放,並且我也嘗試播放錄製在手機上的視頻。

這裏是我的代碼:

//Stream methods 0 = MediaPlayer & SurfaceView, 1 = VideoView, 2 = Native Video Player 
final int STREAM_USING = 0; 

//MediaPlayer on surfaceView 
String streamPath = "rtsp://192.168.1.143:8554/vid.mp4";//"rtsp://media.smart-streaming.com/mytest/mp4:sample_phone_150k.mp4";//"rtsp://192.168.1.143:8554/vid.mp4";//;"rtp://239.255.0.1:5004/"; 
Uri streamUri; 
private MediaPlayer mediaPlayer; 
private SurfaceView surfaceView; 
private SurfaceHolder surfaceHolder; 

//VideoView 
VideoView videoView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //MediaPlayer 
    switch (STREAM_USING) { 
     case 0: { 
      surfaceView = (SurfaceView) findViewById(R.id.surfaceView); 
      surfaceHolder = surfaceView.getHolder(); 
      surfaceHolder.setFixedSize(800, 480); 
      surfaceHolder.addCallback(this); 
      surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
      mediaPlayer = new MediaPlayer(); 

      mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { 
       @Override 
       public boolean onError(MediaPlayer mp, int what, int extra) { 
        if (what == MediaPlayer.MEDIA_ERROR_SERVER_DIED) { 
         mediaPlayer.release(); 
         mediaPlayer = new MediaPlayer(); 
         //mediaPlayer.stop(); 
         play(); 
        } 
        return false; 
       } 
      }); 

      mediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() { 
       @Override 
       public void onBufferingUpdate(MediaPlayer mp, int percent) { 
        Toast.makeText(getApplicationContext(), "BUFF : " + percent, Toast.LENGTH_SHORT).show(); 
        if (!mediaPlayer.isPlaying()) { 
         mediaPlayer.start(); 
        } 
       } 
      }); 

      //Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
      //i.setType("video/*"); 
      //startActivityForResult(i, 1234); 
      streamUri = Uri.parse(streamPath); 
      play(); 
      break; 
     } 
     case 1: { 
      videoView = (VideoView) findViewById(R.id.videoView); 
      videoView.setVideoURI(Uri.parse(streamPath)); 
      MediaController mediaController = new MediaController(this); 
      //mediaController.setAnchorView(videoView); 
      videoView.setMediaController(mediaController); 
      videoView.requestFocus(); 
      try { 
       videoView.start(); 
      } 
      catch (SecurityException se) { 
       Log.e("SE", se.getMessage()); 
       se.printStackTrace(); 
      } 
      break; 
     } 
     case 2: { 
      Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(streamPath)); 
      startActivity(intent); 
      break; 
     } 
     default: { 
      Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(streamPath)); 
      startActivity(intent); 
     } 
    } 
} 

private void play() { 
    try { 
     //final FileInputStream fis = new FileInputStream(streamPath); 
     mediaPlayer.stop(); 
     mediaPlayer.reset(); 
     mediaPlayer.setDataSource(MainActivity.this, streamUri); 
     //mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

     mediaPlayer.prepareAsync(); 
     mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      @Override 
      public void onPrepared(MediaPlayer mp) { 
       //mediaPlayer.reset(); 
       mediaPlayer.start(); 
      } 
     }); 


    } catch (SecurityException se) { 
     Log.e("SE", se.getMessage()); 
     se.printStackTrace(); 
    } catch (IOException ie) { 
     ie.printStackTrace(); 
    } 
} 

任何幫助表示讚賞,我一直在努力了一個星期得到這個沒有成功:(

+0

怎麼樣提供的logcat android媒體api當你嘗試加載rtsp uri?什麼是媒體播放器和/或視頻視圖? –

+0

好吧,我會盡快與明天 – ciprianoss

+0

對不起已故的答覆: RTP情況: 'E/MediaPlayer的:錯誤(1,-1003)' RTSP情況: 'E/MediaPlayer的錯誤:(1 - 2147483648)' – ciprianoss

回答

2

您已經添加了兩種方式的工作只是我我已經使用rtsp與wowza.Few方式,我會讓你知道

嘗試一次,讓我知道如果你有問題。如果你的流在vlc工作那麼罰款那麼應用程序端的問題。如果這些方法不起作用然後嘗試使用不同的手機。它也可以幫助你。

1. videoview嘗試

vvVideoPlay = (VideoView) findViewById(R.id.vvVideoPlay); 
MediaController mediaController = new MediaController(this); 

String videoUrl = "rtsp://192.168.1.143:8554/vid.mp4"; 

    mediaController.setAnchorView(vvVideoPlay); 
    Uri uri = Uri.parse(videoUrl); 
    vvVideoPlay.setVideoURI(uri); 
    vvVideoPlay.setMediaController(mediaController); 
    vvVideoPlay.requestFocus(); 

    vvVideoPlay.setOnPreparedListener(new OnPreparedListener() { 

     @Override 
     public void onPrepared(MediaPlayer mp) { 

      mp.start(); 
      pdialog.dismiss(); 
      mp.setOnVideoSizeChangedListener(new OnVideoSizeChangedListener() { 

       @Override 
       public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { 

        mp.start(); 
       } 
      }); 
     } 
    }); 

2.直接您的手機玩家嘗試

startActivity(new Intent(Intent.ACTION_VIEW, 
       Uri.parse("rtsp://192.168.1.143:8554/vid.mp4"))); 

3.第三方式嘗試與該庫自定義播放器在你的應用程序。

Step1。將它添加到您的gradle這個

compile "fm.jiecao:jiecaovideoplayer:4.7.0" 

第二步。將它添加爲您的視頻以xml佈局播放。

<fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard 
    android:id="@+id/videoPlayer" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

第3步:檢查從這裏如何在課堂上使用這個庫,

public class PlayVideoActivity extends BaseActivity { 

@BindView(R.id.videoPlayer) 
JCVideoPlayerStandard mVideoPlayer; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    restoreFromIntent(getIntent()); 
} 

@Override 
public int getLayout() { 
    return R.layout.activity_play_video; 
} 


// get video path from intent and play the video here 
private void restoreFromIntent(Intent intent) { 

    mVideoPlayer.setUp("rtsp://192.168.1.143:8554/vid.mp4" 
      , JCVideoPlayerStandard.SCREEN_LAYOUT_LIST, ""); 
} 

@Override 
public void onBackPressed() { 
    if (JCVideoPlayer.backPress()) { 
     return; 
    } 
    super.onBackPressed(); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    JCVideoPlayer.releaseAllVideos(); 
} 
} 

希望這將幫助您解決您的problem.Thanks

+0

謝謝你的回答,我今天晚些時候會試一試,看看它是否有效。我不認爲你理解了一些東西,我可以用VLC播放我的流,但不能用我自己的代碼播放,但測試鏈接流在我的代碼中播放..在所有情況下。 – ciprianoss

+0

是的,我明白了你的觀點,所以多數民衆贊成的方式,我給你幾個tips.It幫助圖形和易於調試你的代碼。 – Saveen

+0

好吧,我目前正在嘗試一個我今天找到的選項,然後我會試試你的 – ciprianoss