首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >android rtsp直播流--“不能播放此视频”

android rtsp直播流--“不能播放此视频”
EN

Stack Overflow用户
提问于 2016-08-31 09:31:46
回答 2查看 5.7K关注 0票数 2
代码语言:javascript
复制
public class MainActivity extends Activity
{
    VideoView vv;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        vv = (VideoView)findViewById(R.id.videoView);

        Uri uri;
        uri=Uri.parse("rtsp://user:pass@192.168.x.x:554/cam/realmonitor?channel=1&subtype=1");
        vv.setVideoURI(uri);
        vv.start();
    }
}

我正在使用上面的代码,试图播放我的IP直播摄像头流。在VLC播放器中使用时,使用的URI可以工作。我的清单中也设置了互联网权限。但是当我在我的模拟器上运行这个应用程序时,我会得到“不能播放这个视频”的错误。

logcat中弹出的错误是:

代码语言:javascript
复制
08-31 09:21:15.602 2487-2487/package D/MediaPlayer: Couldn't open file on client side, trying server side
08-31 09:21:15.612 2487-2503/package W/MediaPlayer: info/warning (701, 0)
08-31 09:21:15.666 2487-2502/package E/MediaPlayer: error (1, -2147483648)
08-31 09:21:15.725 2487-2487/package E/MediaPlayer: Error (1,-2147483648)
08-31 09:21:15.725 2487-2487/package D/VideoView: Error: 1,-2147483648

我也尝试过和媒体播放器建立这样的关系:

代码语言:javascript
复制
public class MainActivity extends Activity implements MediaPlayer.OnPreparedListener, SurfaceHolder.Callback
{
    final static String USERNAME = "user";
    final static String PASSWORD = "pass";
    final static String RTSP_URL = "rtsp://192.168.x.x:554/cam/realmonitor?channel=1&subtype=00";

    private MediaPlayer _mediaPlayer;
    private SurfaceHolder _surfaceHolder;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        Window window = getWindow();
        window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        window.setBackgroundDrawableResource(android.R.color.black);
        setContentView(R.layout.activity_main);
        SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
        _surfaceHolder = surfaceView.getHolder();
        _surfaceHolder.addCallback(this);
        _surfaceHolder.setFixedSize(320, 240);
    }
    @Override
    public void surfaceChanged(SurfaceHolder sh, int f, int w, int h) {}
    @Override
    public void surfaceCreated(SurfaceHolder sh) {
        _mediaPlayer = new MediaPlayer();
        _mediaPlayer.setDisplay(_surfaceHolder);
        Context context = getApplicationContext();
        Map<String, String> headers = getRtspHeaders();
        Uri source = Uri.parse(RTSP_URL);
        try {
            _mediaPlayer.setDataSource(context, source, headers);
            _mediaPlayer.setOnPreparedListener(this);
            _mediaPlayer.prepareAsync();
        }
        catch (Exception e) {}
    }
    @Override
    public void surfaceDestroyed(SurfaceHolder sh) {
        _mediaPlayer.release();
    }
    private Map<String, String> getRtspHeaders() {
        Map<String, String> headers = new HashMap<String, String>();
        String basicAuthValue = getBasicAuthValue(USERNAME, PASSWORD);
        headers.put("Authorization", basicAuthValue);
        return headers;
    }
    private String getBasicAuthValue(String usr, String pwd) {
        String credentials = usr + ":" + pwd;
        int flags = Base64.URL_SAFE | Base64.NO_WRAP;
        byte[] bytes = credentials.getBytes();
        return "Basic " + Base64.encodeToString(bytes, flags);
    }
    @Override
    public void onPrepared(MediaPlayer mp) {
        _mediaPlayer.start();
    }
}

上面的代码是从这里中提取的,但是它们都没有工作。我也尝试过Vitamio库,但没有结果。我所做的一切似乎都没有用。

我有没有遗漏任何细节?我假设URI很好,因为它在VLC播放器中工作得很好。在某个时候,模拟器也给出了一个"java.io.FileNotFoundException: No“,但不再提供了。

有一段时间,我认为身份验证可能是个问题,所以我使用VLC传输IP摄像头,没有用户/pass,并试图连接,但这也不起作用,所以我假设它成功地进行了身份验证。

我还尝试将url传递为"rtsp://user:pass@192.168.x.x:554/",这也适用于VLC player。但不是在我的应用程序里。

我尝试了我所能找到的一切,但都没有成功。如果有人能帮忙的话,我将不胜感激!

编辑1: VideoView已经能够成功地播放预先录制的剪辑,如"rtsp://mpv.cdn3.bigCDN.com:554/bigCDN/definst/mp4:bigbuckbunnyiphone_400.mp4“,与vitamio和mediaplayer相同。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-31 09:39:06

您正在尝试在VideoView中播放该视频。不幸的是,VideoView不支持试图使用RTSP协议播放的视频。

您可以使用一个名为维塔米诺的库使用RTSP播放视频。您可以查看他们的演示这里

票数 1
EN

Stack Overflow用户

发布于 2016-10-05 18:55:36

您可以使用LibVLC安卓库来实现VLC播放器VLC播放器。它使用rtsp://user:pass@192.168.x.x:554格式的RTSP url。下面是一个简单易用的示例MyLibVlc

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39245827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档