it-swarm.com.ru

VLC RTSP прямой эфир к Android

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

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

  • HTTP-поток:

    ./vlc -vvv decklink:// --sout
    '#transcode{vcodec=mp4v,acodec=mpga,vb=56,ab=24,channels=1}
    :standard{access=http{use-key-frames},mux=ts,dst=:3001/stream.mpeg}'
    

Он работает в 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
  • размер: 176x144

    ./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 или пс в 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

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

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

Если кто-нибудь может помочь ...!

10
Tim Autin

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

7
Tim Autin

Используйте MediaPlayer , он поддерживает сетевые протоколы HTTP и RTSP. http://developer.Android.com/guide/topics/media/mediaplayer.html#mediaplayerhttp://developer.Android.com/guide/appendix/media-formats. HTML # рекомендации

0
Rehman Zafar

пожалуйста попробуйте VLC:

vlc some_file.mp4 -I http --sout "#transcode {soverlay, ab = 128, samplerate = 44100, channel = 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();
        }
0
Albert Chen

Я проверил мой сервер 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.

0
Robert