PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Falsche Audiolänge im Stream-Header



TheOrangeman
23.09.13, 00:26
Hallo liebe Foren-Gemeine,

ich beiße mir zur Zeit die Zähne an einem Problem aus, bei dem ich nicht weiter weiß und auch nicht wirklich eine Lösung im Internet finde. Und zwar folgendes :

Ich besitze eine D-Link 932L. Das ist eine Low-Budget Videoüberwachungskamera für den Innenbereich, die leider nur einen MJPEG-Stream und einen WAV-Stream bereitstellt unter den Links http://user:pass@192.168.1.2/video.cgi und http://user:pass@192.168.1.2/audio.cgi. Ich möchte gerne die Streams abgreifen und in ein Video speichern. Dieses Modell bietet mir leider nicht die Möglichkeit an von sich selber aus einen solchen Stream auf einen frei wählbaren Speicher zu senden. Lediglich die Option drei mal die Sekunde ein Bild auf einem FTP-Server zu speichern wird angeboten was drei Probleme bringt. Erstens bringt mir die hohe Anzahl an Bildern erschwerten Zugang da der Ordner lange geladen wird ;), zweitens eine niedrige Bildwiederholrate und drittens keine Möglichkeit der Audioaufnahme.

Daher habe ich mich viel umgeschaut und eine fast perfekte Lösung gefunden. Die cgi's greife ich mit avconv ab, transcodiere sie mit libx264 und kann gleichzeitig mit den Videofiltern Uhrzeit, Datum, Name usw. einarbeiten lassen. Problem ist folgendes, der Header des WAV-Streams enthält die Information, dass der Stream 32,830 Sekunden lang ist. Damit lässt er sich auch nur so lange abspielen und danach bricht avconv ab.


00000000: 52 49 46 46 00 00 10 00 RIFF....
00000008: 57 41 56 45 66 6D 74 20 WAVEfmt
00000016: 10 00 00 00 01 00 01 00 ........
00000024: 80 3E 00 00 00 7D 00 00 .>...}..
00000032: 02 00 10 00 64 61 74 61 ....data
00000040: 66 FF 0F 00 f...

Nun löse ich es wie folgt. Ich öffne den Stream mit curl, leite ihn an sox weiter und danach zu avconv wo er ins Video einfließt.


curl http://user:pass@192.168.1.2/audio.cgi | sox -t wav --ignore-length - -t wav - | avconv [...]

Mittels des --ignore-length Parameters soll eigentlich die Länge des Streams ignoriert werden, aber avconv erkennt was anderes.



% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
sox WARN wav: Length in output .wav header will be wrong since can't seek to fix it

avconv version 0.8.6-6:0.8.6-1, Copyright (c) 2000-2013 the Libav developers
built on Mar 24 2013 18:40:26 with gcc 4.7.2

[mjpeg @ 0x1ce7400] max_analyze_duration reached
[mjpeg @ 0x1ce7400] Estimating duration from bitrate, this may be inaccurate

