3

我正在尝试将 VLC 用作 RTSP 客户端。RTSP 服务器基于libstreaming库。我正在使用第一个示例提供的代码:

        // Sets the port of the RTSP server to 1234
        Editor editor = PreferenceManager.getDefaultSharedPreferences(this).edit();
        editor.putString(RtspServer.KEY_PORT, String.valueOf(1234));
        editor.commit();

        // Configures the SessionBuilder
        SessionBuilder.getInstance()
        .setSurfaceView(mSurfaceView)
        .setPreviewOrientation(90)
        .setContext(getApplicationContext())
        .setAudioEncoder(SessionBuilder.AUDIO_NONE)
        .setVideoEncoder(SessionBuilder.VIDEO_H264);

        // Starts the RTSP server
        this.startService(new Intent(this,RtspServer.class));

安卓应用启动;我尝试使用 VLC ( open a stream) 和这个 URL 访问流:

rtsp://192.168.43.250:1234

该设备连接到同一个网络(我可以 ping 它),但 android 应用程序中没有任何反应,VLC 显示“连接失败”窗口。

知道问题出在哪里吗?也许是一个错误的 URL,但我找不到这种情况的任何详细示例。

4

4 回答 4

4

它抛出空指针,检查logcat。

您必须将网址提供为 rtsp://ip:1234?h264=200-20-320-240

200 - buf 20 - fps 320 - 分辨率 w 240 - 分辨率 h

于 2015-10-23T05:20:44.090 回答
2

我有类似的问题。这是我的解决方案。

  1. 确保您已通过 android studio 将库作为导入模块导入

  2. 授予清单使用所需资源的权限

  3. 为您使用此代码 MainActivity:

    public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, RtspServer.CallbackListener, Session.Callback{
    
        private final static String TAG = "MainActivity";
    
        private SurfaceView mSurfaceView;
        private  Session mSession;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    
    
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
    
            setContentView(R.layout.activity_main);
    
            mSurfaceView = (SurfaceView) findViewById(R.id.surface);
    
    
    
    
            // Sets the port of the RTSP server to 1234
            SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(this).edit();
            editor.putString(  RtspServer.KEY_PORT, String.valueOf(1234));
            editor.commit();
    
    
    
            // Configures the SessionBuilder
           mSession =  SessionBuilder.getInstance()
                .setCallback(this)
                .setSurfaceView((net.majorkernelpanic.streaming.gl.SurfaceView) mSurfaceView)
                .setPreviewOrientation(90)
                .setContext(getApplicationContext())
                .setAudioEncoder(SessionBuilder.AUDIO_AAC)
                .setAudioQuality(new AudioQuality(8000, 16000))
                .setVideoEncoder(SessionBuilder.VIDEO_H264)
                //.setVideoQuality(new VideoQuality(320,240,20,500000))
                .build();
    
            mSurfaceView.getHolder().addCallback(this);
    
            ((net.majorkernelpanic.streaming.gl.SurfaceView) mSurfaceView).setAspectRatioMode(net.majorkernelpanic.streaming.gl.SurfaceView.ASPECT_RATIO_PREVIEW);
            String ip, port, path;
    
            // Starts the RTSP server
            this.startService(new Intent(this,RtspServer.class));
    
            Log.d("test", "1");
    
    
    
            mSession.startPreview(); //camera preview on phone surface
            mSession.start();
    
        }
    
        @Override
        public void onResume()
        {
            super.onResume();
            mSession.stopPreview();
        }
    
        @Override
        public void onDestroy()
        {
            super.onDestroy();
            mSession.release();
            mSurfaceView.getHolder().removeCallback(this);
        }
    
        //region   ----------------------------------implement methods required
        @Override
        public void onError(RtspServer server, Exception e, int error) {
            Log.e("Server", e.toString());
        }
    
        @Override
        public void onMessage(RtspServer server, int message) {
            Log.e("Server", "unkown message");
        }
    
        @Override
        public void onBitrateUpdate(long bitrate) {
    
        }
    
        @Override
        public void onSessionError(int reason, int streamType, Exception e) {
    
        }
    
        @Override
        public void onPreviewStarted() {
    
        }
    
        @Override
        public void onSessionConfigured() {
    
        }
    
        @Override
        public void onSessionStarted() {
    
        }
    
        @Override
        public void onSessionStopped() {
    
        }
    
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
    
        }
    
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    
        }
    
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
    
        }
    
        //endregion
    }
    
  4. 使用 VLC 播放器打开开放的网络流并输入

rtsp://android 设备的 ip:1234 <--这个端口是硬编码的所以不要改变

于 2017-04-18T19:40:34.080 回答
0

当我使用 libstreaming 和 VLC 时,我花了很多时间来解决同样的问题。我的解决方案是使用其他 VLC 版本。例如,它在 vlc 版本上对我有用。1.0.5,但许多其他版本没有播放流。

于 2015-11-01T10:54:28.237 回答
0

))) 第一个示例是服务器(对于库的作者,服务器是接受流但不提供的人)您需要使用 2 或 3 个示例... 2 个示例很好,因为您只需要一个VLK播放器...

  1. 找出你的IP(cmd-> ipconfig)(重要的是要了解设备必须有一个外部IP地址或在同一个网络中)

    1. 在mEditText中指定接收到的PC的ip地址(mSession.setDestination();)
    2. 启动应用程序后,按开始按钮。日志中的studio会返回创建sdp格式文件的内容(TAG,mSession.getSessionDescription());
    3. 例如创建一个 falix 1.sdp 通过指定 getSessionDescription 的内容(删除多余的空格)来编辑它 巨大的分钟然后我们需要指定我们想要将流发送到的那个的 ip ...

       现在最重要的是!在任何示例中,结果都不是简单地输入 rtsp: //192.168.43.250: 1234 并获取视频!- 0)))))))

         在 Session 类中,你会发现 mOrigin = "127.0.0.1"; 好的 SessionBuilder .... .setOrigin ("192.xxx.xxx.xx")

       此外,您的逻辑可能表明您只需要找到端口,也许您会找到 SessionBuilder Session build () video.setDestinationPorts (5006); 但这不是端口)))

       在这个库中没有 rtsp 服务器实现(我正在写一个服务器,因为这意味着我们要为设备上的 ip cam 提升服务器)你可以在 RtspClient 类中找到提示(注意作者库,这是提供它的人),作者在那里写信给我们 * RFC 2326。 * 一个基本的异步 RTSP 客户端。与 Wowza 兼容的 RTSP 客户端。* 它根据 RFC 2069 实现摘要式访问身份验证。

于 2017-09-11T18:36:52.203 回答