Intereting Posts
IntelliJ Idea, дающая java.lang.OutOfMemoryError: ошибка кучи Java даже после увеличения размера кучи Android: сила прокрутки в нижней части Если я объявляю фрагмент в XML-макете, как передать его Bundle? Сравнение производительности и удобства использования Android JSON-библиотек Получить идентификатор электронной почты и имя из встроенной телефонной книги Android. Как добавить индикатор загрузки в AutoCompleteTextView В чем разница между линейным и относительным расположением? Частное развертывание / установка приложений для Android? Как я могу создавать HTML-страницы, которые автоматически корректируют свои изображения на разные размеры экрана для мобильных устройств? Как исключить определенные сообщения по имени TAG с помощью Android adb logcat? Как осуществлять программный контроль громкости системы Android Создайте рябь без прозрачности Как я могу отдать бесплатную копию моего платного Android-приложения? Текстовое изображение потока вокруг изображения Загрузить видео в facebook в android

Прямой эфир VLC RTSP для Android

Для моего приложения я должен передавать с карты decklink в приложение для Android (я должен быть потоком в прямом эфире, поэтому либо HLS, либо RTSP, кажется, являются хорошими решениями, поскольку мое приложение предназначено для Android 3+). Я перекомпилировал VLC с decklink sdk, и я могу транслировать поток на другой компьютер по сети (но он работает только с 60 секундами с RTSP).

Вот что я пробовал:

Он работает в Android VLC 0.0.11, но только в WiFi, а не в 3G. И я не могу воспроизвести его в своем приложении с помощью VideoView. Вот код, который я использовал, и соответствующие сообщения об ошибках:

 String url = "http://134.246.63.169:5554/stream.mpeg"; VideoView videoView = (VideoView) this.findViewById(R.id.videoView); videoView.setVideoURI(Uri.parse(url)); videoView.setMediaController(new MediaController(this)); videoView.requestFocus(); videoView.start(); 

Сообщения об ошибках :

 04-08 15:26:46.272: D/MediaPlayer(16349): Couldn't open file on client side, trying server side 04-08 15:26:46.272: V/ChromiumHTTPDataSource(7680): connect on behalf of uid 1080867789 04-08 15:26:46.272: I/ChromiumHTTPDataSource(7680): connect to http://134.246.63.169:8554/ @0 04-08 15:26:46.302: I/AwesomePlayer(7680): AwesomePlayer::AwesomePlayer()in 04-08 15:26:46.302: I/AwesomePlayer(7680): AwesomePlayer::AwesomePlayer()aftermClient.connect() 04-08 15:26:46.302: I/AwesomePlayer(7680): setDataSource_l('http://134.246.63.169:5554/') 04-08 15:26:46.302: W/MediaPlayer(16349): info/warning (701, 0) 04-08 15:26:46.302: V/ChromiumHTTPDataSource(7680): connect on behalf of uid 10067 04-08 15:26:46.302: I/ChromiumHTTPDataSource(7680): connect to http://134.246.63.169:5554/ @0 04-08 15:26:46.342: I/ActivityManager(272): Displayed fr.ifremer.testrtsp/.MainActivity: +183ms 04-08 15:26:46.382: I/MediaPlayer(16349): Info (701,0) 04-08 15:27:07.592: E/MediaPlayer(16349): error (1, -2147483648) 04-08 15:27:07.592: E/MediaPlayer(16349): Error (1,-2147483648) 
  • RTSP:

Я использовал параметры кодирования, рекомендованные Google на этой странице , например:

  • Видео кодек: h264
  • Аудиокодек: AAC
  • Битрейт видео: 56
  • Битрейт аудио: 24
  • Звуковые каналы: 1
  • Размер: 176×144

     ./vlc -vvv decklink:// --sout-ffmpeg-strict=-2 --sout '#transcode{width=176,height=144,vcodec=h264,acodec=mp4a,vb=56,ab=24,channels=1} :rtp{dst=134.246.63.169,port-video=5554,port-audio=5556,sdp=rtsp://134.246.63.169:5554/stream.sdp}' 

Я могу воспроизводить поток на рабочем столе VLC, но не в Android (даже в версии Android VLC или по умолчанию для видеоплеера Google: /). Если я не укажу мультиплеер, я также могу воспроизвести его в QuickTime (если я укажу мультиплекс, либо ts, либо ps, у меня нет видео. Если я попробую другой мультиплексор, VLC говорит мне, что мне разрешено использовать ts Или ps в RTP)

