LINUX.ORG.RU

Правильно ловим RTSP через ffmpeg


0

1

Привет. Мучаюсь тут с настройкой Zoneminder. Хочу прицепить к нему парочку IP камер и получать видео по RTSP. Столкнулся с проблемой. При получении видео по RTSP, Zoneminder использует ffmpeg, и выдает ошибку:

.ERR-zm_remote_camera_rtsp.cpp/224 [Error while decoding frame 0]
12/17/11 19:03:59.843613 zmc_m5[3043].ERR-zm_remote_camera_rtsp.cpp/225 [256: 41 9a 20 02 02 39 38 8b f7 fa 25 77 7e ec 8a ce 97 04 8f 82 1a b7 75 d5 72 7b 9a 65 09 51 22 ad f6 77 7f 94 bd 95 5a b9 37 b9 62 31 9c 5f 75 d6 49 31 14 59 39 2f cf c9 de b9 eb d3 f0 ae a5 c5 57 09 eb f5 25 62 78 27 f5 d5 5e b9 7d 0c 7f 57 f9 ab cd c9 af c2 1e 6a d0 4f dd 7e d1 ab d7 26 ab 7d 5c f9 ab 5a e0 87 5d ea bf 75 fe 4e aa 6e 6f 5f 57 93 bf 52 d9 26 e5 ef 59 cd 77 de c9 ef e0 8a be 51 94 6a a1 13 58 a9 79 7d d5 ae 9f df 79 6c a0 8b df ab 84 b7 7f 7f 2f bf 9b bb f8 23 ef d7 63 17 be 6e ff 13 7e ff cd ef 71 3f 8c f1 9e 33 b1 84 eb 11 26 b1 15 42 a4 91 54 46 b1 1f 35 fa ee ff c9 be b9 3b fc f5 df fe 6b df e4 f7 f3 7b be 5d f5 64 f2 bb fe 5f 2f 8d 97 34 25 cd de f7 13 4b dd 5a f1 3e 69 66 25 51 23 ba ca 7c 9f 57 ae b5 f5 79 79 ea ff c9 8a 92 85 44 ce 22]
если получать просто через ffmpeg, то:

[root@d8 zoneminder]# ffmpeg -loglevel debug -i rtsp://root:156tT@80.111.111.81:554/axis-media/media.amp zzz1.mpeg
ffmpeg version 0.7.6-rpmfusion, Copyright (c) 2000-2011 the FFmpeg developers
  built on Oct 23 2011 17:44:34 with gcc 4.6.1 20110908 (Red Hat 4.6.1-9)
  configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib --mandir=/usr/share/man --arch=i686 --extra-cflags='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i686 -mtune=atom -fasynchronous-unwind-tables' --extra-version=rpmfusion --enable-bzlib --enable-libcelt --enable-libdc1394 --enable-libdirac --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid --enable-x11grab --enable-avfilter --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib --cpu=i686 --enable-runtime-cpudetect
  libavutil    50. 43. 0 / 50. 43. 0
  libavcodec   52.122. 0 / 52.122. 0
  libavformat  52.110. 0 / 52.110. 0
  libavdevice  52.  5. 0 / 52.  5. 0
  libavfilter   1. 80. 0 /  1. 80. 0
  libswscale    0. 14. 1 /  0. 14. 1
  libpostproc  51.  2. 0 / 51.  2. 0
[rtsp @ 0xa05d280] SDP:
v=0
o=- 1041292214550448 1041292214550448 IN IP4 89.111.181.82
s=Media Presentation
e=NONE
c=IN IP4 0.0.0.0
b=AS:50000
t=0 0
a=control:*
a=range:npt=0.000000-
m=video 0 RTP/AVP 96
b=AS:50000
a=framerate:24.0
a=control:trackID=1
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1; profile-level-id=420029; sprop-parameter-sets=Z0IAKeKQFAe2AtwEBAaQeJEV,aM48gA==

[rtsp @ 0xa05d280] video codec set to: h264
[NULL @ 0xa061ba0] RTP Packetization Mode: 1
[NULL @ 0xa061ba0] RTP Profile IDC: 42 Profile IOP: 0 Level: 29
[NULL @ 0xa061ba0] Extradata set to 0xa05fc20 (size: 28)!hello state=0
[h264 @ 0xa061ba0] Unsupported bit depth: 0
[rtsp @ 0xa05d280] All info found
[rtsp @ 0xa05d280] Estimating duration from bitrate, this may be inaccurate

