FFmpeg-Rohaudio und H264 in RTSP

1654
Max Ridman

Der Versuch, Video- und Audiodaten von einer IP-Kamera Hikvision richtig zu erfassen.

Bei H264 + MP2 funktioniert alles wie ein Zauber.

Beim Versuch, RAW-Audio in PCM s16le zu packen, geht das Lächeln aus meinem Gesicht.

So packe ich meine Kamera (Sie können versuchen, sie ist für die Welt geöffnet):

ffmpeg -re -acodec pcm_s16le -ac 1 -rtsp_transport tcp -i rtsp: // superuser: superuser12345@91.214.203.250: 10554 -vcodec kopiert -acodec libfdk_aac -vbr 5 test.ts

Der Befehl funktioniert und packt den RTSP-Stream in eine TS-Datei.

Die Dauer von Audio und Video ist jedoch unterschiedlich. Zum Beispiel nehme ich 21 Sekunden auf, davon habe ich 21 Sekunden Audio und 15 Sekunden Video.

Das Audio wird gestreckt und die Tonhöhe verringert. Ich habe mehrere Tage lang die FFmpeg-Dokumentation gelesen und verschiedene Optionen wie Async, Ändern der Abtastrate usw. angewendet - kein Glück.

Ich hoffe, Mulvya oder andere FFmpeg-Experten werden mir ein FIX empfehlen, damit alles richtig läuft.

