ffmpeg로 스크린캐스트 만들기: 비디오+오디오를 동기화 상태로 유지하는 방법은 무엇입니까?

ffmpeg로 스크린캐스트 만들기: 비디오+오디오를 동기화 상태로 유지하는 방법은 무엇입니까?

ffmpeg를 사용하여 일부 스크린캐스트를 만들었습니다. 내가 사용하는 PC에는 가능한 하드웨어(Intel Core i7-4930K Six Core 3.40GHz 12MB 캐시, 32GB RAM)가 있지만 안타깝게도 Windows 7을 실행합니다. Linux에서 스크린캐스트를 하고 싶어서 VMware에 Kubuntu를 설치했습니다. VM에 4개의 CPU 코어와 4GB RAM을 할당했습니다.

다음 명령을 사용하여 스크린캐스트를 녹화합니다.

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

그러나 비디오는 오디오보다 훨씬 빠르게 실행됩니다. 몇 분 후에 오디오(마이크로 녹음됨)가 비디오보다 몇 초 정도 지연됩니다. Audacity를 사용하여 Windows 호스트에서 오디오를 병렬로 녹음하려고 시도했는데 Audacity의 오디오와 VM의 ffmpeg로 캡처한 오디오가 동기화되는 것 같습니다. 그냥 영상이 빨리 나오네요.

그 이유는 무엇입니까? VMware를 사용해야 합니까? 조정할 수 있는 설정이 있나요? 동기화에 사용할 수 있는 ffmpeg 옵션이 있습니까? 예를 들어 오디오/비디오가 동기화되지 않은 경우 ffmpeg가 프레임을 삭제하거나 복제하도록 강제할 수 있다면 그것은 완전히 괜찮을 것입니다. 그러나 ffmpeg의 -vsync 옵션에 대한 설명서를 이해하는 한 이것은 이미 기본값입니다.

나는 다음과 같이 ffmpeg를 직접 컴파일했습니다.우분투 컴파일 가이드그리고 나는 ffmpeg를 사용하는 아이디어를 얻었습니다여기.

편집: 요청에 따라 ffmpeg 출력:

$ /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

좀 더 놀다가 출력 파일이 이미 존재하는 경우 ffmpeg가 파일을 재정의할지 묻는다는 것을 알았습니다. 이 경우 오디오 스트림에는 파일 덮어쓰기 질문이 존재하는 동안 제가 말한 내용이 이미 포함되어 있습니다. 그러나 파일 덮어쓰기를 확인하기 전에는 비디오가 시작되지 않으므로 오디오가 자연스럽게 비디오보다 상당히 뒤떨어집니다. 그러나 그것은 다루기가 쉽습니다. 기존 파일을 덮어쓰지 마세요.

비디오에 무손실 형식이 있고 Adobe Premiere로 편집할 수 있는 한(mkv는 지원하지 않음) 최종 형식에 대해서는 별로 신경 쓰지 않습니다.

EDIT2: 문제에 조금 더 가까워졌습니다. 결과 비디오 스트림을 매우 자세히 살펴보면 몇 개의 프레임이 누락된 것이 눈에 띄는 경우가 있습니다. 바로 이 순간에 창을 열었기 때문에 비디오 압축이 더 많은 CPU를 소비하게 되었기 때문일 수 있습니다(많은 픽셀이 변경되었기 때문에). 어쩌면 그러한 순간에 처리 속도를 높이기 위해 ffmpeg에 할당할 수 있는 버퍼가 있을까요? 내 컴퓨터에 32GB RAM이 있으면 뭔가 좋을 것 같습니다... 아니면 사용할 수 있는 다른 무손실 코덱이 있습니까? 다음에는 ffmpeg에 대해 더 높은 CPU 우선순위를 설정해 보겠습니다.

답변1

이것은 2019년에 저에게 효과적이었습니다. 다른 인코더로 시도했지만 nativeffmpeg가 아닌 인코더를 사용할 때 오디오와 비디오가 동기화되지 않습니다. 특히 영상이 뒤쳐지네요. mpeg4그리고 aac입니다 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

답변2

문제인 것 같은 "[swscaler @ 0xa314080] 경고: 데이터가 정렬되지 않았습니다! 이로 인해 속도 손실이 발생할 수 있습니다."라는 메시지가 표시됩니다. 그러나 아직 결심이 없습니다.

관련 정보