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
У меня были похожие проблемы. Вот мое решение.
Убедитесь, что вы импортировали библиотеку как импортированный модуль через Android Studio.
Дайте вашему манифесту разрешение на использование необходимых ресурсов
Используйте этот код для вас
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 }
с помощью VLC player откройте открытый сетевой поток и наберите
rtsp:// ip устройства Android:1234 <- этот порт жестко запрограммирован, поэтому не меняйте
))) первый пример - сервер (для автора библиотеки сервер - это тот, кто принимает поток и не дает) вам нужно использовать 2 или 3 примера... 2 пример хорош, потому что вам нужен только VLK игрок...
узнайте свой Ip (cmd-> ipconfig) (важно понимать, что устройство должно иметь внешний IP-адрес или находится в той же сети)
- Укажите полученный IP-адрес ПК в mEditText (mSession.setDestination ();)
- После запуска приложения нажмите кнопку запуска. Студия в журналах вернет содержимое для создания файла формата sdp (TAG, mSession.getSessionDescription ());
создайте ошибку, например, 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, но многие другие версии не воспроизводили поток.