
Я пытаюсь взять фрагменты из набора видео и объединить их вместе с помощью демультиплексора concat.
Однако каждый раз звук рассинхронизируется с видео на выходе. Звук, кажется, все больше рассинхронизируется по мере воспроизведения видео. Интересно, что если я нажимаю, чтобы перейти к другому моменту времени в видео с помощью полосы прогресса на плеере, звук синхронизируется с видео, но затем снова постепенно рассинхронизируется. Поиск нового момента времени в плеере, кажется, сбрасывает аудио/видео. Как будто они воспроизводятся с разной скоростью или что-то в этом роде. Я сталкиваюсь с таким поведением как в плеерах Quicktime, так и в VLC.
Для каждого видео я декодирую его, вырезаю из него клип, а затем кодирую его в разрешение 4K со скоростью 25 кадров в секунду со звуком:
ffmpeg -ss 0.5 -t 0.5 -i input_video1.mp4 -r 25 -vf scale=3840:2160 output_video1.mp4
Затем я беру каждое из этих видео и объединяю их вместе с помощью демультиплексора concat:
ffmpeg -f concat -safe 0 -i cut_videos.txt -c copy -y output.mp4
Я делаю короткие нарезки из каждого видео (примерно по 0,5 с).
Я использую подпроцесс Python для автоматизации нарезки и объединения видео.
Я не уверен, происходит ли это из-за этапов обрезки или конкатенации, но когда я воспроизводю промежуточные видеофайлы ( output_video1.mp4
в приведенной выше команде), кажется, что перед началом звука в начале видео есть некоторая тишина.
Когда я объединяю видео, я иногда получаю много таких предупреждений, однако звук все равно становится рассинхронизированным, даже когда я их не получаю:
[mp4 @ 0000021a252ce080] Non-monotonous DTS in output stream 0:1; previous: 51792, current: 50009; changing to 51793. This may result in incorrect timestamps in the output file.
Отэта почта, похоже, проблема в нарезке видео и их временных метках. Решение, предложенное в посте, заключается в том, чтобы декодировать, вырезать и затем кодировать видео, однако я уже это делаю.
Как мне убедиться, что аудио и видео синхронизированы? Я неправильно перекодирую? Похоже, это единственное решение, которое я смог найти в сети, однако оно, похоже, не работает.
ОБНОВЛЯТЬ:
Я черпал вдохновение изэта почтаи отделил аудио и видео с output_video1.mp4
помощью:
ffmpeg -i output_video1.mp4 -acodec copy -vn video.mp4
и
ffmpeg -i output_video1.mp4 -vcodec copy -an audio.mp4
Затем я сравнил длительности video.mp4
и audio.mp4
и получил 0,57 с и 0,52 с соответственно. Поскольку видео длиннее, это объясняет, почему в видео есть период тишины. Затем в посте предлагается перекодирование как решение, однако, как вы можете видеть из кода выше, это не работает для меня.
Пример выходного журнала для команды Trim
built with Apple LLVM version 10.0.0 (clang-1000.11.45.5)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.2.2 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags='-I/Library/Java/JavaVirtualMachines/adoptopenjdk-13.0.1.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/adoptopenjdk-13.0.1.jdk/Contents/Home/include/darwin' --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libmp3lame --enable-libopus --enable-librubberband --enable-libsnappy --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input_video1.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.29.100
Duration: 00:00:04.06, start: 0.000000, bitrate: 14266 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 3840x2160, 14268 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
Metadata:
handler_name : Core Media Video
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 94 kb/s (default)
Metadata:
handler_name : Core Media Audio
File 'output_video1.mp4' already exists. Overwrite ? [y/N] y
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
Stream #0:1 -> #0:1 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
[libx264 @ 0x7fcae4001e00] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 0x7fcae4001e00] profile High, level 5.1
[libx264 @ 0x7fcae4001e00] 264 - core 155 r2917 0a84d98 - H.264/MPEG-4 AVC codec - Copyleft 2003-2018 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 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=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'output_video1.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.29.100
Stream #0:0(und): Video: h264 (libx264) (avc1 / 0x31637661), yuv420p, 3840x2160, q=-1--1, 25 fps, 12800 tbn, 25 tbc (default)
Metadata:
handler_name : Core Media Video
encoder : Lavc58.54.100 libx264
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 69 kb/s (default)
Metadata:
handler_name : Core Media Audio
encoder : Lavc58.54.100 aac
frame= 14 fps=7.0 q=-1.0 Lsize= 928kB time=00:00:00.51 bitrate=14884.2kbits/s dup=0 drop=1 speed=0.255x
video:922kB audio:5kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.194501%
[libx264 @ 0x7fcae4001e00] frame I:1 Avg QP:21.06 size:228519
[libx264 @ 0x7fcae4001e00] frame P:4 Avg QP:22.03 size: 85228
[libx264 @ 0x7fcae4001e00] frame B:9 Avg QP:22.88 size: 41537
[libx264 @ 0x7fcae4001e00] consecutive B-frames: 14.3% 0.0% 0.0% 85.7%
[libx264 @ 0x7fcae4001e00] mb I I16..4: 27.6% 64.3% 8.1%
[libx264 @ 0x7fcae4001e00] mb P I16..4: 9.1% 10.7% 0.2% P16..4: 48.5% 7.3% 3.9% 0.0% 0.0% skip:20.2%
[libx264 @ 0x7fcae4001e00] mb B I16..4: 1.1% 1.0% 0.0% B16..8: 44.5% 2.9% 0.2% direct: 8.3% skip:42.0% L0:45.6% L1:53.2% BI: 1.2%
[libx264 @ 0x7fcae4001e00] 8x8 transform intra:58.2% inter:93.4%
[libx264 @ 0x7fcae4001e00] coded y,uvDC,uvAC intra: 31.4% 62.2% 5.2% inter: 11.4% 30.9% 0.0%
[libx264 @ 0x7fcae4001e00] i16 v,h,dc,p: 15% 52% 12% 21%
[libx264 @ 0x7fcae4001e00] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 19% 33% 32% 2% 2% 2% 4% 2% 4%
[libx264 @ 0x7fcae4001e00] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 20% 39% 9% 3% 4% 4% 12% 3% 4%
[libx264 @ 0x7fcae4001e00] i8c dc,h,v,p: 43% 36% 18% 3%
[libx264 @ 0x7fcae4001e00] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x7fcae4001e00] ref P L0: 69.3% 8.0% 14.8% 7.9%
[libx264 @ 0x7fcae4001e00] ref B L0: 88.1% 9.2% 2.6%
[libx264 @ 0x7fcae4001e00] ref B L1: 90.2% 9.8%
[libx264 @ 0x7fcae4001e00] kb/s:13475.29
[aac @ 0x7fcae4012400] Qavg: 125.000```