Прямая передача видео в режиме RTSP

Я создаю приложение для трансляции потокового видео с малины pi на мое устройство Android. У меня есть три функциональных способа воспроизведения этого потока:

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

Любая помощь приветствуется, я пробовал в течение недели, чтобы заставить это работать без успеха 🙁

Solutions Collecting From Web of "Прямая передача видео в режиме RTSP"

Вы уже добавили два способа: просто хочу добавить модификацию бит. Я сделал потоковое ralalted task.I использовал rtsp с wowza. Новые способы, которые я вам сообщу

Попробуйте один раз и сообщите мне, если у вас есть проблема. Если ваша потоковая передача в vlc работает нормально, тогда что-то проблема с приложением. Если эти методы не работают, попробуйте использовать другой телефон. Это также поможет вам.

1. Попробуйте видео

 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. Третий способ попробовать с этой библиотекой с пользовательским плеером в вашем приложении.

Шаг 1. Добавьте его в свой град

 compile "fm.jiecao:jiecaovideoplayer:4.7.0" 

Шаг 2. Добавьте его в качестве воспроизведения видео в 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(); } } 

Надеюсь, это поможет вам решить вашу проблему. Спасибо.