Seems stream 0 codec frame rate differs from container frame rate: 180000.00 (180000/1) -> 90000.00 (180000/2)
Input #0, rtsp, from 'root:156tT@80.111.111.81:554/axis-media/media.amp':
  Metadata:
    title           : Media Presentation
  Duration: N/A, start: 0.278944, bitrate: N/A
    Stream #0.0, 22, 1/90000: Video: h264 (Baseline), yuvj420p, 640x480 [PAR 1:1 DAR 4:3], 1/180000, 90k tbr, 90k tbn, 180k tbc
Incompatible pixel format 'yuvj420p' for codec 'mpeg1video', auto-selecting format 'yuv420p'
[buffer @ 0xa068560] w:640 h:480 pixfmt:yuvj420p tb:1/1000000 sar:1/1 sws_param:
[buffersink @ 0xa05d0a0] auto-inserting filter 'auto-inserted scaler 0' between the filter 'src' and the filter 'out'
[scale @ 0xa057320] w:640 h:480 fmt:yuvj420p -> w:640 h:480 fmt:yuv420p flags:0x4
[mpeg @ 0xa057440] VBV buffer size not set, muxing may fail
Output #0, mpeg, to 'zzz1.mpeg':
  Metadata:
    title           : Media Presentation
    encoder         : Lavf52.110.0
    Stream #0.0, 0, 1/90000: Video: mpeg1video, yuv420p, 640x480 [PAR 1:1 DAR 4:3], 1/60, q=2-31, 200 kb/s, 90k tbn, 60 tbc
Stream mapping:
  Stream #0.0 -> #0.0
Press [q] to stop, [?] for help
frame=  192 fps= 85 q=21.3 Lsize=     410kB time=00:00:03.18 bitrate=1055.1kbits/s dup=124 drop=0    
video:406kB audio:0kB global headers:0kB muxing overhead 0.987651%
Received signal 2: terminating.
[rot@d2 zoneminder]# 

ffmpeg видео получает, сохраняет. Но вот наводит на меня смутные сомнения строчка

[h264 @ 0xa061ba0] Unsupported bit depth: 0
Судя по всему ZM и отказывается дальше работать из-этой ошибки. В чем может быть дело? Почему ffmpeg продолжает работать не смотря ни на что. Вообще с чем связано это сообщение? Как можно исправить..



Последнее исправление: RoccoShifreddy (всего исправлений: 2)

У меня этой строчки в выводе ffmpeg нет (поискал в google axis-media/media.amp, чтобы найти похожие камеры). Попробуй обновить.

aep@home ~ $ ffmpeg -loglevel debug -i rtsp://axis-00408c948c10.dh.dhcp.tntech.edu/axis-media/media.amp -r 30 -f null /dev/null
ffmpeg version 0.7.7, Copyright (c) 2000-2011 the FFmpeg developers
  built on Nov 13 2011 13:12:43 with gcc 4.5.3
  configuration: --prefix=/usr --libdir=/usr/lib --shlibdir=/usr/lib --mandir=/usr/share/man --enable-shared --cc=i686-pc-linux-gnu-gcc --disable-static --enable-gpl --enable-version3 --enable-postproc --enable-avfilter --disable-stripping --disable-debug --disable-doc --disable-vdpau --enable-libmp3lame --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-libfaac --enable-nonfree --disable-indev=v4l --disable-indev=oss --enable-x11grab --disable-outdev=oss --enable-frei0r --enable-libfreetype --enable-pthreads --enable-libopencore-amrwb --enable-libopencore-amrnb --enable-libgsm --enable-librtmp --enable-libspeex --enable-libvpx --disable-altivec --disable-avx --cpu=core2 --enable-hardcoded-tables
  libavutil    50. 43. 0 / 50. 43. 0
  libavcodec   52.122. 0 / 52.122. 0
  libavformat  52.110. 0 / 52.110. 0
  libavdevice  52.  5. 0 / 52.  5. 0
  libavfilter   1. 80. 0 /  1. 80. 0
  libswscale    0. 14. 1 /  0. 14. 1
  libpostproc  51.  2. 0 / 51.  2. 0
