ffmpeg를 사용하여 마이크 + 데스크탑 오디오 + 화면을 녹음할 때 데스크탑 오디오가 뒤쳐집니다.

ffmpeg를 사용하여 마이크 + 데스크탑 오디오 + 화면을 녹음할 때 데스크탑 오디오가 뒤쳐집니다.

ffmpeg를 사용하여 마이크, 데스크탑 오디오 및 화면을 녹음하기 위해 다음 스크립트를 구성했습니다.

DATE=`which date`
RESO=2560x1440
FPS=30
PRESET=ultrafast
DIRECTORY=$HOME/Video/
FILENAME=videocast`$DATE +%d%m%Y_%H.%M.%S`.mkv

ffmpeg -y -vsync 1 \
-f pulse -ac 2 -i alsa_output.pci-0000_00_1b.0.analog-stereo.monitor \
-f pulse -ac 1 -ar 25000 -i alsa_input.usb-0d8c_C-Media_USB_Headphone_Set-00-Set.analog-mono \
-filter_complex aresample=async=1,amix=duration=shortest,apad \
-f x11grab -r $FPS -s $RESO -i :0.0 \
-acodec libvorbis \
-vcodec libx264 -pix_fmt yuv420p -preset $PRESET -threads 0 \
$DIRECTORY$FILENAME

모든 것이 녹음되고 화면과 마이크 소리 사이에는 아무런 문제가 없지만 데스크톱 오디오는 심하게 뒤떨어집니다.

동기화에서 시작되지만 ffplay에서도 재생 중에 시간이 지남에 따라 악화됩니다. 어떤 애플리케이션에서 사운드를 재생하든 상관없습니다. 브라우저의 Youtube 비디오, 데스크톱 사운드 및 Rhythmbox(몇 초 동안 노래를 재생한 다음 중지하고 기다렸다가 반복)가 모두 동기화되지 않습니다.

터미널 출력에 대한 불만

"ALSA lib pcm.c:7843:(snd_pcm_recover) overrun occurred22.73 bitrate=10384.5kbits/s    
ALSA lib pcm.c:7843:(snd_pcm_recover) underrun occurred" 

비슷하지만 그게 무슨 뜻인지 모르겠어요.

전체 터미널 출력은 다음과 같습니다.

ffmpeg version 2.0.1 Copyright (c) 2000-2013 the FFmpeg developers
  built on Aug 11 2013 14:52:28 with gcc 4.8.1 (GCC) 20130725 (prerelease)
  configuration: --prefix=/usr --disable-debug --disable-static --enable-avresample --enable-dxva2 --enable-fontconfig --enable-gpl --enable-libass --enable-libbluray --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libv4l2 --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid --enable-pic --enable-postproc --enable-runtime-cpudetect --enable-shared --enable-swresample --enable-vdpau --enable-version3 --enable-x11grab
  libavutil      52. 38.100 / 52. 38.100
  libavcodec     55. 18.102 / 55. 18.102
  libavformat    55. 12.100 / 55. 12.100
  libavdevice    55.  3.100 / 55.  3.100
  libavfilter     3. 79.101 /  3. 79.101
  libavresample   1.  1.  0 /  1.  1.  0
  libswscale      2.  3.100 /  2.  3.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  3.100 / 52.  3.100
Guessed Channel Layout for  Input Stream #0.0 : stereo
Input #0, pulse, from 'alsa_output.pci-0000_00_1b.0.analog-stereo.monitor':
  Duration: N/A, start: 0.014093, bitrate: 1536 kb/s
    Stream #0:0: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
Guessed Channel Layout for  Input Stream #1.0 : mono
Input #1, pulse, from 'alsa_input.usb-0d8c_C-Media_USB_Headphone_Set-00-Set.analog-mono':
  Duration: N/A, start: 0.006172, bitrate: 400 kb/s
    Stream #1:0: Audio: pcm_s16le, 25000 Hz, mono, s16, 400 kb/s
[x11grab @ 0x218a6e0] device: :0.0 -> display: :0.0 x: 0 y: 0 width: 2560 height: 1440
[x11grab @ 0x218a6e0] shared memory extension found
Input #2, x11grab, from ':0.0':
  Duration: N/A, start: 1379021580.184321, bitrate: N/A
    Stream #2:0: Video: rawvideo (BGR[0] / 0x524742), bgr0, 2560x1440, -2147483 kb/s, 30 tbr, 1000k tbn, 30 tbc
[libx264 @ 0x21ae560] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
[libx264 @ 0x21ae560] profile Constrained Baseline, level 5.0
[libx264 @ 0x21ae560] 264 - core 133 r2339 585324f - H.264/MPEG-4 AVC codec - Copyleft 2003-2013 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=12 lookahead_threads=2 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=crf mbtree=0 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=0
Output #0, matroska, to '/home/anders/Video/videocast12092013_23.33.00.mkv':
  Metadata:
    encoder         : Lavf55.12.100
    Stream #0:0: Audio: vorbis (libvorbis) (oV[0][0] / 0x566F), 25000 Hz, mono, fltp
    Stream #0:1: Video: h264 (libx264) (H264 / 0x34363248), yuv420p, 2560x1440, q=-1--1, 1k tbn, 30 tbc
Stream mapping:
  Stream #0:0 (pcm_s16le) -> aresample (graph 0)
  Stream #1:0 (pcm_s16le) -> amix:input1 (graph 0)
  amix (graph 0) -> Stream #0:0 (libvorbis)
  Stream #2:0 -> #0:1 (rawvideo -> libx264)
