Corrigindo a latência do ffmpeg acumulado ao longo do tempo

3

Eu tenho o ffmpeg / ffserver em execução na seguinte configuração:

10.1.2.2 captura de cartões de captura de vídeo (16 canais) e os transmite para um ffserver como mpeg1video

10.1.1.1/10.1.2.1 (duas NICs) hospeda o ffserver e alguns processos que convertem os fluxos mpeg1video em fluxos webm junto com zoneminder (alimentando os fluxos originais do ffmpeg). 10.1.2.2 e 10.1.2.1 estão conectados via cabo crossover gigabit. O diretor / tmp é montado como 128MB de RAM via tmpfs.

O fluxo mpeg1video está sempre atrasado cerca de 0,1-0,2 segundos atrás do fluxo webm, isso é perfeitamente aceitável para mim (mas eu o menciono porque pode ser útil saber para fins de solução de problemas).

Quando todos os fluxos são reiniciados, o atraso é de 3 a 5 segundos (gostaria de reduzir esse atraso. Posso ver qualquer fluxo individual diretamente do dispositivo de vídeo em tempo real, por isso, talvez eu esteja entendendo errado formato, com exceção do atraso de composição). Quando executado durante a noite, os streams ainda aparecem "live" (movimento fluido) nos formatos mpeg1video e webm, mas são claramente atrasados por 4-5 HORAS (como fica evidente pelo fato de as luzes terem aparecido para minha surpresa quando saí de manhã, e manteve as telas assistindo-os até 4-5 horas depois que as pessoas começaram a chegar naquela manhã as luzes se acenderam [mas não todas juntas, elas parecem sair de sincronia umas das outras também]).

Estes são os processos que estou usando:

Em 10.1.2.2:

ffmpeg -f video4linux2 -standard ntsc -i /dev/video0 http://10.1.2.1:8090/0.ffm

Em 10.1.2.1/10.1.1.15:

ffserver -f /etc/ffserver.conf
ffmpeg -f mpegvideo -i http://localhost:8090/0.mpg -vcodec libvpx http://localhost:8090/0_webm.ffm

E um trecho de /etc/ffserver.conf em 10.1.2.1/10.1.1.15:

Port 8090
MaxHTTPConnections 2000
MAXClients 100
MaxBandwidth 1000000
CustomLog /var/log/ffserver
NoDaemon

<Feed 0.ffm>
File /tmp/0.ffm
FileMaxSize 1M
ACL allow 10.1.2.2
</Feed>

<Feed 0_webm.ffm>
File /tmp/0_webm.ffm
FileMaxSize 1M
ACL allow localhost
</Feed>

<Stream 0.mpg>
Feed 0.ffm
Format mpeg1video
NoAudio
VideoFrameRate 29.97
VideoBitRate 512K
VideoSize 320x240
VideoBufferSize 40
VideoGopSize 12
#VideoIntraOnly
</Stream>

<Stream 0.webm>
Feed 0_webm.ffm
Format webm
NoAudio
VideoCodec libvpx
VideoSize 320x240
VideoFrameRate 29.97
AVOptionVideo flags +global_header
AVOptionVideo cpu-used 0
AVOptionVideo quality good
PreRoll 0
StartSendOnKey
VideoGopSize 12
VideoBitRate 256
</Stream>

Agora, 1MB é muito muito pequeno para armazenar 4-5 horas de streaming de vídeo a 29,97 FPS e resolução de 320x240 em cores yuv420p - então minhas perguntas são: o que está acontecendo aqui e como eu consertá-lo? Para mim parece que algo está ocorrendo dentro do processo inicial do ffmpeg no 10.1.2.2, mas eu não consigo descobrir o que, o ffmpeg usa algum buffer próprio ou há talvez um comando que eu possa usar para forçá-lo a soltar qualquer quadros excessivos ao puxar da placa de vídeo - isso é apenas para tirar um instantâneo o mais rápido possível e enviar de um buffer de imagem única para o ffserver para garantir que o que está sendo enviado esteja sempre ativo?

Meu objetivo aqui é transmitir uma transmissão ao vivo em zoneminder e uma transmissão ao vivo em formato webm para cada um dos 16 canais (0-15) - então estou aberto a qualquer solução, mas prefiro algo baseado em ffmpeg / ffserver eles parecem ser o padrão ouro no Linux para tarefas como essa.