Если я попытаюсь использовать видеоплеер Google, я получаю эти сообщения в локации:

 04-08 15:32:45.792: D/MediaPlayer(13688): Couldn't open file on client side, trying server side 04-08 15:32:45.802: W/MediaPlayer(13688): info/warning (701, 0) 04-08 15:32:45.812: I/MediaPlayer(13688): Info (701,0) 04-08 15:32:45.812: D/MediaPlayer(13688): getMetadata 04-08 15:32:45.812: E/MediaPlayerService(7680): getMetadata failed -38 04-08 15:32:45.852: I/MyHandler(7680): connection request completed with result 0 (Success) 04-08 15:32:45.882: I/ARTSPConnection(7680): status: RTSP/1.0 200 OK 04-08 15:32:45.882: I/MyHandler(7680): DESCRIBE completed with result 0 (Success) 04-08 15:32:45.882: I/ASessionDescription(7680): v=0 04-08 15:32:45.882: I/ASessionDescription(7680): o=- 15352003113363922923 15352003113363922923 IN IP4 to63-169.ifremer.fr 04-08 15:32:45.882: I/ASessionDescription(7680): s=Unnamed 04-08 15:32:45.882: I/ASessionDescription(7680): i=N/A 04-08 15:32:45.882: I/ASessionDescription(7680): c=IN IP4 134.246.63.169 04-08 15:32:45.882: I/ASessionDescription(7680): t=0 0 04-08 15:32:45.882: I/ASessionDescription(7680): a=tool:vlc 2.0.5 04-08 15:32:45.882: I/ASessionDescription(7680): a=recvonly 04-08 15:32:45.882: I/ASessionDescription(7680): a=type:broadcast 04-08 15:32:45.882: I/ASessionDescription(7680): a=charset:UTF-8 04-08 15:32:45.882: I/ASessionDescription(7680): a=control:rtsp://134.246.63.169:5554/stream.sdp 04-08 15:32:45.882: I/ASessionDescription(7680): m=audio 5556 RTP/AVP 96 04-08 15:32:45.882: I/ASessionDescription(7680): b=AS:24 04-08 15:32:45.882: I/ASessionDescription(7680): b=RR:0 04-08 15:32:45.882: I/ASessionDescription(7680): a=rtpmap:96 mpeg4-generic/48000 04-08 15:32:45.882: I/ASessionDescription(7680): a=fmtp:96 streamtype=5; profile-level-id=15; mode=AAC-hbr; config=118856e500; SizeLength=13; IndexLength=3; IndexDeltaLength=3; Profile=1; 04-08 15:32:45.882: I/ASessionDescription(7680): a=control:rtsp://134.246.63.169:5554/stream.sdp/trackID=0 04-08 15:32:45.882: I/ASessionDescription(7680): m=video 5554 RTP/AVP 96 04-08 15:32:45.882: I/ASessionDescription(7680): b=AS:56 04-08 15:32:45.882: I/ASessionDescription(7680): b=RR:0 04-08 15:32:45.882: I/ASessionDescription(7680): a=rtpmap:96 H264/90000 04-08 15:32:45.882: I/ASessionDescription(7680): a=fmtp:96 packetization-mode=1;profile-level-id=64000b;sprop-parameter-sets=Z2QAC6zZQsTv/AC0ALBAAAADAEAAAAyjxQplgA==,aOvssiw=; 04-08 15:32:45.882: I/ASessionDescription(7680): a=control:rtsp://134.246.63.169:5554/stream.sdp/trackID=1 04-08 15:32:45.982: I/ARTSPConnection(7680): status: RTSP/1.0 200 OK 04-08 15:32:45.982: I/MyHandler(7680): SETUP(1) completed with result 0 (Success) 04-08 15:32:45.982: I/MyHandler(7680): server specified timeout of 60 secs. 04-08 15:32:45.992: W/MyHandler(7680): Missing 'source' field in Transport response. Using RTSP endpoint address. 04-08 15:32:45.992: I/APacketSource(7680): dimensions 176x144 04-08 15:32:46.012: I/ARTSPConnection(7680): status: RTSP/1.0 200 OK 04-08 15:32:46.022: I/MyHandler(7680): SETUP(2) completed with result 0 (Success) 04-08 15:32:46.022: I/MyHandler(7680): server specified timeout of 60 secs. 04-08 15:32:46.022: W/MyHandler(7680): Missing 'source' field in Transport response. Using RTSP endpoint address. 04-08 15:32:46.022: W/MyHandler(7680): Server picked an odd RTP port, it should've picked an even one, we'll let it pass for now, but this may break in the future. 04-08 15:32:46.082: I/ARTSPConnection(7680): status: RTSP/1.0 200 OK 04-08 15:32:46.082: D/dalvikvm(13688): GC_FOR_ALLOC freed 303K, 7% free 9289K/9927K, paused 35ms, total 36ms 04-08 15:32:46.092: I/MyHandler(7680): PLAY completed with result 0 (Success) 04-08 15:32:46.092: I/MyHandler(7680): This is a live stream 04-08 15:32:48.262: D/AudioHardware(7680): AudioHardware pcm playback is going to standby. 04-08 15:32:48.262: D/AudioHardware(7680): closePcmOut_l() mPcmOpenCnt: 1 04-08 15:32:56.092: W/MyHandler(7680): Never received any data, switching transports. 04-08 15:32:56.112: I/ARTSPConnection(7680): status: RTSP/1.0 200 OK 04-08 15:32:56.122: I/MyHandler(7680): TEARDOWN completed with result 0 (Success) 04-08 15:32:56.122: I/MyHandler(7680): connection request completed with result 0 (Success) 04-08 15:32:56.152: I/ARTSPConnection(7680): status: RTSP/1.0 200 OK 04-08 15:32:56.152: I/MyHandler(7680): DESCRIBE completed with result 0 (Success) 04-08 15:32:56.152: I/ASessionDescription(7680): v=0 04-08 15:32:56.152: I/ASessionDescription(7680): o=- 15352003157473632156 15352003157473632156 IN IP4 to63-169.ifremer.fr 04-08 15:32:56.152: I/ASessionDescription(7680): s=Unnamed 04-08 15:32:56.152: I/ASessionDescription(7680): i=N/A 04-08 15:32:56.152: I/ASessionDescription(7680): c=IN IP4 134.246.63.169 04-08 15:32:56.152: I/ASessionDescription(7680): t=0 0 04-08 15:32:56.152: I/ASessionDescription(7680): a=tool:vlc 2.0.5 04-08 15:32:56.152: I/ASessionDescription(7680): a=recvonly 04-08 15:32:56.152: I/ASessionDescription(7680): a=type:broadcast 04-08 15:32:56.152: I/ASessionDescription(7680): a=charset:UTF-8 04-08 15:32:56.152: I/ASessionDescription(7680): a=control:rtsp://134.246.63.169:5554/stream.sdp 04-08 15:32:56.152: I/ASessionDescription(7680): m=audio 5556 RTP/AVP 96 04-08 15:32:56.152: I/ASessionDescription(7680): b=AS:24 04-08 15:32:56.152: I/ASessionDescription(7680): b=RR:0 04-08 15:32:56.152: I/ASessionDescription(7680): a=rtpmap:96 mpeg4-generic/48000 04-08 15:32:56.152: I/ASessionDescription(7680): a=fmtp:96 streamtype=5; profile-level-id=15; mode=AAC-hbr; config=118856e500; SizeLength=13; IndexLength=3; IndexDeltaLength=3; Profile=1; 04-08 15:32:56.152: I/ASessionDescription(7680): a=control:rtsp://134.246.63.169:5554/stream.sdp/trackID=0 04-08 15:32:56.152: I/ASessionDescription(7680): m=video 5554 RTP/AVP 96 04-08 15:32:56.152: I/ASessionDescription(7680): b=AS:56 04-08 15:32:56.152: I/ASessionDescription(7680): b=RR:0 04-08 15:32:56.152: I/ASessionDescription(7680): a=rtpmap:96 H264/90000 04-08 15:32:56.152: I/ASessionDescription(7680): a=fmtp:96 packetization-mode=1;profile-level-id=64000b;sprop-parameter-sets=Z2QAC6zZQsTv/AC0ALBAAAADAEAAAAyjxQplgA==,aOvssiw=; 04-08 15:32:56.152: I/ASessionDescription(7680): a=control:rtsp://134.246.63.169:5554/stream.sdp/trackID=1 04-08 15:32:56.222: I/ARTSPConnection(7680): status: RTSP/1.0 461 Unsupported transport 04-08 15:32:56.222: I/MyHandler(7680): SETUP(1) completed with result 0 (Success) 04-08 15:32:56.222: I/APacketSource(7680): dimensions 176x144 04-08 15:32:56.242: I/ARTSPConnection(7680): status: RTSP/1.0 461 Unsupported transport 04-08 15:32:56.252: I/MyHandler(7680): SETUP(2) completed with result 0 (Success) 04-08 15:32:56.272: E/MediaPlayer(13688): error (1, -2147483648) 04-08 15:32:56.272: E/MediaPlayer(13688): Error (1,-2147483648) 04-08 15:32:56.272: D/VideoView(13688): Error: 1,-2147483648 