C:\Users\User>d:/ffmpeg/bin/ffmpeg -y -re -acodec pcm_s16le -rtsp_transport  tcp -i rtsp://superuser:superuser12345@91.214.203.250:10554 -vcodec copy - acodec aac -b:a 96k d:/ffmpeg/hik_aac.ts ffmpeg version N-83410-gb1e2192 Copyright (c) 2000-2017 the FFmpeg  developers built with gcc 5.4.0 (GCC) configuration: --enable-gpl --enable-version3 --enable-cuda --enable-cuvid - -enable-d3d11va --enable-dxva2 --enable-libmfx --enable-nvenc --enable- avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls  --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable- libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable- libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb - -enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg -- enable-libopus --enable-librtmp --enable-libsnappy --enable-libsoxr -- enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab - -enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable- libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable- libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink -- enable-zlib libavutil 55. 46.100 / 55. 46.100 libavcodec 57. 75.100 / 57. 75.100 libavformat 57. 66.101 / 57. 66.101 libavdevice 57. 2.100 / 57. 2.100 libavfilter 6. 72.100 / 6. 72.100 libswscale 4. 3.101 / 4. 3.101 libswresample 2. 4.100 / 2. 4.100 libpostproc 54. 2.100 / 54. 2.100 Guessed Channel Layout for Input Stream #0.1 : mono Input #0, rtsp, from 'rtsp://superuser:superuser12345@91.214.203.250:10554': Metadata: title : Media Presentation Duration: N/A, start: 0.000000, bitrate: N/A Stream #0:0: Video: h264 (Main), yuv420p(progressive), 1920x1080, 16 fps, 25  tbr, 90k tbn, 32.01 tbc Stream #0:1: Audio: pcm_s16le, 16000 Hz, mono, s16, 256 kb/s Output #0, mpegts, to 'd:/ffmpeg/hik_aac.ts': Metadata: title : Media Presentation encoder : Lavf57.66.101 Stream #0:0: Video: h264 (Main), yuv420p(progressive), 1920x1080, q=2-31, 16  fps, 25 tbr, 90k tbn, 90k tbc Stream #0:1: Audio: aac (LC), 16000 Hz, mono, fltp, 96 kb/s Metadata: encoder : Lavc57.75.100 aac Stream mapping: Stream #0:0 -> #0:0 (copy) Stream #0:1 -> #0:1 (pcm_s16le (native) -> aac (native)) Press [q] to stop, [?] for help [mpegts @ 00000000032cf020] Non-monotonous DTS in output stream 0:0;  previous: 33976, current: 7200; changing to 33977. This may result in  incorrect timestamps in the output file. [mpegts @ 00000000032cf020] Non-monotonous DTS in output stream 0:0;  previous: 33977, current: 14400; changing to 33978. This may result in  incorrect timestamps in the output file. [mpegts @ 00000000032cf020] Non-monotonous DTS in output stream 0:0;  previous: 33978, current: 18000; changing to 33979. This may result in  incorrect timestamps in the output file. [mpegts @ 00000000032cf020] Non-monotonous DTS in output stream 0:0;  previous: 33979, current: 25200; changing to 33980. This may result in  incorrect timestamps in the output file. [mpegts @ 00000000032cf020] Non-monotonous DTS in output stream 0:0;  previous: 33980, current: 28800; changing to 33981. This may result in  incorrect timestamps in the output file. frame= 85 fps= 11 q=-1.0 Lsize= 1357kB time=00:00:07.42  bitrate=1497.1kbits/s speed=0.997x video:1196kB audio:51kB subtitle:0kB other streams:0kB global headers:0kB  muxing overhead: 8.805858% aac @ 00000000030a0a00] Qavg: 63342.980 Exiting normally, received signal 2. 
2
Sie müssen das vollständige Protokoll anzeigen. Gyan vor 6 Jahren 1
Vielen Dank für Ihre Aufmerksamkeit. Sie können es bei Bedarf kostenlos ausprobieren (offen für die Welt): ffmpeg -y -re -acodec pcm_s16le -rtsp_transport tcp -i rtsp: // superuser: superuser12345@91.214.203.250: 10554 -vcodec copy -acodec aac -b: a 96k Max Ridman vor 6 Jahren 0
Soweit ich feststellen kann, ist der Audiostream von der Kamera selbst bereits so (wenn Sie das Video mit "-vn" deaktivieren, ist es zu langsam). Könnte es sein, dass die falsche angegebene Abtastrate verwendet wird? Können Sie die Parameter für die Codierung dieser Webcam ändern? slhck vor 6 Jahren 0
Ich habe das vor einigen Tagen versucht - das gleiche Ergebnis. Aber wenn man das in der Weboberfläche der IP-Kamera spielt - es funktioniert OK. Ffmpeg bietet Optionen zum Strecken / Ausdrücken des Audiostroms basierend auf Videozeitstempeln. Dies scheint jedoch nicht zu funktionieren. Max Ridman vor 6 Jahren 0
Und das Schlimme - ich kann NICHT die Abtastrate auf RAW-Eingangssignal angeben. Dies ist insofern nützlich, als einige Geräte einen falschen Header haben (aka Header sagt, die Abtastrate beträgt 16 kHz, in Wirklichkeit sind es 22,05 kHz) und Sie können nichts dagegen tun. Max Ridman vor 6 Jahren 0

1 Antwort auf die Frage

1
Gyan

Da die tatsächliche Abtastrate bei 22,05 kHz zu liegen scheint, können wir das Audiomaterial entsprechend anpassen.

Benutzen

ffmpeg -y -re -acodec pcm_s16le -rtsp_transport tcp -i rtsp://URL -vcodec copy -af asetrate=22050 -acodec aac -b:a 96k test.mp4 

Das asetrateAudio wird nicht neu aufgenommen, sondern der Kontext der Abtastrate wird zurückgesetzt.

Vielen Dank Mulvya für diesen tollen Vorschlag! Das Problem wurde behoben, aber ich habe eine kleine Abweichung zwischen Audio und Video ~ 300 ms. Kann ich sie basierend auf dem Videostream synchronisieren? Max Ridman vor 6 Jahren 0
Versuchen Sie es zuerst: Fügen Sie dem Befehl `-vsync 0` hinzu. Wenn dies nicht behoben ist, führen Sie nach dem Speichern des Captures einen zweiten Befehl aus: `ffmpeg -i test.mp4 -itsoffset -0.300 -i test.mp4 -c kopiert -map 0: v -map 1: a test2. mp4`. Dadurch wird das aufgenommene Audio 300 ms früher verschoben. Passen Sie den Wert nach Bedarf an. Gyan vor 6 Jahren 0