2015-05-20 4 views
2

Я пытаюсь преобразовать партии изображений 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 

ответ

0

Пожалуйста, укажите свой вывод на консоль.

При этом, из любопытства, вы можете попробовать использовать фильтр конкатенации и объединить все это в одну команду и посмотреть, не изменит ли это что-либо. Это будет выглядеть примерно так:

ffmpeg -start_number 1001 -r 30 -i 'intermediate_1.%d.png' -i 'intermediate_2.%d.png' -i 'intermediate_3%d.png' -filter_complex "[0:v][1:v][2:v]concat=n=2:v=1:a=0[v]" -map [v] -c:v libx264 -pix_fmt yuv420p -movflags +faststart Output.mp4 
+0

Интересное ...зная очень мало о конкатенационном фильтре, я пробовал это, за исключением того, что использовал его, чтобы объединить фрагменты 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' , но я предполагаю, что это не просто копирует входы на выходы для слияния, а перекодирует все это? –

+0

Вы не можете копировать поток при применении фильтров в FFmpeg. Тем не менее, в вашем исходном сообщении кажется, что вы хотите перекодировать файл в libx264 с помощью '-c: v libx264'. Если вместо этого вы хотите сохранить качество оригинального носителя - и если размер файла не беспокоит вас, попробуйте использовать несжатый кодек. Вы можете указать несжатый кодек с '-c: v rawvideo'. Имейте в виду, что если вы не несжаты, удалите аргумент' -crf 1'. – occvtech

+0

Не совсем: есть два шага. На первом этапе, преобразование из png -> mp4, это нормально для кодирования, и я могу управлять настройками качества по мере необходимости. То, что я пытаюсь избежать, - это дальнейшее ухудшение качества на втором этапе, переход от mp4 -> mp4, когда я присоединяюсь ко всем фрагментам mp4 вместе к одному окончательному видео mp4. Вот где я пытался найти конкатенацию, которая бы работала и создавала без капли и без дубликатов кадров, постоянное видео 30fps, объединяющее все исходные видео. –

Смежные вопросы