O atraso inicial de 3-5 segundos e o atraso de 4-5 horas também podem ser problemas diferentes. Quando eu mato 10.1.2.2 através de "sudo reboot" leva 3-5 segundos para que os streams individuais mpg / webm sejam interrompidos vindo de 10.1.1.15, então parece que existe algum buffer ocorrendo dentro de ffserver que vai além de simplesmente retransmitir o fluxos.

Edit: tentei reduzir todo o FileMaxSize do feed para 30K e o atraso de 3-5 segundos ainda está presente em todos os streams. O mesmo atraso existe se há 16 ou apenas 1 processos ffmpeg em 10.1.2.2.

Registrar saídas:

Servidor:

sudo ffserver -f /etc/ffserver.conf -d

ffserver version git-2013-03-15-cd5f50a Copyright (c) 2000-2013 the FFmpeg developers
  built on Mar 15 2013 14:03:16 with gcc 4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5)
  configuration: --enable-gpl --enable-libass --enable-libfaac --enable-libfdk-aac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libspeex --enable-librtmp --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree --enable-version3
  libavutil      52. 19.100 / 52. 19.100
  libavcodec     55.  0.100 / 55.  0.100
  libavformat    55.  0.100 / 55.  0.100
  libavdevice    55.  0.100 / 55.  0.100
  libavfilter     3. 45.104 /  3. 45.104
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
Thu Mar 21 14:08:53 2013 FFserver started.
Thu Mar 21 14:08:57 2013 10.1.3.2 - - New connection: GET /15.ffm
Thu Mar 21 14:08:57 2013 10.1.3.2 - - [GET] "/15.ffm HTTP/1.1" 200 4175
Thu Mar 21 14:08:57 2013 10.1.3.2 - - New connection: POST /15.ffm
Thu Mar 21 14:09:03 2013 127.0.0.1 - - New connection: GET /15.mpg
Thu Mar 21 14:09:06 2013 127.0.0.1 - - New connection: GET /15_webm.ffm
Thu Mar 21 14:09:06 2013 127.0.0.1 - - [GET] "/15_webm.ffm HTTP/1.1" 200 4175

sudo ffmpeg -f video4linux2 -standard ntsc -i /dev/video7 http://10.1.3.1:8090/15.ffm

dispositivo de vídeo - > mpg

ffmpeg version git-2013-03-21-4331484 Copyright (c) 2000-2013 the FFmpeg developers
  built on Mar 20 2013 20:44:06 with gcc 4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5)
  configuration: --enable-gpl --enable-libass --enable-libfaac --enable-libfdk-aac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libspeex --enable-librtmp --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree --enable-version3
  libavutil      52. 22.100 / 52. 22.100
  libavcodec     55.  1.100 / 55.  1.100
  libavformat    55.  0.100 / 55.  0.100
  libavdevice    55.  0.100 / 55.  0.100
  libavfilter     3. 48.100 /  3. 48.100
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
[video4linux2,v4l2 @ 0xa1d34c0] Estimating duration from bitrate, this may be inaccurate
Input #0, video4linux2,v4l2, from '/dev/video7':
  Duration: N/A, start: 1363889339.048888, bitrate: 27620 kb/s
    Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 320x240, 27620 kb/s, 29.97 fps, 29.97 tbr, 1000k tbn, 1000k tbc
Output #0, ffm, to 'http://10.1.3.1:8090/15.ffm':
  Metadata:
    creation_time   : now
    encoder         : Lavf55.0.100
    Stream #0:0: Video: mpeg1video, yuv420p, 320x240, q=2-31, 512 kb/s, 1000k tbn, 29.97 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo -> mpeg1video)
Press [q] to stop, [?] for help
frame= 3552 fps= 30 q=5.5 size=    7644kB time=00:01:58.45 bitrate= 528.7kbits/s

ffmpeg -f mpegvideo -i http://localhost:8090/15.mpg -vcodec libvpx http://localhost:8090/15_webm.ffm

mpg - > webm

ffmpeg version git-2013-03-15-cd5f50a Copyright (c) 2000-2013 the FFmpeg developers
  built on Mar 15 2013 14:03:16 with gcc 4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5)
  configuration: --enable-gpl --enable-libass --enable-libfaac --enable-libfdk-aac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libspeex --enable-librtmp --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree --enable-version3
  libavutil      52. 19.100 / 52. 19.100
  libavcodec     55.  0.100 / 55.  0.100
  libavformat    55.  0.100 / 55.  0.100
  libavdevice    55.  0.100 / 55.  0.100
  libavfilter     3. 45.104 /  3. 45.104
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
[mpeg1video @ 0x3901000] 0x0 is invalid
    Last message repeated 2 times
