LINUX.ORG.RU

Raspberry Pi. Стриминг h264 по RTP

 , , , ,


0

1

Всем привет! Ребят, подскажите в чем проблема и как ее устранить. Имеется Raspberry Pi (B+) с модулем камера. С помощью утилиты raspivid снимаю h264-видеопоток и посредством ffmpeg пытаюсь стримить его по RTP.

raspivid -o - -t 0 -n -w 640 -h 480 -fps 30 -b 3000000  |  ffmpeg -y -loglevel warning -i pipe:0 -vcodec copy -f rtp "rtp://192.168.0.100:6666?pkt_size=1428&ttl=4" > stream.sdp
Seems stream 0 codec frame rate differs from container frame rate: 2400000.00 (2400000/1) -> 25.00 (25/1)
Stream mapping:
  Stream #0.0 -> #0.0
Press ctrl-c to stop encoding
^Cmmal: Aborting program.0 size=   44089kB time=10000000000.00 bitrate=   0.0kbits/s


На ПК, с помощью сгененрированого SDP-файла, пытаюсь воспроизвести поток. Однако, тут происходит следующее: ffplay выволивается с кучей ошибок, через некоторое время показывает ОДИН смазаный кадр и замирает, при этом ошибки продолжают сыпаться.

bat@debian:~/Apps/gstreamer/encode$ ffplay /home/bat/Apps/stream.sdp
avplay version 0.8.16-6:0.8.16-1, Copyright (c) 2003-2014 the Libav developers
  built on Sep 17 2014 13:32:57 with gcc 4.7.2
[sdp @ 0x8f0e1a0] Estimating duration from bitrate, this may be inaccurate
Input #0, sdp, from '/home/bat/Apps/stream.sdp':
  Metadata:
    title           : No Name
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #0.0: Video: h264 (High), yuv420p, 640x480, 90k tbr, 90k tbn, 180k tbc
[h264 @ 0x8f2eac0] error while decoding MB 3 17, bytestream (-9)7   0   
[h264 @ 0x8f2eac0] concealing 566 DC, 566 AC, 566 MV errors
[h264 @ 0x8f2eac0] error while decoding MB 34 4, bytestream (-3)2   
[h264 @ 0x8f2eac0] concealing 1055 DC, 1055 AC, 1055 MV errors
[h264 @ 0x8f105c0] error while decoding MB 28 11, bytestream (-9)   
[h264 @ 0x8f105c0] concealing 781 DC, 781 AC, 781 MV errors
[h264 @ 0x8f2eac0] error while decoding MB 31 11, bytestream (-7)

Пробовал mplayer использовать, тут ситуация чуть лучше: сыпит ошибки и секнуд через 15-20 начинает воспроизводить, при этом ошибки сыпятся. Вначале видео воспроизводится ускоренно, то что за первые секнуды он не успел показать, потом более-менее стабильно.

Movie-Aspect is undefined - no prescaling applied.
VO: [xv] 640x480 => 640x480 Planar YV12 
No pts value from demuxer to use for frame!
pts after filters MISSING
V:   0.0   0/  0 ??% ??% ??,?% 0 0 
[h264 @ 0xb63ea640]concealing 878 DC, 878 AC, 878 MV errors
[h264 @ 0xb63ea640]concealing 999 DC, 999 AC, 999 MV errors
[h264 @ 0xb63ea640]left block unavailable for requested intra4x4 mode -1 at 0 13
[h264 @ 0xb63ea640]error while decoding MB 0 13, bytestream (6271)
[h264 @ 0xb63ea640]concealing 729 DC, 729 AC, 729 MV errors
[h264 @ 0xb63ea640]error while decoding MB 22 6, bytestream (-7)
[h264 @ 0xb63ea640]concealing 987 DC, 987 AC, 987 MV errors
V:   0.0   0/  0 ??% ??% ??,?% 0 0 


Собственно хотелось бы понять, что это за ошибки и как их исправить, что бы нормально просматривать стрим. Спасибо за внимание.

а ты уверен, что сам распивид выдает корректное видео, а не говно какое-нибудь? Сохрани пару минут в файл, и потом прогони через ffplay, и еще читни логи vlc -vvvv натравленного на тот же файл

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

а ты уверен, что сам распивид выдает корректное видео, а не говно какое-нибудь? Сохрани пару минут в файл, и потом прогони через ffplay, и еще читни логи vlc -vvvv натравленного на тот же файл