Я думаю, проблема связана с «статусом: RTSP / 1.0 461 Unsupported transport», но я не вижу, что я могу изменить: я уже открываю порты, которые я использую, и получаю видео на другом компьютере.

На телефоне Android я могу воспроизвести некоторые потоки rtsp, которые я нашел в Интернете, например: rtsp: //184.72.239.149/vod/mp4: BigBuckBunny_115k.mov. Так что это должно быть возможно.

Если кто-то может помочь …!

Solutions Collecting From Web of "Прямой эфир VLC RTSP для Android"

Наконец, это была сетевая проблема, я подключал свои устройства через совместное использование MacBook WiFi, и кажется, что он заблокировал поток RTSP. Теперь я использую маршрутизатор, и он работает в RTSP (я все еще не могу получить HTTP-поток в Android VideoView). Тем не менее, у меня все еще есть проблема с тайм-аутом: поток RTSP прекращается через 60 секунд, потому что VideoView не отправляет сообщения keep alive. Я постараюсь сделать это сам …

Я тестировал свой сервер rtsp с помощью команды openRTSP.

Это порты UDP были заблокированы.

Если доступ к rtsp без -t:

 -> $ openRTSP <rtsp_url> 

Я получил журнал, говорящий мне:

 // omit lots of lines.. Created receiver for "video/H264" subsession (client ports 63346-63347) Sending request: SETUP rtsp://61.218.52.250:554/live/ch00_0/trackID=0 RTSP/1.0 CSeq: 4 User-Agent: openRTSP (LIVE555 Streaming Media v2013.12.16) Transport: RTP/AVP;unicast;client_port=63346-63347 Received 47 new bytes of response data. Received a complete SETUP response: RTSP/1.0 461 Unsupported Transport CSeq: 4 Failed to setup "video/H264" subsession: 461 Unsupported Transport 

