захват потока RTSP - PullRequest
21 голосов
/ 28 октября 2011

Я ищу какой-нибудь универсальный способ вывести поток RTSP.Я хочу выяснить, что некоторый поток rtsp работает хорошо, и сервер отправляет некоторое смотрибельное видео.

openRTSP

Сначала Google рекомендует мне openRTSP инструмент.

 openRTSP -4 ${stream_link} > ${output_file}

Но выводимый видеофайл, выгруженный этим инструментом, не совсем корректен.Видеодекодер (ffdec) возвращает много ошибок, таких как «Не удалось декодировать видеопакет» и «[h264] без кадра!», Которые меня не устраивают.

ffmpeg

Затем я попытался сбросить поток rtsp с помощью инструмента ffmpeg.

ffmpeg -loglevel debug -i "${stream_link}" -s 640x480 -vcodec copy -acodec copy -y ${output_file}

Но процесс потоковой передачи часто прерывался по ошибке:

Application provided invalid, non monotonically increasing dts to muxer in stream 0: 730672 >= 730672
av_interleaved_write_frame(): Invalid argument

Я пытаюсь использовать --fflags igndts, но ffmpeg не игнорирует эти ошибки.Это не имеет никакого смысла, потому что эта ошибка фактически означает, что аудио и видео потоки отправляются асинхронно.Хуже всего то, что файл дампа, полученный в результате этого прерванного дампа, тоже не корректен.Ffdec возвращает некоторую ошибку:

ERROR [mov,mp4,m4a,3gp,3g2,mj2] moov atom not found
ERROR [ffdec] av_open_input_file: Operation not permitted

После того, как я обнаружил хорошую чашку поиска в Google, она действительно старая Ошибка мультиплексора ffmpeg .

mplayer

Чем я пытался использовать mplayer с LIVE_555 lib.

mplayer -noframedrop -dumpfile ${output_file} -dumpstream ${stream_link}

Но у меня тоже есть некоторые ошибки.

Stream not seekable!
Core dumped ;)

Вопрос

Мне кажется, я что-то не так делаю.Звучит очень смешно, что нет способа сохранить поток rtsp в правильном и воспроизводимом видеофайле.

Может быть, есть другие инструменты, которые могут помочь с этой задачей?На самом деле, я буду благодарен за любые советы для всех видов библиотек и языков.Но этот процесс должен быть автоматическим и иметь кли.

уточнения

Что-то около 50% экспериментов, которые я провел на локальном хосте с vlc-streamer, который эмулирует rtsp-broadcaster,Вот руководство , которому я стараюсь следовать.

У меня есть действительно свежая и последняя версия ffmpeg с поддержкой x264, которую я установил с помощью , полезной темы.

Ответы [ 6 ]

9 голосов
/ 31 октября 2011

Вы пытались vlc сохранить поток RTSP?Это сработало для меня. Я попробовал с графическим интерфейсом, хотя.Но это также должно работать из командной строки.

4 голосов
/ 08 октября 2014

ffmpeg + wallclock_as_timestamps работает

ffmpeg - это самый простой способ достижения вашей цели, но вот несколько важных замечаний:

Во-первых, я советую вам получить последнюю версию (2.4.xвместо 1.2.x поставляется с Ubuntu).Вы можете получить его из https://www.ffmpeg.org/download.html

Вы все равно получите ошибку

Application provided invalid, non monotonically increasing dts to muxer in stream 0: 730672 >= 730672
av_interleaved_write_frame(): Invalid argument error

, но вы можете избавиться от нее.Это происходит главным образом потому, что FPS (кадров в секунду) постоянно меняются на IP-камерах в зависимости от качества соединения.Вот два решения, которые сработали для меня:

Решение 1 = используйте параметр use_wallclock_as_timestamps , чтобы ваша команда выглядела как

ffmpeg -use_wallclock_as_timestamps 1 -i rtsp://myip:554/mpeg4 -c copy myrecord.avi

PROS =низкая загрузка ЦП + записи хорошего качества, потому что ничего не транскодируется / CONS = слегка большие файлы (~ 6 МБ / мин)

Solution2 = удаление параметров "-acodec copy -vcodec copy" в вашемкоманда.Простая команда

ffmpeg -i rtsp://myip:554/mpeg4 myrecord.avi

сделает свое дело.PROS = небольшие файлы (~ 1,2 Мб / мин) / CONS = высокая загрузка процессора (6% на моем компьютере), потому что я думаю, что он перекодирует в кодеки по умолчанию + записи плохого качества

Надеюсь, это поможет!

3 голосов
/ 14 ноября 2011

Дмитрий, вы должны попробовать Сервер ErlyVideo . Он может захватывать RTSP-трафик и сохранять его в мультимедийных файлах, которые можно воспроизводить с помощью медиаплееров.

2 голосов
/ 30 марта 2012

