2016-04-30 33 views
11

Tôi đang tạo ứng dụng để phát trực tiếp video từ mâm xôi pi đến thiết bị Android của mình. Tôi có ba cách chức năng chơi dòng này:Phát trực tiếp video trực tiếp RTSP

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

  1. Media Player + SurfaceView
  2. VideoView
  3. Intent.ACTION_VIEW

Vấn đề là ứng dụng đóng trên^luồng nhưng không phát của tôi (rtsp: //192.168.1.143: 8554/vid.mp4) ... nhưng VLC không.

Tôi đã thử phát trực tiếp bằng VLC và với LIVE555 ở nhiều định dạng video và tôi cũng đã thử phát video đã được ghi trên điện thoại.

Đây là mã của tôi:

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

Any help is appreciated, tôi đã cố gắng trong một tuần để có được điều này để làm việc với không thành công :(

+0

gì về cung cấp logcat của api phương tiện truyền thông android khi u cố gắng để tải rằng uri rtsp ?? trình phát phương tiện và chế độ xem video hoạt động với nó là gì? –

+0

Ok, tôi sẽ quay lại với nó vào ngày mai – ciprianoss

+0

Xin lỗi vì trả lời muộn: Trường hợp RTP: 'E/MediaPlayer ﹕ Lỗi (1, -1003)' Trường hợp RTSP: 'E/MediaPlayer ﹕ Lỗi (1, - 2147483648) ' – ciprianoss

Trả lời

2

Bạn đã bổ sung thêm hai cách chỉ i muốn thêm sửa đổi chút.Tôi đã thực hiện công việc ralalted streaming.I đã sử dụng rtsp với wowza.Đây là cách tôi sẽ cho bạn biết

hãy thử một lần và cho tôi biết nếu bạn gặp vấn đề. Nếu bạn đang phát trực tuyến trong vlc thì có vấn đề gì đó với phía ứng dụng. Nếu những phương pháp này không hoạt động sau đó thử với điện thoại khác. Nó cũng giúp bạn.

1. Hãy thử với 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. Hãy thử với máy nghe nhạc trực tiếp điện thoại của bạn

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

3. Cách thứ ba cố gắng với thư viện này với máy nghe nhạc tùy chỉnh trong của bạn ứng dụng.

Bước 1. Thêm nó vào gradle của bạn

compile "fm.jiecao:jiecaovideoplayer:4.7.0" 

Bước2. Thêm ảnh khi video của bạn phát trong bố cục xml.

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

Bước 3. Kiểm tra từ đây làm thế nào để sử dụng thư viện này trong lớp học của bạn,

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

Hy vọng điều này sẽ giúp bạn sửa chữa problem.Thanks bạn

+0

Cảm ơn câu trả lời của bạn, tôi sẽ thử nó sau ngày hôm nay và xem nó có hiệu quả không. Tôi không nghĩ rằng bạn hiểu một cái gì đó, tôi có thể chơi dòng của tôi với VLC nhưng không phải với mã của riêng tôi, tuy nhiên các dòng liên kết thử nghiệm chơi với mã của tôi .. trong mọi trường hợp. – ciprianoss

+0

vâng tôi đã hiểu điểm của bạn, vì vậy đó là cách tôi cung cấp cho bạn vài mẹo. Nó giúp hình dung và dễ dàng gỡ lỗi mã của bạn. – Saveen

+0

Ok, hiện tại tôi đang thử một tùy chọn tôi tìm thấy hôm nay, sau đó tôi sẽ thử của bạn – ciprianoss

Các vấn đề liên quan