Libstreaming - использовать VLC в качестве клиента RTSP

Я пытаюсь использовать 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));

Запустится приложение для Android; Я пытаюсь получить доступ к потоку с помощью VLC (open a stream) и этот URL:

rtsp://192.168.43.250:1234

Устройство подключено к той же сети (я могу пинговать его), но в приложении для Android ничего не происходит, и VLC отображает окно "сбой соединения".

Есть идеи, где проблема? Возможно, плохой URL, но я не могу найти подробный пример этой ситуации.

4 ответа

Выдает нулевой указатель, проверьте logcat.

Вы должны предоставить URL-адрес в виде rtsp:// IP:1234? H264 = 200-20-320-240

200 - buf 20 - fps 320 - разрешение w 240 - разрешение h

У меня были похожие проблемы. Вот мое решение.

  1. Убедитесь, что вы импортировали библиотеку как импортированный модуль через Android Studio.

  2. Дайте вашему манифесту разрешение на использование необходимых ресурсов

  3. Используйте этот код для вас

    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 player откройте открытый сетевой поток и наберите

rtsp:// ip устройства Android:1234 <- этот порт жестко запрограммирован, поэтому не меняйте

))) первый пример - сервер (для автора библиотеки сервер - это тот, кто принимает поток и не дает) вам нужно использовать 2 или 3 примера... 2 пример хорош, потому что вам нужен только VLK игрок...

  1. узнайте свой Ip (cmd-> ipconfig) (важно понимать, что устройство должно иметь внешний IP-адрес или находится в той же сети)

    1. Укажите полученный IP-адрес ПК в mEditText (mSession.setDestination ();)
    2. После запуска приложения нажмите кнопку запуска. Студия в журналах вернет содержимое для создания файла формата sdp (TAG, mSession.getSessionDescription ());
    3. создайте ошибку, например, 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-клиент.  RTSP клиент, совместимый с Wowza.  * Он реализует дайджест-аутентификацию доступа в соответствии с RFC 2069.

Когда я работал с libstreaming & VLC, я проводил много времени с той же проблемой. Решение для меня состояло в том, чтобы использовать другую версию VLC. Например, у меня это сработало на vlc ver. 1.0.5, но многие другие версии не воспроизводили поток.

Другие вопросы по тегам