시청각 콘텐츠의 동기화가 느슨해짐

시청각 콘텐츠의 동기화가 느슨해짐

웹캠 에서 ..mp4​ emgu는 실제 비디오 가 더 낮을 수도 있도록 설정되어 있습니다 (예: . 압축하는 데 사용되는 명령은 다음과 같습니다..aviemguvideoWriter30fpsfps29fps.avi

압축 명령:

fmpeg -i uncompresedvideo.avi -v quiet -stats -nostdin -c:v libx264 -crf 1 -preset veryfast -maxrate 500k -bufsize 1835k vid.mp4

비디오 압축 출력은 다음과 같습니다.

ffmpeg version N-82060-g0cfd6cc Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.4.0 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-dxva2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-libebur128 --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-libschroedinger --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. 32.100 / 55. 32.100
  libavcodec     57. 63.103 / 57. 63.103
  libavformat    57. 52.100 / 57. 52.100
  libavdevice    57.  0.102 / 57.  0.102
  libavfilter     6. 64.100 /  6. 64.100
  libswscale      4.  1.100 /  4.  1.100
  libswresample   2.  2.100 /  2.  2.100
  libpostproc    54.  0.100 / 54.  0.100
Input #0, avi, from 'C:\....\uncompresedvideo.avi':
  Metadata:
    encoder         : Lavf56.36.100
  Duration: 00:02:50.27, start: 0.000000, bitrate: 110597 kb/s
    Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 640x480, 110613 kb/s, 30 fps, 30 tbr, 30 tbn, 30 tbc
[libx264 @ 0000000002636460] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 AVX2 LZCNT BMI2
[libx264 @ 0000000002636460] profile High, level 3.0
[libx264 @ 0000000002636460] 264 - core 148 r2721 72d53ab - H.264/MPEG-4 AVC codec - Copyleft 2003-2016 - http://www.videolan.org/x264.html - options: cabac=1 ref=1 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=2 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=6 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=1 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=10 rc=crf mbtree=1 crf=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 vbv_maxrate=500 vbv_bufsize=1835 crf_max=0.0 nal_hrd=none filler=0 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'C:\....\vid.mp4':
  Metadata:
    encoder         : Lavf57.52.100
    Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 640x480, q=-1--1, 30 fps, 15360 tbn, 30 tbc
    Metadata:
      encoder         : Lavc57.63.103 libx264
    Side data:
      cpb: bitrate max/min/avg: 500000/0/0 buffer size: 1835000 vbv_delay: -1
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))  

이 비디오 녹화 외에도 .wav다른 장치에서 가져온 파일이 있습니다. 다음 명령을 사용하여 이를 내용과 동기화하려고 합니다.

ffmpeg.exe -i vid.mp4 -r 30 -i audio.wav -ar 16000 -map 0:0 -map 1:0 -vcodec copy -acodec aac -shortest output.mp4

동기화 명령 출력은 다음과 같습니다.

ffmpeg version N-82060-g0cfd6cc Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.4.0 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-dxva2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-libebur128 --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-libschroedinger --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. 32.100 / 55. 32.100
  libavcodec     57. 63.103 / 57. 63.103
  libavformat    57. 52.100 / 57. 52.100
  libavdevice    57.  0.102 / 57.  0.102
  libavfilter     6. 64.100 /  6. 64.100
  libswscale      4.  1.100 /  4.  1.100
  libswresample   2.  2.100 /  2.  2.100
  libpostproc    54.  0.100 / 54.  0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'audio.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.52.100
  Duration: 00:02:50.27, start: 0.000000, bitrate: 507 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x480, 504 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
Guessed Channel Layout for Input Stream #1.0 : mono
Input #1, wav, from 'audio.wav':
  Duration: 00:02:52.29, bitrate: 512 kb/s
    Stream #1:0: Audio: pcm_f32le ([3][0][0][0] / 0x0003), 16000 Hz, mono, flt, 512 kb/s
Output #0, mp4, to 'output.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.52.100
    Stream #0:0(und): Video: h264 (High) ([33][0][0][0] / 0x0021), yuv420p, 640x480, q=2-31, 504 kb/s, 30 fps, 30 tbr, 15360 tbn, 15360 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1: Audio: aac (LC) ([64][0][0][0] / 0x0040), 16000 Hz, mono, fltp, 69 kb/s
    Metadata:
      encoder         : Lavc57.63.103 aac
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #1:0 -> #0:1 (pcm_f32le (native) -> aac (native))
Press [q] to stop, [?] for help
frame= 5108 fps=1316 q=-1.0 Lsize=   11735kB time=00:02:52.28 bitrate= 558.0kbits/s speed=44.4x
video:10486kB audio:1151kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.836344%
[aac @ 00000000026977c0] Qavg: 65093.531

오디오와 비디오 모두 공통된 시작을 가지고 있다는 점을 언급하고 싶습니다. 시청각 콘텐츠는 처음에는 동기화가 양호하지만 녹화가 끝나면 동기화가 손실됩니다. 무슨 일이 일어나고 있는지 제안해 주시겠습니까?

귀하의 도움에 감사드립니다.

답변1

문제는 입력 비디오가 인코딩된 방식으로 인해 이미 잘못된 타임스탬프를 가지고 있다는 것입니다. 원본 웹캠 비디오는 가변 길이의 프레임(예: 가변 프레임 속도 비디오)을 출력했지만 압축되지 않은 AVI 파일은끊임없는길이.

따라서 해당 AVI 파일(또는 이후에 압축된 MP4 파일)을 읽으면 ffmpeg는 그것이 일정한 프레임 속도 비디오라고 가정합니다. AVI/MP4의 타임스탬프에는 일정한 오프셋이 있으므로 시간이 지남에 따라 비동기성이 "쌓이게" 됩니다. 입력 타임스탬프가 이미 올바르지 않기 때문에 ffmpeg가 이 문제를 해결할 수 없습니다. 즉, videoWriter귀하가 언급한 것은 가변 프레임 속도 비디오에서 일정한 프레임 속도 비디오를 생성하여 잘못된 타임스탬프를 생성했다고 가정합니다. 프레임 속도가 언제 어떻게 변경되었는지 알지 못하면 타임스탬프를 수정할 수 없습니다.

유일한 옵션은 가변 프레임 속도(예: MKV 또는 MP4/MOV)를 지원하는 컨테이너를 사용하여 웹캠에서 비디오 스트림을 다시 생성하는 것입니다. 그런 다음 후속 변환에서 콘텐츠를 오디오 스트림과 동기화할 수 있습니다. 하지만 해당 웹캠 피드는 아마도 라이브일 것이므로 돌아갈 방법이 없습니다. 게다가 OpenCV에서도 가변 프레임 속도를 출력하는 것이 가능하지 않다고 생각합니다 videoWriter(그러나 저는 이에 대한 전문가는 아닙니다).


참고: 원본 비디오가 잘못된 형식으로 인코딩된 경우 이 문제를 해결하는 것이 더 쉬울 것입니다.끊임없는프레임 속도. 그런 다음 ffmpeg가 입력 비디오에 대해 다른 프레임 속도를 가정하도록 강제하여 일정한 프레임 속도를 가정하여 원래 타임스탬프를 효과적으로 제거하고 새 타임스탬프를 생성할 수 있습니다. 예를 들어, 비디오 변환으로 인해 30fps 비디오가 생성되었지만 원래 입력이 29fps인 경우 다음을 수행하십시오.

ffmpeg -r 29 -i <input> …

관련 정보