Dump stream (s) с любого видео Youtube на локальное устройство, используя OPENRTSP

В качестве примера я буду использовать rtsp-ленту, доступную для любого видео на YouTube.

Шаги:

  1. Используйте игровую площадку Oauth 2.0 для непосредственного взаимодействия с API-интерфейсом youtube - получает каналы
  2. Получить идентификатор видео Youtube, используя его в запросе ленты новостей gdata (v = cpST8yz4w1w)
  3. Разобрать выходные данные для нужного URL-адреса rtsp - формат 1 имеет низкую пропускную способность, формат 6 = HIGH
  4. CLI - используйте openrtsp для запроса
  5. download (s) openrtsp выводит отдельный файл для каждой дорожки
  6. ofile1 = "video-H263-2000-1"

Подробная информация о ручном процессе сброса потока:

Детская площадка Oauth 2 - хороший инструмент https://code.google.com/oauthplayground/

  1. Выберите «Youtube» в нижней части списка, нажмите кнопку «Авторизовать»
  2. Нажмите «Разрешить доступ»
  3. Нажмите «Код авторизации Exchange для токенов»
  4. Вы получите текстовое поле для «URI запроса»
  5. Запросить следующее:

    https://gdata.youtube.com/feeds/api/videos/cpST8yz4w1w?fields=media%3Agroup%2Fmedia%3Acontent%5B%40yt%3Aformat%3D%221%22%5D&v=2&alt=json

поля открытого текста spec = media: group / media: content [@yt: format = "1"]

Ответ - поток json. Скопируйте это из формы oauth и вставьте его в: http://json.parser.online.fr/ и у вас будет что-то вроде:

"entry":{
"xmlns":"http://www.w3.org/2005/Atom",
"xmlns$media":"http://search.yahoo.com/mrss/",
"xmlns$yt":"http://gdata.youtube.com/schemas/2007",
"media$group":{
"media$content":[
{
"url":"rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp",
"type":"video/3gpp",
"medium":"video",
"expression":"full",
"duration":64,
"yt$format":1
}
]

Возьмите из этого атрибут url RTSP и вызовите openrtsp, чтобы выполнить дамп файла. Вам нужно будет WAIT , потому что openrtsp будет транслировать медиа (не загружать). Если вы попросите сброс 10 минут .mp4, вам придется подождать 10 минут.

ПРИМЕЧАНИЕ. SDP за URI rtsp поддерживает отдельные источники для каждой дорожки. Таким образом, вместе с дампом вы получаете отдельные файлы для каждой дорожки в исходном медиа-файле.

$ ./openRTSP rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp

Dumpfile, выходы будут:

  1. Создан выходной файл: "video-H263-2000-1"
  2. Создан выходной файл: "audio-AMR-2"

Данные Stdout включают полный протокол сеанса RTSP:

$ ./openRTSP rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp
Opening connection to 74.125.213.247, port 554...
...remote connection opened
Sending request: OPTIONS rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp RTSP/1.0
CSeq: 2
User-Agent: ./openRTSP (LIVE555 Streaming Media v2011.07.08)


Received 140 new bytes of response data.
Received a complete OPTIONS response:
RTSP/1.0 200 OK
Public: DESCRIBE, GET_PARAMETER, OPTIONS, PAUSE, PLAY, SETUP, SET_PARAMETER, TEARDOWN
CSeq: 2
Server: Google RTSP 1.0


Sending request: DESCRIBE rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp RTSP/1.0
CSeq: 3
User-Agent: ./openRTSP (LIVE555 Streaming Media v2011.07.08)
Accept: application/sdp


Received 776 new bytes of response data.
Received a complete DESCRIBE response:
RTSP/1.0 200 OK
Content-Type: application/sdp
Cache-Control: must-revalidate
Date: Fri, 30 Mar 2012 15:27:43 GMT
Expires: Fri, 30 Mar 2012 15:27:43 GMT
Last-Modified: Fri, 30 Mar 2012 15:27:43 GMT
Content-Base: rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp/
CSeq: 3
Server: Google RTSP 1.0
Content-Length: 404

v=0
o=GoogleStreamer 943086435 202448811 IN IP4 74.125.213.247
s=Video
c=IN IP4 0.0.0.0
b=AS:51
t=0 0
a=control:*
a=range:npt=0-63.800000
m=video 0 RTP/AVP 98
b=AS:39
a=rtpmap:98 H263-2000/90000
a=control:trackID=0
a=cliprect:0,0,144,176
a=framesize:98 176-144
a=fmtp:98 profile=0;level=10
m=audio 0 RTP/AVP 99
b=AS:12
a=rtpmap:99 AMR/8000/1
a=control:trackID=1
a=fmtp:99 octet-align

Opened URL "rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp", returning a SDP description:
v=0
o=GoogleStreamer 943086435 202448811 IN IP4 74.125.213.247
s=Video
c=IN IP4 0.0.0.0
b=AS:51
t=0 0
a=control:*
a=range:npt=0-63.800000
m=video 0 RTP/AVP 98
b=AS:39
a=rtpmap:98 H263-2000/90000
a=control:trackID=0
a=cliprect:0,0,144,176
a=framesize:98 176-144
a=fmtp:98 profile=0;level=10
m=audio 0 RTP/AVP 99
b=AS:12
a=rtpmap:99 AMR/8000/1
a=control:trackID=1
a=fmtp:99 octet-align

Created receiver for "video/H263-2000" subsession (client ports 52320-52321)
Created receiver for "audio/AMR" subsession (client ports 52322-52323)
Sending request: SETUP rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp/trackID=0 RTSP/1.0
CSeq: 4
User-Agent: ./openRTSP (LIVE555 Streaming Media v2011.07.08)
Transport: RTP/AVP;unicast;client_port=52320-52321


Received 360 new bytes of response data.
Received a complete SETUP response:
RTSP/1.0 200 OK
Session: 4d04d0e9;timeout=90
Transport: RTP/AVP;unicast;mode=play;client_port=52320-52321;server_port=10580-10581;source=74.125.213.247;ssrc=7B551CAA
Cache-Control: must-revalidate
Date: Fri, 30 Mar 2012 15:27:43 GMT
Expires: Fri, 30 Mar 2012 15:27:43 GMT
Last-Modified: Fri, 30 Mar 2012 15:27:43 GMT
CSeq: 4
Server: Google RTSP 1.0


setup response srvAddr port rtpchnl   74.125.213.247 10580 255
Setup "video/H263-2000" subsession (client ports 52320-52321)
Sending request: SETUP rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp/trackID=1 RTSP/1.0
CSeq: 5
User-Agent: ./openRTSP (LIVE555 Streaming Media v2011.07.08)
Transport: RTP/AVP;unicast;client_port=52322-52323
Session: 4d04d0e9


Received 360 new bytes of response data.
Received a complete SETUP response:
RTSP/1.0 200 OK
Session: 4d04d0e9;timeout=90
Transport: RTP/AVP;unicast;mode=play;client_port=52322-52323;server_port=10580-10581;source=74.125.213.247;ssrc=10CD5DCE
Cache-Control: must-revalidate
Date: Fri, 30 Mar 2012 15:27:43 GMT
Expires: Fri, 30 Mar 2012 15:27:43 GMT
Last-Modified: Fri, 30 Mar 2012 15:27:43 GMT
CSeq: 5
Server: Google RTSP 1.0


setup response srvAddr port rtpchnl   74.125.213.247 10580 255
Setup "audio/AMR" subsession (client ports 52322-52323)
Created output file: "video-H263-2000-1"
Created output file: "audio-AMR-2"
Sending request: PLAY rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp/ RTSP/1.0
CSeq: 6
User-Agent: ./openRTSP (LIVE555 Streaming Media v2011.07.08)
Session: 4d04d0e9
Range: npt=0.000-63.800


Received 394 new bytes of response data.
Received a complete PLAY response:
RTSP/1.0 200 OK
Session: 4d04d0e9;timeout=90
Range: npt=0.000-63.800
RTP-Info: url=rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp/trackID=0;seq=48690;rtptime=668323490,url=rtsp://v
8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp/trackID=1;seq=61565;rtptime=99689199
CSeq: 6
Server: Google RTSP 1.0


Started playing session
Receiving streamed data (for up to 68.800000 seconds)...
Sending request: TEARDOWN rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp/ RTSP/1.0
CSeq: 7
User-Agent: ./openRTSP (LIVE555 Streaming Media v2011.07.08)
Session: 4d04d0e9


Received 72 new bytes of response data.
Received a complete TEARDOWN response:
RTSP/1.0 200 OK
CSeq: 7
Session: 4d04d0e9
Server: Google RTSP 1.0
1 голос
/ 04 ноября 2011

VLC - первое, что приходит на ум.Я обычно захожу на этот старый сайт www.vcdhelp.com и под панелью " How To " слева, нажимаю " All Guide ", введитеВаш параметр поиска в " Текстовый поиск ".

Для вашего решения, проверьте: http://www.videohelp.com/tools/StreamTransport (бесплатное программное обеспечение)

0 голосов
/ 06 ноября 2011

Как насчет использования libpcap для создания инструмента, подобного tcpdump / Wireshark? Удалив заголовки, сгенерированные слоями под прикладным уровнем (т. Е. TCP / UDP / IP / ...), вы получите доступ к потоку RTSP. Затем поток может быть записан в файл на диске. Я должен признать, что я не очень хорошо знаком с RTP / RTSP, поэтому, возможно, вам придется также удалить эти заголовки и просто записать полезную нагрузку в файл (чтобы медиаплеер мог ее воспроизвести).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...