[rtsp @ 0x806ae00] SDP:
v=0
o=- 1250247924482108 1250247924482108 IN IP4 axis-00408c948c10.dh.dhcp.tntech.edu
s=Media Presentation
e=NONE
c=IN IP4 0.0.0.0
b=AS:50000
t=0 0
a=control:*
a=range:npt=0.000000-
m=video 0 RTP/AVP 96
b=AS:50000
a=framerate:30.0
a=control:trackID=1
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1; profile-level-id=420029; sprop-parameter-sets=Z0IAKeNQFAe2AtwEBAaQeJEV,aM48gA==

[rtsp @ 0x806ae00] video codec set to: h264
[NULL @ 0x8070520] RTP Packetization Mode: 1
[NULL @ 0x8070520] RTP Profile IDC: 42 Profile IOP: 0 Level: 29
[NULL @ 0x8070520] Extradata set to 0x8070a30 (size: 28)!hello state=0
[rtsp @ 0x806ae00] All info found
[rtsp @ 0x806ae00] Estimating duration from bitrate, this may be inaccurate

Seems stream 0 codec frame rate differs from container frame rate: 180000.00 (180000/1) -> 90000.00 (180000/2)
Input #0, rtsp, from 'rtsp://axis-00408c948c10.dh.dhcp.tntech.edu/axis-media/media.amp':
  Metadata:
    title           : Media Presentation
  Duration: N/A, start: 0.548922, bitrate: N/A
    Stream #0.0, 22, 1/90000: Video: h264 (Baseline), yuvj420p, 640x480 [PAR 1:1 DAR 4:3], 1/180000, 90k tbr, 90k tbn, 180k tbc
[buffer @ 0x80709d0] w:640 h:480 pixfmt:yuvj420p tb:1/1000000 sar:1/1 sws_param:
Output #0, null, to '/dev/null':
  Metadata:
    title           : Media Presentation
    encoder         : Lavf52.110.0
    Stream #0.0, 0, 1/90000: Video: rawvideo, yuvj420p, 640x480 [PAR 1:1 DAR 4:3], 1/30, q=2-31, 200 kb/s, 90k tbn, 30 tbc
Stream mapping:
  Stream #0.0 -> #0.0
Press [q] to stop, [?] for help
frame=   39 fps=  0 q=0.0 size=      -0kB time=00:00:01.30 bitrate=  -0.1kbits/s
frame=   52 fps= 49 q=0.0 size=      -0kB time=00:00:01.73 bitrate=  -0.1kbits/s
frame=   71 fps= 45 q=0.0 size=      -0kB time=00:00:02.36 bitrate=  -0.1kbits/s
frame=   81 fps= 42 q=0.0 Lsize=      -0kB time=00:00:02.70 bitrate=  -0.1kbits/s dup=0 drop=1    
video:0kB audio:0kB global headers:0kB muxing overhead -inf%

А точно ZM использует системный ffmpeg? Или может он имеет свой приемник rtsp, не опирающийся на ffmpeg, и использует ffmpeg только для декодирования?

P.S. Настоящий IP своей камеры ты все-таки засветил. Хорошо что хоть пароль заменил на нерабочий.

AEP ★★★★★
()
Ответ на: комментарий от AEP

Да, действительно по вашей ссылке на rtsp, у меня тоже выходит эта ошибка, странно...