Press [q] to stop, [?] for help
ALSA lib pcm.c:7843:(snd_pcm_recover) overrun occurred22.73 bitrate=10384.5kbits/s    
ALSA lib pcm.c:7843:(snd_pcm_recover) underrun occurred
ALSA lib pcm.c:7843:(snd_pcm_recover) underrun occurred3.22 bitrate=10423.3kbits/s    
ALSA lib pcm.c:7843:(snd_pcm_recover) overrun occurred25.25 bitrate=11011.0kbits/s    
ALSA lib pcm.c:7843:(snd_pcm_recover) underrun occurred
ALSA lib pcm.c:7843:(snd_pcm_recover) underrun occurred5.76 bitrate=11013.7kbits/s    
ALSA lib pcm.c:7843:(snd_pcm_recover) overrun occurred27.25 bitrate=11175.4kbits/s    
ALSA lib pcm.c:7843:(snd_pcm_recover) underrun occurred7.76 bitrate=11168.7kbits/s    
ALSA lib pcm.c:7843:(snd_pcm_recover) underrun occurred8.24 bitrate=11176.4kbits/s    
ALSA lib pcm.c:7843:(snd_pcm_recover) overrun occurred55.48 bitrate=11243.8kbits/s    
ALSA lib pcm.c:7843:(snd_pcm_recover) underrun occurred
ALSA lib pcm.c:7843:(snd_pcm_recover) underrun occurred
frame=12871 fps= 30 q=-1.0 Lsize=  542369kB time=00:07:09.31 bitrate=10349.3kbits/s    
video:539762kB audio:2363kB subtitle:0 global headers:3kB muxing overhead 0.044476%
[libx264 @ 0x21ae560] frame I:52    Avg QP:15.46  size:725888
[libx264 @ 0x21ae560] frame P:12819 Avg QP:18.26  size: 40172
[libx264 @ 0x21ae560] mb I  I16..4: 100.0%  0.0%  0.0%
[libx264 @ 0x21ae560] mb P  I16..4:  2.6%  0.0%  0.0%  P16..4: 18.1%  0.0%  0.0%  0.0%  0.0%    skip:79.3%
[libx264 @ 0x21ae560] coded y,uvDC,uvAC intra: 57.8% 49.8% 25.3% inter: 8.9% 8.7% 2.2%
[libx264 @ 0x21ae560] i16 v,h,dc,p: 23% 29% 32% 16%
[libx264 @ 0x21ae560] i8c dc,h,v,p: 45% 28% 18%  9%
[libx264 @ 0x21ae560] kb/s:10306.26

저를 도와주세요. 저는 이 작업을 수행할 시간이 정말 가까워졌습니다!

업데이트: filter_complex 및 마이크를 건너뛸 때 데스크탑 오디오가 더 적은 양의 비트로 동기화되지 않습니다. copy대신을 사용해 libvorbis도 아무 것도 변경되지 않습니다.

답변1

이것이 문제를 해결할 수 있을지 확실하지 않지만 문제가 없는 스크립트가 있습니다. 두 스크립트를 비교해 보면 제가 볼 수 있는 유일한 차이점은 다음과 같습니다.

  • filter_complex건 그냥 아머지야
  • 4개의 스레드를 강제로 사용합니다.
  • 내 오디오 코덱은 mp3lame입니다.

나는 오디오 코덱 변경이 가장 관련성이 높은 차이점이라고 생각합니다. 일부 오디오 코덱은 어떻게든 비디오와 인터레이스되어 동기화가 되지 않는 것 같습니다. 안타깝게도 저는 비디오 엔지니어가 아니기 때문에 확신할 수 없습니다.

내 스크립트는 다음과 같습니다.

#!/usr/bin/bash

# video information
INRES="1920x1080"
OUTRES="1280x720"
FPS="24"
QUAL="fast"
FILE_OUT="$1"

#audio information
PULSE_IN="alsa_input.pci-0000_00_1b.0.analog-stereo"
PULSE_OUT="alsa_output.pci-0000_00_1b.0.analog-stereo.monitor"

ffmpeg -f x11grab -s "$INRES" -r "$FPS" -i :0.0 \
    -f pulse -i "$PULSE_IN" -f pulse -i "$PULSE_OUT" \
    -filter_complex amerge \
    -vcodec libx264 -crf 30 -preset "$QUAL" -s "$OUTRES" \
    -acodec libmp3lame -ab 96k -ar 44100 -threads 4 -pix_fmt yuv420p \
    -f flv "$FILE_OUT"

답변2

발생할 수 있는 문제는 데스크톱 사운드가 잘못된 샘플 속도로 캡처된다는 것입니다. 다음과 같은 경우 이런 일이 발생할 수 있습니다.펄스 오디오가 샘플링 속도를 잘못 보고함.

연결된 답변에서 제안한 대로 구성 파일을 수정한 후( default-sample-rate설정의 주석 처리를 해제 /etc/pulse/daemon.conf하고 올바른 값으로 설정 48000) 다음을 수행해야 합니다.사용자의 Pulse 오디오 데몬을 다시 시작하십시오.와 함께:

pulseaudio -k
pulseaudio -D

스피커를 통해 일부 음악을 재생하면 마이크와 펄스 오디오 모니터 모두에서 캡처되므로 샘플링 속도 불일치가 분명합니다. 모니터 스트림이 나중에 시작될 뿐만 아니라 테너도 바리톤으로 전환됩니다.

관련 정보