Захват потока rtsp
Я ищу какой-нибудь универсальный способ вывести поток 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
После хорошей чашки поиска я обнаружил, что это действительно старая ошибка fxmpeg.
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 ответов
Вы пытались VLC сохранить поток RTSP? Это сработало для меня. Я попробовал с графическим интерфейсом, хотя. Но это также должно работать из командной строки.
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-камерах в зависимости от качества соединения. Вот 2 решения, которые работали для меня:
Решение 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% на моем компьютере), потому что я думаю, что он перекодирует в кодеки по умолчанию + записи плохого качества
Надеюсь, поможет!
Дмитрий, вы должны попробовать сервер ErlyVideo. Он может захватывать RTSP-трафик и сохранять его в мультимедийных файлах, которые можно воспроизводить с помощью медиаплееров.
Дамп поток (ы) с любого видео Youtube на локальное устройство, используя OPENRTSP
В качестве примера, я буду использовать канал rtsp, доступный для любого видео на YouTube.
шаги:
- Используйте игровую площадку Oauth 2.0 для непосредственного взаимодействия с API-интерфейсом YouTube.
- Получить идентификатор видео Youtube, используя его в запросе ленты новостей gdata (v=cpST8yz4w1w)
- Разобрать выходные данные для rtsp URL, который вы хотите - формат 1 с низкой пропускной способностью, формат 6 = HIGH
- CLI - используйте openrtsp для запроса
- download(s) openrtsp выводит отдельный файл для каждой дорожки
- ofile1="видео-H263-2000-1"
- ofile2 = "аудио-ШП-2"
Подробная информация о ручном процессе сброса потока:
Игровая площадка Oauth 2 - хороший инструмент https://code.google.com/oauthplayground/
- Выберите "Youtube" в нижней части списка, нажмите кнопку "Авторизовать"
- Нажмите "Разрешить доступ"
- Нажмите "Код авторизации Exchange для токенов"
- Вы получите текстовое поле для "Запрос URI"
Запросите следующее:
текстовые поля 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
}
]
Возьмите атрибут RTSP url из этого и вызовите openrtsp, чтобы сделать дамп файла. Вам придется ПОДОЖДИТЬ, потому что openrtsp будет транслировать медиа (не загружать). Если вы попросите сброс 10 минут.mp4, вам придется подождать 10 минут.
ПРИМЕЧАНИЕ. SDP за rtsp URI поддерживает отдельные источники для каждой дорожки. Таким образом, наряду с дампом, вы получаете отдельные файлы для каждой дорожки в исходном медиа-файле.
$ ./openRTSP rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp
Dumpfile, выходы будут:
- Создан выходной файл: "video-H263-2000-1"
- Создан выходной файл: "аудио-AMR-2"
Стандартные данные включают полный протокол сеанса 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
VLC - первое, что приходит на ум. Я обычно захожу на этот старый сайт https://www.vcdhelp.com/ и в панели "Как" с левой стороны нажимаю "Все руководство", введите свой параметр поиска в "Текстовый поиск".
Для вашего решения, проверьте: http://www.videohelp.com/tools/StreamTransport (бесплатная)
Как насчет использования libpcap для создания инструмента, подобного tcpdump/Wireshark? Удалив заголовки, сгенерированные уровнями ниже уровня приложения (т. Е. TCP/UDP/IP/...), вы получите доступ к потоку RTSP. Затем поток может быть записан в файл на диске. Я должен признать, что я не очень хорошо знаком с RTP / RTSP, поэтому, возможно, вам придется также удалить эти заголовки и просто записать полезную нагрузку в файл (для проигрывателя мультимедиа, чтобы воспроизвести его).