Einen Screencast mit ffmpeg erstellen: Wie hält man Video und Audio synchron?

Einen Screencast mit ffmpeg erstellen: Wie hält man Video und Audio synchron?

Ich habe einige Screencasts mit ffmpeg erstellt. Der von mir verwendete PC verfügt über leistungsfähige Hardware (Intel Core i7-4930K Six Core 3,40 GHz, 12 MB Cache, 32 GB RAM), läuft aber leider unter Windows 7. Da ich meinen Screencast unter Linux erstellen möchte, habe ich Kubuntu in VMware installiert. Der VM habe ich 4 CPU-Kerne und 4 GB RAM zugewiesen.

Ich nehme meinen Screencast mit folgendem Befehl auf:

ffmpeg -f alsa -ac 1 -i pulse -f x11grab -r 30 -s 1920x1080 -i :0.0 -acodec mp3 -vcodec libx264 -preset ultrafast -crf 0 -threads 0 output.mp4

Allerdings läuft das Video viel schneller als der Ton. Nach ein paar Minuten hinkt der Ton (aufgenommen über Mikrofon) dem Video mehrere Sekunden hinterher. Ich habe versucht, den Ton parallel mit Audacity auf dem Windows-Host aufzunehmen, und der Ton von Audacity und der von ffmpeg in der VM aufgenommene Ton scheinen synchron zu sein. Nur das Video läuft zu schnell.

Was ist der Grund dafür? Könnte es an VMware liegen? Gibt es irgendwelche Einstellungen, die ich anpassen kann? Gibt es ffmpeg-Optionen, die ich zum Synchronisieren verwenden könnte? Wenn ich ffmpeg zwingen könnte, Frames zu löschen oder zu duplizieren, wenn Audio/Video nicht synchron sind, wäre das für mich völlig in Ordnung, aber soweit ich das Handbuch für die Option -vsync von ffmpeg verstehe, ist dies bereits die Standardeinstellung.

Ich habe ffmpeg selbst kompiliert, und zwar nach demUbuntu-Kompilierungshandbuchund ich kam auf die Idee, ffmpeg zu verwenden vonHier.

BEARBEITEN: ffmpeg-Ausgabe wie gewünscht:

$ /home/yankee/bin/ffmpeg -f alsa -ac 1 -i pulse -f x11grab -r 30 -s 1920x1080 -i :0.0 -acodec mp3 -vcodec libx264 -preset ultrafast -crf 0 -threads 0 05-visitor.mp4
ffmpeg version 2.1.git Copyright (c) 2000-2014 the FFmpeg developers
  built on Feb 24 2014 08:38:08 with gcc 4.8 (Ubuntu/Linaro 4.8.1-10ubuntu9)
  configuration: --prefix=/home/yankee/ffmpeg_build --extra-cflags=-I/home/yankee/ffmpeg_build/include --extra-ldflags=-L/home/yankee/ffmpeg_build/lib --bindir=/home/yankee/bin --extra-libs=-ldl --enable-gpl --enable-libass --enable-libfdk-aac --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree --enable-x11grab
  libavutil      52. 65.100 / 52. 65.100
  libavcodec     55. 52.102 / 55. 52.102
  libavformat    55. 33.100 / 55. 33.100
  libavdevice    55. 10.100 / 55. 10.100
  libavfilter     4.  1.103 /  4.  1.103
  libswscale      2.  5.101 /  2.  5.101
  libswresample   0. 17.104 /  0. 17.104
  libpostproc    52.  3.100 / 52.  3.100
Guessed Channel Layout for  Input Stream #0.0 : mono
Input #0, alsa, from 'pulse':
  Duration: N/A, start: 1394106509.365291, bitrate: 768 kb/s
    Stream #0:0: Audio: pcm_s16le, 48000 Hz, mono, s16, 768 kb/s
[x11grab @ 0x2551e40] device: :0.0 -> display: :0.0 x: 0 y: 0 width: 1920 height: 1080
[x11grab @ 0x2551e40] shared memory extension found
Input #1, x11grab, from ':0.0':
  Duration: N/A, start: 1394106509.415547, bitrate: 1990656 kb/s
    Stream #1:0: Video: rawvideo (BGR[0] / 0x524742), bgr0, 1920x1080, 1990656 kb/s, 30 tbr, 1000k tbn, 30 tbc
