Я пытаюсь преобразовать партии изображений png в одно видео mp4 x264 с помощью ffmpeg. Преобразование по причинам, в которые я не буду входить, преобразует группы кадров в короткие фрагменты mp4, а затем я хочу взять эти фрагменты и объединить их в финальное видео с определенным fps (в данном случае 30 кадров в секунду).Использование ffmpeg для объединения небольших блоков mp4?
Мое понимание параметров ffmpeg и x264 слишком ограничено, и, хотя я могу без проблем создавать отдельные куски mp4 из исходных кадров png, окончательное слияние всегда заканчивается дублированием и/или отбрасыванием кадров, особенно с очень короткими фрагментами (< 4 кадра).
Преобразование из детские в mp4 использует эту команду:
ffmpeg -start_number 1001 -framerate 30 -f image2 -i 'intermediate.%d.png' -c:v libx264 -crf 1 -pix_fmt yuv420p -movflags +faststart -frames:v 4 -r 30 chunk.1.mp4 -y
, который, как представляется, работать, как и ожидалось, я получаю воспроизводимый mp4 кусок, в этом случае, 4 кадров последовательности PNG изображений 30 кадров в секунду , Длина каждого фрагмента может быть от 1 кадра до 100 кадров.
Когда все куски генерируются, я пытался использовать Concat демультиплексора объединить без перекодирования, помещая все пути источника порций в файле:
concat.txt:
file 'chunk.1.mp4'
file 'chunk.2.mp4'
file 'chunk.3.mp4'
...
и затем запустить эту команду FFmpeg:
ffmpeg -f concat -i concat.txt -c:v copy merged.mp4 -y
, но он говорит это во время конкатенации:
[concat @ 0x315ff80] Продолжительность оценки от битрейта может быть неточной
и полученный mp4 имеет сброшенные/дублированные кадры. Так что я попытался добавить продолжительность данные в файл concat.txt:
file 'chunk.1.mp4'
duration 0.133333
file 'chunk.2.mp4'
duration 0.133333
file 'chunk.3.mp4'
duration 0.066666
в этом случае, два 4-кадра/30 кадров в секунду ломти и один 2-кадр/30fps кусок. Что избавляет от этого предупреждения оценки, но результат все еще дублирует/снимает кадры.
Я не уверен, где я здесь ошибся ... что мне нужно сделать либо в производстве коротких сегментов mp4, либо на этапе комбинации, чтобы получить один mp4 при правильной частоте кадров без дублированных или отброшенных кадров?
Как было предложено, вот вывод на консоль для преобразования из png-> mp4 кусках:
ffmpeg -loglevel verbose -start_number 1001 -framerate 30 -f image2 -i 'intermediate.%d.png' -c:v libx264 -crf 1 -pix_fmt yuv420p -movflags +faststart -frames:v 4 -r 30 chunk.1.mp4 -y
ffmpeg version 2.5.4 Copyright (c) 2000-2015 the FFmpeg developers
built on Feb 26 2015 10:23:42 with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-3)
configuration: --prefix=/dept/srd/vendor/ffmpeg/bundle.rhel6/ffmpeg2.5.4 --enable-static --enable-pthreads --enable-gpl --enable-version3 --disable-ffserver --disable-ffplay --disable-ffprobe --enable-x11grab --enable-nonfree --extra-cflags=-I/dept/srd/vendor/ffmpeg/extern/rhel6/include --extra-ldflags=-L/dept/srd/vendor/ffmpeg/extern/rhel6/lib --enable-libx264 --enable-fontconfig --enable-libfreetype --enable-swscale --enable-libmp3lame --enable-libfaac --disable-yasm
libavutil 54. 15.100/54. 15.100
libavcodec 56. 13.100/56. 13.100
libavformat 56. 15.102/56. 15.102
libavdevice 56. 3.100/56. 3.100
libavfilter 5. 2.103/5. 2.103
libswscale 3. 1.101/3. 1.101
libswresample 1. 1.100/1. 1.100
libpostproc 53. 3.100/53. 3.100
Input #0, image2, from 'intermediate.%d.png':
Duration: 00:00:00.27, start: 0.000000, bitrate: N/A
Stream #0:0: Video: png, rgba, 1024x1024 (0x0), 30 fps, 30 tbr, 30 tbn, 30 tbc
[graph 0 input from stream 0:0 @ 0x273e9c0] w:1024 h:1024 pixfmt:rgba tb:1/30 fr:30/1 sar:0/1 sws_param:flags=2
[auto-inserted scaler 0 @ 0x2737ea0] w:iw h:ih flags:'0x4' interl:0
[format @ 0x273ece0] auto-inserting filter 'auto-inserted scaler 0' between the filter 'Parsed_null_0' and the filter 'format'
[auto-inserted scaler 0 @ 0x2737ea0] w:1024 h:1024 fmt:rgba sar:0/1 -> w:1024 h:1024 fmt:yuv420p sar:0/1 flags:0x4
[libx264 @ 0x273c540] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
[libx264 @ 0x273c540] profile High, level 3.2
[libx264 @ 0x273c540] 264 - core 142 - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - 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=36 lookahead_threads=6 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=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'chunk.1.mp4':
Metadata:
encoder : Lavf56.15.102
Stream #0:0: Video: h264 (libx264) ([33][0][0][0]/0x0021), yuv420p, 1024x1024, q=-1--1, 30 fps, 15360 tbn, 30 tbc
Metadata:
encoder : Lavc56.13.100 libx264
Stream mapping:
Stream #0:0 -> #0:0 (png (native) -> h264 (libx264))
Press [q] to stop, [?] for help
No more output streams to write to, finishing.
[mp4 @ 0x273baa0] Starting second pass: moving the moov atom to the beginning of the file
frame= 4 fps=0.0 q=-1.0 Lsize= 197kB time=00:00:00.06 bitrate=24228.7kbits/s
video:196kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.439751%
Input file #0 (intermediate.%d.png):
Input stream #0:0 (video): 8 packets read (2341016 bytes); 5 frames decoded;
Total: 8 packets (2341016 bytes) demuxed
Output file #0 (chunk.3.mp4):
Output stream #0:0 (video): 4 frames encoded; 4 packets muxed (201023 bytes);
Total: 4 packets (201023 bytes) muxed
[libx264 @ 0x273c540] frame I:1 Avg QP: 0.47 size:116049
[libx264 @ 0x273c540] frame P:1 Avg QP: 2.29 size: 37932
[libx264 @ 0x273c540] frame B:2 Avg QP: 2.37 size: 23184
[libx264 @ 0x273c540] consecutive B-frames: 25.0% 0.0% 75.0% 0.0%
[libx264 @ 0x273c540] mb I I16..4: 80.0% 4.5% 15.5%
[libx264 @ 0x273c540] mb P I16..4: 0.2% 0.1% 0.4% P16..4: 8.1% 3.6% 3.7% 0.0% 0.0% skip:83.9%
[libx264 @ 0x273c540] mb B I16..4: 0.0% 0.0% 0.0% B16..8: 4.8% 1.2% 1.6% direct: 4.3% skip:88.1% L0:38.6% L1:39.3% BI:22.1%
[libx264 @ 0x273c540] 8x8 transform intra:4.6% inter:14.8%
[libx264 @ 0x273c540] coded y,uvDC,uvAC intra: 20.7% 22.9% 22.8% inter: 8.7% 10.1% 10.0%
[libx264 @ 0x273c540] i16 v,h,dc,p: 95% 1% 3% 1%
[libx264 @ 0x273c540] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 21% 21% 22% 6% 6% 6% 7% 5% 6%
[libx264 @ 0x273c540] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 20% 17% 18% 7% 8% 7% 8% 6% 8%
[libx264 @ 0x273c540] i8c dc,h,v,p: 89% 4% 4% 3%
[libx264 @ 0x273c540] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x273c540] ref B L1: 89.5% 10.5%
[libx264 @ 0x273c540] kb/s:12020.88
как я уже сказал, это, кажется, чтобы получить действительный mp4 30 кадров в секунду с дублированию или пропущенные кадры из входного изображений.
Вот вывод комбайна фазы:
ffmpeg -loglevel verbose -f concat -i concat.txt -c:v copy merged.mp4 -y
ffmpeg version 2.5.4 Copyright (c) 2000-2015 the FFmpeg developers
built on Feb 26 2015 10:23:42 with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-3)
configuration: --prefix=/dept/srd/vendor/ffmpeg/bundle.rhel6/ffmpeg2.5.4 --enable-static --enable-pthreads --enable-gpl --enable-version3 --disable-ffserver --disable-ffplay --disable-ffprobe --enable-x11grab --enable-nonfree --extra-cflags=-I/dept/srd/vendor/ffmpeg/extern/rhel6/include --extra-ldflags=-L/dept/srd/vendor/ffmpeg/extern/rhel6/lib --enable-libx264 --enable-fontconfig --enable-libfreetype --enable-swscale --enable-libmp3lame --enable-libfaac --disable-yasm
libavutil 54. 15.100/54. 15.100
libavcodec 56. 13.100/56. 13.100
libavformat 56. 15.102/56. 15.102
libavdevice 56. 3.100/56. 3.100
libavfilter 5. 2.103/5. 2.103
libswscale 3. 1.101/3. 1.101
libswresample 1. 1.100/1. 1.100
libpostproc 53. 3.100/53. 3.100
Input #0, concat, from 'concat.txt':
Duration: 00:00:00.67, start: 0.000000, bitrate: 2 kb/s
Stream #0:0: Video: h264 (High) (avc1/0x31637661), yuv420p, 1024x1024, 7791 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc
Output #0, mp4, to 'merged.mp4':
Metadata:
encoder : Lavf56.15.102
Stream #0:0: Video: h264 ([33][0][0][0]/0x0021), yuv420p, 1024x1024 (0x0), q=2-31, 7791 kb/s, 30 fps, 15360 tbn, 15360 tbc
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
No more output streams to write to, finishing.
frame= 20 fps=0.0 q=-1.0 Lsize= 748kB time=00:00:00.56 bitrate=10805.0kbits/s
video:746kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.141687%
Input file #0 (concat.txt):
Input stream #0:0 (video): 20 packets read (764361 bytes);
Total: 20 packets (764361 bytes) demuxed
Output file #0 (merged.mp4):
Output stream #0:0 (video): 20 packets muxed (764361 bytes);
Total: 20 packets (764361 bytes) muxed
Интересное ...зная очень мало о конкатенационном фильтре, я пробовал это, за исключением того, что использовал его, чтобы объединить фрагменты mp4 в окончательный mp4, и используя этот метод, он, похоже, создает хороший результат без дублированных или отброшенных кадров: 'ffmpeg -i chunk.1.mp4 -i chunk.2.mp4 -i chunk.3.mp4 -i chunk.4.mp4 -filter_complex "[0: 0] [1: 0] [2: 0] [3: 0] concat = n = 4: v = 1: a = 0 [v] "-map" [v] "-c: v libx264 -pix_fmt yuv420p -movflags + faststart -crf 1 filter.mp4 -y' , но я предполагаю, что это не просто копирует входы на выходы для слияния, а перекодирует все это? –
Вы не можете копировать поток при применении фильтров в FFmpeg. Тем не менее, в вашем исходном сообщении кажется, что вы хотите перекодировать файл в libx264 с помощью '-c: v libx264'. Если вместо этого вы хотите сохранить качество оригинального носителя - и если размер файла не беспокоит вас, попробуйте использовать несжатый кодек. Вы можете указать несжатый кодек с '-c: v rawvideo'. Имейте в виду, что если вы не несжаты, удалите аргумент' -crf 1'. – occvtech
Не совсем: есть два шага. На первом этапе, преобразование из png -> mp4, это нормально для кодирования, и я могу управлять настройками качества по мере необходимости. То, что я пытаюсь избежать, - это дальнейшее ухудшение качества на втором этапе, переход от mp4 -> mp4, когда я присоединяюсь ко всем фрагментам mp4 вместе к одному окончательному видео mp4. Вот где я пытался найти конкатенацию, которая бы работала и создавала без капли и без дубликатов кадров, постоянное видео 30fps, объединяющее все исходные видео. –