当前位置: 首页 > 知识库问答 >
问题:

RTSP视频未在Android MediaPlayer中播放

宋唯
2023-03-14

RTSP视频可以在Android MediaPlayer中播放吗?如果是,怎么做?我得到的服务器死亡错误(100,0)这是我的编码部分包com的错误。实例样本媒体;

import java.io.IOException;

import android.app.Activity;
import android.media.AudioManager;
import android.media.ExifInterface;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnErrorListener;
import android.net.Uri;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.widget.MediaController;
import android.widget.VideoView;

public class MainActivity extends Activity implements Callback,
        OnPreparedListener,OnBufferingUpdateListener,OnErrorListener {
    MediaPlayer mediaPlayer;
    SurfaceHolder surfaceHolder;
    SurfaceView playerSurfaceView;
    String videoSrc = "rtsp://r3---sn-a5m7zu7s.c.youtube.com/CiILENy73wIaGQnZtkPljfg7OhMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp";

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

        playerSurfaceView = (SurfaceView) findViewById(R.id.playersurface);

        surfaceHolder = playerSurfaceView.getHolder();
        surfaceHolder.addCallback(this);
    }

    @Override
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub

    }

    @Override
    public void surfaceCreated(SurfaceHolder arg0) {

        try {
            mediaPlayer = new MediaPlayer();
            mediaPlayer.setDisplay(surfaceHolder);
            mediaPlayer.setDataSource(videoSrc);
            mediaPlayer.prepare();
            mediaPlayer.setOnPreparedListener(this);
            mediaPlayer.setOnBufferingUpdateListener(this);
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mediaPlayer.setOnErrorListener(this);

        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onPrepared(MediaPlayer mp) {
        mediaPlayer.start();
    }

    @Override
    public void onBufferingUpdate(MediaPlayer mp, int percent) {
        mp = this.mediaPlayer;
        percent = 90;
    }

    @Override
    public boolean onError(MediaPlayer arg0, int arg1, int arg2) {
        // TODO Auto-generated method stub
        return true;
    }




}

这是我的Logcat结果,我得到的结果是07-09 12:17:05.484:E/MediaPlayer(3990):error(1,-2147483648)07-09 12:17:05.484:W/System。err(3990):java。木卫一。IOException:准备失败:状态=0x1 07-09 12:17:05.494:W/系统。err(3990):在android上。媒体媒体播放器。制备(天然方法)07-09 12:17:05.494:W/系统。错误(3990):在com。实例抽样媒体。主要活动。surfaceCreated(MainActivity.java:52)07-09 12:17:05.494:W/系统。err(3990):在android上。看法SurfaceView。更新域名(SurfaceView.java:1126)07-09 12:17:05.494:W/System。err(3990):在android上。看法SurfaceView。访问$000(SurfaceView.java:88)07-09 12:17:05.494:W/系统。err(3990):在android上。看法SurfaceView 3美元。onPreDraw(SurfaceView.java:186)07-0912:17:05.494:W/System。err(3990):在android上。看法ViewTreeObserver。dispatchOnPreDraw(ViewTreeObserver.java:590)07-09 12:17:05.494:W/System。err(3990):在android上。看法ViewRootImpl。performTraversals(ViewRootImpl.java:1642)07-09 12:17:05.494:W/System。err(3990):在android上。看法ViewRootImpl。handleMessage(ViewRootImpl.java:2467)07-09 12:17:05.494:W/System。err(3990):在android上。操作系统。处理程序。dispatchMessage(Handler.java:99)07-09 12:17:05.494:W/System。err(3990):在android上。操作系统。活套。loop(Looper.java:137)07-09 12:17:05.494:W/系统。err(3990):在android上。应用程序。活动线程。main(ActivityThread.java:4424)07-0912:17:05.494:W/System。err(3990):在java。朗。反思。方法调用(本机方法)07-09 12:17:05.494:W/系统。err(3990):在java。朗。反思。方法调用(Method.java:511)07-0912:17:05.494:W/System。错误(3990):在com.Android内部的操作系统。ZygoteInit$MethodandArgscaler。运行(ZygoteInit.java:784)07-0912:17:05.494:W/System。错误(3990):在com.Android内部的操作系统。合子体。main(ZygoteInit.java:551)07-0912:17:05.494:W/系统。厄尔(3990):在达尔维克。系统原生艺术。主(本机方法)07-09 12:17:05.574:I/MediaPlayer(3990):信息(701,0)07-09 12:17:07.784:W/AudioSystem(3990):AudioFlinger服务器已死亡!2007-09 12:17:07.784:W/IMediaDeathNotifier(3990):媒体服务器死亡07-09 12:17:07.784:E/MediaPlayer(3990):错误(100,0)07-09 12:17:07.784:E/MediaPlayer(3990):错误(100,0)07-09 12:17:07.784:E/MediaPlayer(3990):错误(100,0)07-09 12:17:07.784:E/MediaPlayer(3990):错误(100,0)

共有1个答案

贺华容
2023-03-14

当然,你可以考虑RTSP是Android MediaPlayer支持的格式之一。这里有一个简短的例子,说明如何从youtube播放RTSP。

      public void startPlayer(final String videoSrc, final SurfaceHolder holder) {

      videoSource = "rtsp://v6.cache1.c.youtube.com/CjYLENy73wIaLQkDsLHya4-" +
            "Z9hMYDSANFEIJbXYtZ29vZ2xlSARSBXdhdGNoYKX4k4uBjbOiUQw=/0/0/0/video.3gp";

      if (videoSource != null) {

        if (mediaPlayer != null) {
            mediaPlayer.stop();
        }
        try {

            mediaPlayer = new MediaPlayer();

            final Surface surface = holder.getSurface();

            if (surface == null) {
                return;
            }

            mediaPlayer.setDisplay(holder);
            mediaPlayer.setDataSource(videoSrc);
            mediaPlayer.prepare();
            mediaPlayer.setOnPreparedListener(this);
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        } catch (final IllegalArgumentException e) {
            e.printStackTrace();
        } catch (final SecurityException e) {
            e.printStackTrace();
        } catch (final IllegalStateException e) {
            e.printStackTrace();
        } catch (final IOException e) {
            e.printStackTrace();
        }
        }
      }

      @Override
      public void onPrepared(final MediaPlayer mp) {
      Log.i(tag, "onPrepared...mediaPlayer.start()");
      try {
          mediaPlayer.start();
      } catch (final Exception e) {
          e.printStackTrace();
      }
  }

希望有帮助;)

 类似资料:
  • 我正在开发一个应用程序,我使用了谷歌的ExoPlayer,它工作起来很有魅力,现在我想在我的应用程序中添加RTSP支持,但使用ExoPlayer我无法播放,请任何人都可以帮我,如果有人有其他选择,请与我分享。 日志 E/ExoPlayerImplInternal:源错误。网蝴蝶电视。rtmp_客户端。RtmpClient$RtmpIOException at net。蝴蝶电视。rtmp_客户端。R

  • 我目前正在开发一个需要解码UDP多播RTSP流的应用程序。目前,我可以通过ffplay查看RTP流 但是,我尝试使用FFMPEG通过(为了简洁起见,删除了错误检查和清理代码)打开UDP流。 这种方法适用于包含原始编码视频流的文件输入,但对于UDP多播RTSP流,它无法通过对执行的任何错误检查。请告知...

  • 我遵循了一些关于将JavaFX与Swing(JFrame)结合起来播放视频的教程,但是我得到的只是一个黑屏,视频应该没有任何实际的内容播放,也没有错误报告。 我在这里做错了什么,为什么视频不播放? 我尝试了几个. flv视频,没有一个会开始播放(当我在浏览器中打开它们时,它们确实会播放) 我正在运行jre7和jdk1。安装了K-lite完整编解码器包的windows 8.1 N Pro上的7.0_

  • 我在一个回收视图中有几张卡片。每张卡都有一个自定义视频视图。单击视频视图,视频应开始。然而,在我的例子中,它只显示蓝色边框,视频没有运行。代码如下所示, 自定义卡视图。xml: 自定义视频视图: 主要活动: activity\u main。xml: 我希望每张卡最初只显示一个缩略图。单击视频后,相关卡应启动视频(不是全部)。视频启动时,VideoView应占据整个屏幕。我怎样才能做到这一点? 谢谢