No pixel format specified, yuv444p for H.264 encoding chosen.
Use -pix_fmt yuv420p for compatibility with outdated media players.                                                                                                                                                                                                            
[libx264 @ 0x256db60] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
[libx264 @ 0x256db60] profile High 4:4:4 Predictive, level 4.0, 4:4:4 8-bit
[libx264 @ 0x256db60] 64 - core 142 - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=0 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=0 chroma_qp_offset=0 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25 scenecut=0 intra_refresh=0 rc=cqp mbtree=0 qp=0
Output #0, mp4, to '05-visitor.mp4':
  Metadata:
    encoder         : Lavf55.33.100
    Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv444p, 1920x1080, q=-1--1, 15360 tbn, 30 tbc
    Stream #0:1: Audio: mp3 (libmp3lame) (i[0][0][0] / 0x0069), 48000 Hz, mono, s16p
Stream mapping:
  Stream #1:0 -> #0:0 (rawvideo -> libx264)
  Stream #0:0 -> #0:1 (pcm_s16le -> libmp3lame)
Press [q] to stop, [?] for help
frame=19011 fps= 30 q=-1.0 Lsize=  186418kB time=00:10:34.84 bitrate=2405.5kbits/s    
video:180861kB audio:4960kB subtitle:0 data:0 global headers:0kB muxing overhead 0.321432%
[libx264 @ 0x256db60] frame I:77    Avg QP: 0.00  size:451985
[libx264 @ 0x256db60] frame P:18934 Avg QP: 0.00  size:  7943
[libx264 @ 0x256db60] mb I  I16..4: 100.0%  0.0%  0.0%
[libx264 @ 0x256db60] mb P  I16..4: 59.7%  0.0%  0.0%  P16..4:  0.0%  0.0%  0.0%  0.0%  0.0%    skip:40.3%
[libx264 @ 0x256db60] coded y,u,v intra: 0.2% 0.2% 0.2% inter: 0.0% 0.0% 0.0%
[libx264 @ 0x256db60] i16 v,h,dc,p: 100%  0%  0%  0%
[libx264 @ 0x256db60] kb/s:2338.03

Ich habe noch ein bisschen herumgespielt und festgestellt, dass ffmpeg mich fragt, ob ich die Datei überschreiben möchte, wenn die Ausgabedatei bereits vorhanden ist. In diesem Fall enthält der Audiostream bereits Dinge, die ich gesagt habe, während die Frage zum Überschreiben der Datei besteht. Das Video startet jedoch nicht, bevor ich das Überschreiben der Datei bestätigt habe, und daher hinkt der Ton natürlich ziemlich hinter dem Video her. Aber das lässt sich leicht beheben. Überschreiben Sie einfach keine vorhandenen Dateien.

Das endgültige Format ist mir eigentlich egal, solange das Video ein verlustfreies Format hat und ich es mit Adobe Premiere bearbeiten kann (mkv wird nicht unterstützt).

EDIT2: Ich bin dem Problem etwas näher gekommen. Wenn man sich den resultierenden Videostream ganz genau ansieht, fällt manchmal auf, dass ein paar Frames fehlen. Vielleicht, weil ich genau in diesem Moment ein Fenster geöffnet habe, wodurch die Videokomprimierung mehr CPU verbraucht (weil sich viele Pixel geändert haben) oder so. Vielleicht gibt es einige Puffer, die ich ffmpeg zuweisen kann, um die Verarbeitung in solchen Momenten zu beschleunigen? Immerhin hat mein Rechner 32 GB RAM, das sollte für irgendetwas gut sein ... Oder gibt es andere verlustfreie Codecs, die ich verwenden könnte oder ...? Das nächste Mal werde ich auch versuchen, eine höhere CPU-Priorität für ffmpeg festzulegen.

Antwort1

Das funktioniert bei mir im Jahr 2019. Ich habe es mit verschiedenen Encodern versucht, aber wenn ich welche verwende, die nicht nativemit ffmpeg kompatibel sind, geraten Audio und Video aus dem Takt. Insbesondere das Video hinkt hinterher. mpeg4und aacsind native.

ffmpeg -f alsa -ac 1 -i pulse -f x11grab -r 30 -s 1920x1080  -i :0.0 -acodec aac -vcodec mpeg4 -preset medium -qscale:v 5 rec.mkv

Antwort2

Ich erhalte die Meldung „[swscaler @ 0xa314080] Warnung: Daten sind nicht ausgerichtet! Dies kann zu Geschwindigkeitseinbußen führen“, das scheint das Problem zu sein. Ich habe jedoch noch keine Lösung.

verwandte Informationen