[mpegvideo @ 0x38f4f80] max_analyze_duration 5000000 reached at 5011633 microseconds
[mpegvideo @ 0x38f4f80] Estimating duration from bitrate, this may be inaccurate
Input #0, mpegvideo, from 'http://localhost:8090/15.mpg':
  Duration: N/A, bitrate: 1024 kb/s
    Stream #0:0: Video: mpeg1video, yuv420p, 320x240 [SAR 1:1 DAR 4:3], 1024 kb/s, 29.92 fps, 29.97 tbr, 1200k tbn, 29.97 tbc
[libvpx @ 0x39046a0] v1.2.0
Output #0, ffm, to 'http://localhost:8090/15_webm.ffm':
  Metadata:
    creation_time   : now
    encoder         : Lavf55.0.100
    Stream #0:0: Video: vp8, yuv420p, 320x240 [SAR 1:1 DAR 4:3], q=1-31, 128 kb/s, 1000k tbn, 29.97 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (mpeg1video -> libvpx)
Press [q] to stop, [?] for help
frame= 4845 fps= 31 q=0.0 size=    4192kB time=00:02:41.66 bitrate= 212.4kbits/s dup=4 drop=0

Adicionando mais resultados por solicitação:

$v4l
No command 'v4l' found, did you mean:
 Command 'vl' from package 'atfs' (universe)
 Command 'dv4l' from package 'dv4l' (universe)
v4l: command not found

$v4l2
No command 'v4l2' found, did you mean:
 Command 'qv4l2' from package 'qv4l2' (universe)
v4l2: command not found

$ sudo ffprobe -show_streams -show_format -f video4linux2 /dev/video0
ffprobe version git-2013-03-16-c9a51c2 Copyright (c) 2007-2013 the FFmpeg developers
  built on Mar 16 2013 18:48:40 with gcc 4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5)
  configuration: --enable-gpl --enable-libass --enable-libfaac --enable-libfdk-aac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libspeex --enable-librtmp --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree --enable-version3
  libavutil      52. 19.100 / 52. 19.100
  libavcodec     55.  0.100 / 55.  0.100
  libavformat    55.  0.100 / 55.  0.100
  libavdevice    55.  0.100 / 55.  0.100
  libavfilter     3. 47.100 /  3. 47.100
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
[video4linux2,v4l2 @ 0xb0a0540] Estimating duration from bitrate, this may be inaccurate
Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 1364261173.317100, bitrate: 27620 kb/s
    Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 320x240, 27620 kb/s, 29.97 fps, 29.97 tbr, 1000k tbn, 1000k tbc
[STREAM]
index=0
codec_name=rawvideo
codec_long_name=raw video
profile=unknown
codec_type=video
codec_time_base=1/1000000
codec_tag_string=I420
codec_tag=0x30323449
width=320
height=240
has_b_frames=0
sample_aspect_ratio=0:1
display_aspect_ratio=0:1
pix_fmt=yuv420p
level=-99
timecode=N/A
id=N/A
r_frame_rate=30000/1001
avg_frame_rate=30000/1001
time_base=1/1000000
start_pts=1364261173317100
start_time=1364261173.317100
duration_ts=N/A
duration=N/A
bit_rate=27620379
nb_frames=N/A
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=0
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
[/STREAM]
[FORMAT]
filename=/dev/video0
nb_streams=1
format_name=video4linux2,v4l2
format_long_name=Video4Linux2 device grab
start_time=1364261173.317100
duration=N/A
size=N/A
bit_rate=27620379
[/FORMAT]

As placas de captura de vídeo são bt878a de 8 canais usando o driver bttv com um /etc/modprobe.d Configuração do /bttv.conf como segue, de acordo com as instruções do fabricante em cada uma das duas máquinas que contêm os cartões:

options i2c-algo-bit_test=1
options bttv gbuffers=16 card=102,102,102,102,102,102,102,102 radio=0,0,0,0,0,0,0,0 tuner=4,4,4,4,4,4,4,4 chroma_agc=1 combfilter=2 full_luma_range=1 coring=1 autoload=0

Nas máquinas locais usando:

ffplay -f video4linux2 -standard ntsc -i /dev/video0

Funciona em tempo real e não parece acumular latência, não importa quanto tempo seja executado.

    
por CoryG 20.03.2013 / 15:57

0 respostas