Поэтому переход на TCP с помощью:

 -> $ openRTSP -t <rtsp_url> 

Он начинает получать данные успешно.

 // omit lots of lines.. Opened URL "rtsp://61.218.52.250:554/live/ch00_0", returning a SDP description: v=0 o=- 1 1 IN IP4 127.0.0.1 s=Ubiquiti Live i=UBNT Streaming Media c=IN IP4 0.0.0.0 t=0 0 m=video 0 RTP/AVP 99 b=AS:50000 a=framerate:25 a=x-dimensions:1280,720 a=x-vendor-id:ubnt,a521 a=x-rtp-ts:4617405454576779984 a=rtpmap:99 H264/90000 a=fmtp:99 profile-level-id=42A01E;packetization-mode=1;sprop-parameter-sets=Z0IAKOkAoAt1xIAG3dAAzf5gDYgQlA==,aM4xUg== a=control:trackID=0 Sending request: SETUP rtsp://61.218.52.250:554/live/ch00_0/trackID=0 RTSP/1.0 CSeq: 4 User-Agent: openRTSP (LIVE555 Streaming Media v2013.12.16) Transport: RTP/AVP/TCP;unicast;interleaved=0-1 Received 107 new bytes of response data. Received a complete SETUP response: RTSP/1.0 200 OK CSeq: 4 Transport: RTP/AVP/TCP;unicast;interleaved=0-1 Session: E090B5503236A1BFB7CE Setup "video/H264" subsession (client ports 54884-54885) Sending request: PLAY rtsp://61.218.52.250:554/live/ch00_0/ RTSP/1.0 CSeq: 5 User-Agent: openRTSP (LIVE555 Streaming Media v2013.12.16) Session: E090B5503236A1BFB7CE Range: npt=0.000- Received 159 new bytes of response data. Received a complete PLAY response: RTSP/1.0 200 OK CSeq: 5 Session: E090B5503236A1BFB7CE Range: npt=now- RTP-Info: url=rtsp://61.218.52.250:554/live/ch00_0//trackID=0;seq=41402;rtptime=0 Started playing session Data is being streamed (signal with "kill -HUP 96432" or "kill -USR1 96432" to terminate)... Received 47 new bytes of response data. Received 1424 new bytes of response data. Received 1424 new bytes of response data. Received 1424 new bytes of response data. Received 1424 new bytes of response data. Received 1448 new bytes of response data. Received 1448 new bytes of response data. 

Ссылка на основы openRTSP.

Теперь мне нужно выяснить, как автоматически переключиться на TCP в Android.

Попробуйте VLC:

Vlc some_file.mp4 -I http -sout "#transcode {convlay, ab = 128, samplerate = 44100, channels = 2, acodec = mp4a, vcodec = h264, width = 480, height = 270, vfilter =" canvas {width = 480, высота = 270, аспект = 16: 9}», кадров в секунду = 25, VB = 800, venc = x264 {уровень = 12, нет-CABAC, subme = 20, резьба = 4, bframes = 0, мин-keyint = 1, keyint = 50}}: собрать: {mp4a RTP-latm, SDP = RTSP: //0.0.0.0: 5554 / stream.sdp}»

И код Android:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final VideoView vidView = (VideoView)findViewById(R.id.myVideo); MediaController vidControl = new MediaController(this); vidControl.setAnchorView(vidView); vidView.setMediaController(vidControl); vidView.setVideoPath("rtsp://137.110.92.231:5554/stream.sdp"); vidView.start(); }