ZM скорее использует некоторые библиотеки ffmpeg. Вот кусочек кода где видно, что RTSP он декодирует функцией avcodec_decode_video2, а она входит в состав libavcodec. Да и судя по логам ZM, спотыкается он именно при декодировании первого пакета.

    AVPacket packet;
    av_init_packet( &packet );
    int initialFrameCount = frameCount;
    while ( buffer.size() > 0 )
    {
    int got_picture = false;
    packet.data = buffer.head();
    packet.size = buffer.size();
    int len = avcodec_decode_video2( codecContext, picture, &got_picture, &packet );
    if ( len < 0 )
    {
    if ( frameCount > initialFrameCount )
    {
    // Decoded at least one frame
    return( 0 );
    }
    Error( "Error while decoding frame %d", frameCount );
    Hexdump( ZM_DBG_ERR, buffer.head(), buffer.size()>256?256:buffer.size() );
    buffer.clear();
    continue;
    //return( -1 );

Только, что тестировал на FC15 и Ubuntu 11.10 ситуация аналогичная. Протестировал на версиях:

ffmpeg version 0.7.2-4:0.7.2-1ubuntu1, Copyright (c) 2000-2011 the Libav developers
  libavutil    51.  7. 0 / 51.  7. 0
  libavcodec   53.  5. 0 / 53.  5. 0
  libavformat  53.  2. 0 / 53.  2. 0
  libavdevice  53.  0. 0 / 53.  0. 0
  libavfilter   2.  4. 0 /  2.  4. 0
  libswscale    2.  0. 0 /  2.  0. 0
  libpostproc  52.  0. 0 / 52.  0. 0
и
ffmpeg version 0.7.6-rpmfusion, Copyright (c) 2000-2011 the FFmpeg developers
  libavutil    50. 43. 0 / 50. 43. 0
  libavcodec   52.122. 0 / 52.122. 0
  libavformat  52.110. 0 / 52.110. 0
  libavdevice  52.  5. 0 / 52.  5. 0
  libavfilter   1. 80. 0 /  1. 80. 0
  libswscale    0. 14. 1 /  0. 14. 1
  libpostproc  51.  2. 0 / 51.  2. 0

Попробую найти версию как у Вас.

RoccoShifreddy
() автор топика
Ответ на: комментарий от RoccoShifreddy

Это декодирование, а где демультиплексирование RTSP? Если ZM не пользуется демультиплексором RTSP, встроенным в libavformat, то разница в поведении понятна. Обычный ffplay, как я понимаю, у вас показывает как вашу камеру, так и нагугленную?

AEP ★★★★★
()
Ответ на: комментарий от AEP

Вот честно точно не скажу, но как мне показалось на первый взгляд он использует встроенным демультиплексором RTSP в libavformat. Хотя .. как это можно проверить?
Код:


http://svn.zoneminder.com/svn/zm/trunk/src/zm_remote_camera_rtsp.h
http://svn.zoneminder.com/svn/zm/trunk/src/zm_remote_camera_rtsp.cpp


Обычный ffplay, как я понимаю, у вас показывает как вашу камеру, так и >нагугленную?

Да показывает, но ошибку эту же выводит.

RoccoShifreddy
() автор топика
Ответ на: комментарий от RoccoShifreddy

Нет, демультиплексор у него свой.

http://svn.zoneminder.com/svn/zm/trunk/src/zm_rtsp.cpp

кусок кода про ffmpeg находится под #if 0

Еще см. http://svn.zoneminder.com/svn/zm/trunk/src/zm_sdp.cpp - там много нужных атрибутов просто игнорируется.

AEP ★★★★★
()
Ответ на: комментарий от AEP

Да уж. Задача весьма серьезная.. Как минимум нужно изучить rfc2326 http://tools.ietf.org/html/rfc2326 И копаться в коде. =(( Сталкивался с подобной проблемой, но моих знаний недостаточно для модификации кода. А готового решения такт и нет. Жаль конечно, продукт то хороший,......

Droid43
()
Ответ на: комментарий от Droid43

Как workaround, могу посоветовать переключение камеры в режим с другим кодеком. Т.е указывать в конце URL'а ?videocodec=mpeg4 или ?videocodec=jpeg (в последнем случае ffplay не играет поток, но у ZM свой декодер JPEG).

AEP ★★★★★
()
13 сентября 2012 г.

напоролся на эту же ошибку и пошел читать мануал, который неожиданно помог: http://www.zoneminder.com/wiki/index.php/How_to_stream_h264_with_ffmpeg_from_...

Set the following options for Zoneminder under the Images tab: OPT_FFMPEG: (Checked) PATH_FFMPEG: /usr/bin/avconv

Add the Zoneminder cameras with the following settings:

General Source Type: Ffmpeg Maximum FPS: Empty Alarm Maximum FPS: Empty

Source Source Path: rtsp://(camera dns name or IP address)/axis-media/media.amp?streamprofile=Quality?tcp Capture Width (pixels): 640 for the M3011, 1280 for the P3343 and the M3014 Capture Height (pixels): 480 for the M3011, 800 for the P3343 and the M3014

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.