Ошибка «перезаписи» промежутка времени ffmpeg - может быть проблема с глобализацией / оболочкой?

1078
ljwobker

У меня возникли проблемы с тем, что я думаю, должен быть простой скрипт FFMPEG. Я просто пытаюсь взять все файлы jpg в заданном каталоге и заполнить их видео с промежутками времени. Я чувствую себя комфортно со всеми опциями кодировщика и тому подобным в ffmpeg, но я не могу понять правильный синтаксис.

Строка, которую я пробую, должна (да, я знаю ... "следует") просто взять все изображения .JPG в каталоге и закодировать их как "out.mp4". Но если вы посмотрите внизу, я получу приглашение перезаписать GOPR3974.JPG - второй файл в каталоге. Это подразумевает, что по какой-то причине он неправильно удаляет все файлы ... Я пробовал одинарные кавычки, двойные кавычки, я пытался

ffmpeg -i GOPR%04d.JPG out.mp4 

поэтому где-то должно быть что-то, что работает. Если это имеет значение, это выполняется в среде Cygwin с использованием Bash ...

[lwobker:/dtop/hack]$ /usr/local/bin/ffmpeg.exe -i GOPR*.JPG out.mp4 ffmpeg version N-64919-ga613257 Copyright (c) 2000-2014 the FFmpeg developers built on Jul 23 2014 00:35:22 with gcc 4.8.3 (GCC) configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --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-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-decklink --enable-zlib libavutil 52. 92.101 / 52. 92.101 libavcodec 55. 69.100 / 55. 69.100 libavformat 55. 48.101 / 55. 48.101 libavdevice 55. 13.102 / 55. 13.102 libavfilter 4. 11.102 / 4. 11.102 libswscale 2. 6.100 / 2. 6.100 libswresample 0. 19.100 / 0. 19.100 libpostproc 52. 3.100 / 52. 3.100 Input #0, image2, from 'GOPR3973.JPG': Duration: 00:00:00.04, start: 0.000000, bitrate: N/A Stream #0:0: Video: mjpeg, yuvj422p(pc, bt470bg), 1920x1440 [SAR 72:72 DAR 4:3], 25 tbr, 25 tbn, 25 tbc File 'GOPR3974.JPG' already exists. Overwrite ? [y/N] 
1

1 ответ на вопрос

4
slhck

Method 1: Use sequence patterns

What you really need is this, if your first image is called GOPR0001.JPG:

ffmpeg.exe -i "GOPR%04d.JPG" -pix_fmt yuv420p out.mp4 

Or if the first image is called GOPR3973.JPG, you need to give ffmpeg the start number to look for:

ffmpeg.exe -start_number 3973 -i "GOPR%04d.JPG" -pix_fmt yuv420p out.mp4 

Method 2: Use globbing patterns

If your ffmpeg version has support for globbing (which the Windows builds do not have, I think), then you can simply do:

ffmpeg.exe -pattern_type glob -i "GOPR*.JPG" -pix_fmt yuv420p out.mp4 

This is preferred if you don't know the start number or simply don't care for precise control.

Why it doesn't work

ffmpeg.exe -i GOPR*.JPG out.mp4 

This does not work because it will expand to something like this (assuming your first image is called GOPR0001.JPG):

ffmpeg.exe -i GOPR0001.JPG GOPR0002.JPG … out.mp4 

Since ffmpeg treats the last unnamed argument option (i.e. anything without a leading -) as the output file name, GOPR2.JPG would be the output, and anything until out.mp4 will not be applied.

Some hints

  • -pix_fmt yuv420p is needed to convert from the JPEG's YUV 4:2:2 colorspace to 4:2:0 subsampling. Otherwise, some (most non-FFmpeg-based) players will not be able to show the video

  • Control the quality by setting the -crf 23 option, and choosing something between 18 and 28, where lower means better quality.

  • You may want to set the framerate according to which the input frames (images) were captured. Do this by running ffmpeg.exe -framerate 30 -start_number …. If you don't specify the framerate, ffmpeg will assume that your original frames were recorded at 25 Hz.

  • Read the image2 demuxer part of the manual.

  • Double quotes are always good to use to prevent shell expansion of patterns.