Input #0, mjpeg, from 'http://user:pass@192.168.1.2/video.cgi':
Duration: N/A, bitrate: N/A
Stream #0.0: Video: mjpeg, yuvj422p, 640x480, 10.38 fps, 10.38 tbr, 1200k tbn, 1200k tbc
[wav @ 0x1ce9ba0] max_analyze_duration reached
Input #1, wav, from 'pipe:':
Duration: 18:38:28.73, bitrate: N/A
Stream #1.0: Audio: pcm_s16le, 16000 Hz, 1 channels, s16, 256 kb/s
Incompatible pixel format 'yuvj422p' for codec 'libx264', auto-selecting format 'yuv420p'
[buffer @ 0x1cfbe00] w:640 h:480 pixfmt:yuvj422p
[drawtext @ 0x1d0d1c0] auto-inserting filter 'auto-inserted scaler 0' between the filter 'src' and the filter 'Parsed filter 0 drawtext'
[scale @ 0x1ef5a00] w:640 h:480 fmt:yuvj422p -> w:640 h:480 fmt:yuv420p flags:0x4
Incompatible sample format 's16' for codec 'ac3', auto-selecting format 'flt'
[libx264 @ 0x1d0b740] using cpu capabilities: MMX2 SSE2Fast SSSE3 Cache64
[libx264 @ 0x1d0b740] profile Main, level 2.2
[libx264 @ 0x1d0b740] 264 - core 123 r2189 35cf912 - H.264/MPEG-4 AVC codec - Copyleft 2003-2012 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x1:0x111 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=1 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=3 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=0 b_adapt=1 b_bias=0 direct=1 weightb=0 open_gop=1 weightp=2 keyint=250 keyint_min=10 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=abr mbtree=1 bitrate=700 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.25 aq=1:1.00
[ac3 @ 0x1d0c6a0] channel_layout not specified
[ac3 @ 0x1d0c6a0] No channel layout specified. The encoder will guess the layout, but it might be incorrect.
Output #0, mp4, to '20130923-000844-DCS932L-1.mp4':
Metadata:
encoder : Lavf53.21.1
Stream #0.0: Video: libx264, yuv420p, 640x480, q=-1--1, 700 kb/s, 519 tbn, 10.38 tbc
Stream #0.1: Audio: ac3, 16000 Hz, mono, flt, 128 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (mjpeg -> libx264)
Stream #1:0 -> #0:1 (pcm_s16le -> ac3)
Press ctrl-c to stop encoding
100 216k 0 216k 0 0 31822 0 --:--:-- 0:00:06 --:--:-- 32134frame= 66 fps= 61 q=22.0 size= 100 247k 0 247k 0 0 31762 0 --:--:-- 0:00:07 --:--:-- 32049frame= 79 fps= 36 q=22.0 size= ^Cframe= 85 fps= 21 q=-1.0 Lsize= 750kB time=3.65 bitrate=1683.8kbits/s
video:690kB audio:57kB global headers:0kB muxing overhead 0.330727%
[libx264 @ 0x1d0b740] frame I:1 Avg QP:16.82 size: 24064
[libx264 @ 0x1d0b740] frame P:29 Avg QP:18.16 size: 11802
[libx264 @ 0x1d0b740] frame B:55 Avg QP:20.13 size: 6180
[libx264 @ 0x1d0b740] consecutive B-frames: 2.4% 28.2% 17.6% 51.8%
[libx264 @ 0x1d0b740] mb I I16..4: 25.2% 0.0% 74.8%
[libx264 @ 0x1d0b740] mb P I16..4: 7.1% 0.0% 8.7% P16..4: 47.8% 17.2% 7.1% 0.0% 0.0% skip:12.1%
[libx264 @ 0x1d0b740] mb B I16..4: 2.8% 0.0% 2.1% B16..8: 33.5% 14.7% 4.2% direct:20.6% skip:22.1% L0:45.7% L1:31.3% BI:23.0%
[libx264 @ 0x1d0b740] final ratefactor: 19.60
[libx264 @ 0x1d0b740] coded y,uvDC,uvAC intra: 57.0% 0.0% 0.0% inter: 46.1% 0.0% 0.0%
[libx264 @ 0x1d0b740] i16 v,h,dc,p: 31% 35% 20% 15%
[libx264 @ 0x1d0b740] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 29% 30% 22% 3% 4% 3% 4% 2% 3%
[libx264 @ 0x1d0b740] i8c dc,h,v,p: 98% 2% 0% 0%
[libx264 @ 0x1d0b740] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x1d0b740] ref P L0: 36.8% 6.5% 31.4% 25.3%
[libx264 @ 0x1d0b740] ref B L0: 51.6% 48.4%
[libx264 @ 0x1d0b740] kb/s:689.91
Received signal 2: terminating.


Die Audiospur wird nun mit einer Länge von ~18 Stunden erkannt, was heißt das mir der Stream nach ~18 Stunden ausgeht, ich möchte aber 24 Stunden am Stück haben in einem Prozess. Die Frage ist nun, kann ich avconv irgendwie dazu nutzen den Header zu ignorieren? Oder gibt es ein anderes Tool das zuverlässiger arbeitet? Am liebsten wäre mir eine Lösung, die ohne Pipes auskommt und mittels avconv gelöst wird. Über eine Antwort würde ich mich freuen :)!

Liebe Grüße,
TheOrangeman