Да, абсолютно корректное выдает видео. Если стримить сырое видео(без обертки RTP, тому же неткату отдавать на малине и читать неткатом на машине и через пайп отдавать mplayer) то тоже все норм. Лог выданый при воспроизвдении сохраненого файла.

 
[0x90afc40] packetizer_h264 demux packetizer debug: found NAL_SPS (sps_id=0)
[0x90afc40] packetizer_h264 demux packetizer debug: found NAL_PPS (pps_id=0 sps_id=0)
[0x8da4cb8] main input debug: selecting program id=0
[0x90b7c40] main decoder debug: looking for decoder module: 30 candidates
[0x90b7c40] avcodec decoder debug: libavcodec initialized (interface 0x352300)
[0x90b7c40] avcodec decoder debug: trying to use direct rendering
[0x90b7c40] avcodec decoder debug: allowing 3 thread(s) for decoding
[0x90b7c40] avcodec decoder debug: ffmpeg codec (H264 - MPEG-4 AVC (part 10)) started
[0x90b7c40] avcodec decoder debug: using frame thread mode with 3 threads
[0x90b7c40] main decoder debug: using decoder module "avcodec"
[0x90b7c40] main decoder debug: TIMER module_need() : 23.283 ms - Total 23.283 ms / 1 intvls (Avg 23.283 ms)
[0x8da4cb8] main input error: Invalid PCR value in ES_OUT_SET_(GROUP_)PCR !
[0x90ea958] main spu text debug: looking for text renderer module: 2 candidates
[0x90ea958] freetype spu text debug: Took 1 microseconds
[0x90ea958] main spu text debug: using text renderer module "freetype"
[0x90ea958] main spu text debug: TIMER module_need() : 14.780 ms - Total 14.780 ms / 1 intvls (Avg 14.780 ms)
[0x9229738] main scale debug: looking for video filter2 module: 18 candidates
[0x9229738] swscale scale debug: 32x32 chroma: YUVA -> 16x16 chroma: RGBA with scaling using Bicubic (good quality)
[0x9229738] main scale debug: using video filter2 module "swscale"
[0x9229738] main scale debug: TIMER module_need() : 13.579 ms - Total 13.579 ms / 1 intvls (Avg 13.579 ms)
[0x9235e08] main scale debug: looking for video filter2 module: 18 candidates
[0x8da4cb8] main input debug: Stream buffering done (320 ms in 40 ms)
[0x9235e08] yuvp scale debug: YUVP to YUVA converter
[0x9235e08] main scale debug: using video filter2 module "yuvp"
[0x9235e08] main scale debug: TIMER module_need() : 9.810 ms - Total 9.810 ms / 1 intvls (Avg 9.810 ms)
[0x8fdb0b0] main video output debug: Deinterlacing available
[0x8fdb0b0] main video output debug: deinterlace 0, mode blend, is_needed 0
[0x8fdb0b0] main video output debug: Opening vout display wrapper
[0x9264db8] main vout display debug: looking for vout display module: 6 candidates
[0x92683f0] main window debug: looking for vout window xid module: 4 candidates
[0x92683f0] main window debug: TIMER module_need() : 513.984 ms - Total 513.984 ms / 1 intvls (Avg 513.984 ms)
[0x9268c70] main inhibit debug: looking for inhibit module: 2 candidates
[0x9268c70] main inhibit debug: using inhibit module "xdg_screensaver"
[0x9268c70] main inhibit debug: TIMER module_need() : 1.658 ms - Total 1.658 ms / 1 intvls (Avg 1.658 ms)
[0x9268c70] xdg_screensaver inhibit debug: started xdg-screensaver (PID = 13420)
[0x9264db8] main vout display debug: TIMER module_need() : 527.744 ms - Total 527.744 ms / 1 intvls (Avg 527.744 ms)
[0x8fdb0b0] main video output debug: original format sz 1920x1080, of (0,0), vsz 1920x1080, 4cc I420, sar 1:1, msk r0x0 g0x0 b0x0
[0x90ea958] main spu text debug: removing module "freetype"
[0x90ea958] main spu text debug: looking for text renderer module: 2 candidates
[0x90ea958] freetype spu text debug: Building font databases.
[0x90ea958] freetype spu text debug: Took 2 microseconds
[0x90ea958] main spu text debug: TIMER module_need() : 2.837 ms - Total 2.837 ms / 1 intvls (Avg 2.837 ms)
[0x90b7c40] avcodec decoder warning: disabling direct rendering
[0x9264db8] xcb_xv vout display debug: display is visible
[0x90b7c40] main decoder debug: End of video preroll
[0x90b7c40] main decoder debug: Received first picture
[0x929e078] main blend debug: looking for video blending module: 1 candidate
[0x929e078] main blend debug: using video blending module "blend"
[0x929e078] main blend debug: TIMER module_need() : 1.185 ms - Total 1.185 ms / 1 intvls (Avg 1.185 ms)
[0x8fdb0b0] main video output debug: Post-processing available
[0x8da4cb8] main input debug: Decoder buffering done in 1151 ms
[0x8fdb0b0] main video output debug: picture might be displayed late (missing 16 ms)
.....
[0x8fdb0b0] main video output warning: picture is too late to be displayed (missing 148 ms)
[0x8e8e098] main playlist debug: finished input

batchar ()

Я вещаю через nginx. У меня как-то так было:

UPSTREAM="rtmp://localhost/rtmp/live"
raspivid -n -mm matrix -w 1280 -h 720 -fps 25 -g 250 -t 0 -b 10000000  -o - \
| ffmpeg -y -i - -c:v copy -map 0:0 -f flv \
-loglevel error \
-rtmp_buffer 100 -rtmp_live live $UPSTREAM &

Картинку выводил через StrobeMediaPlayback.swf, результатом был доволен.

true_admin ★★★★★ ()

1. У вас не ffplay, а avplay. Libav-овцы ампутировали буферизацию входного UDP-стрима, так что ffplay из оригинального FFmpeg может сработать получше.

2. Причина - потери при приёме-передаче UDP. Рассмотрите другие варианты стриминга, или воспринимайте потери как фичу, а не баг (зато ниже latency же).

Krieger_Od ★★ ()

Частота кадров неверно выставляется. Добавить -r 30.

ffmpeg ... -f rtp -r 30 "rtp://....

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

Баг?

Предположительно вычислил причину. Вайршарк показал, что все RTP пакеты при «живом» стриме приходят с одинковым таймстемпом. Думается мне тут косяк. В качестве контрпримера стримил mp4 файл, где таймстемп растет как и положено. Как победить пока не знаю.

batchar ()
Ответ на: Баг? от batchar

Для начала (чтобы исключить баг, который уже пофиксен) убедитесь, что вы используете свежайшие релизы ffmpeg. Потом подробно опишите вашу проблему.

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