10

Мне нужно использовать concat с абсолютным путем, но, похоже, он не работает. В документе написано, что должно работать. У кого-нибудь есть идея, как заставить это работать? ffmpeg Doc

Это не работает, потому что, кажется, добавляет каталог текстового файла к пути к файлу

Impossible to open 'C:/temp/ffmpeg/c:/temp/ffmpeg/01.mov'

Я использую Windows 7.

ffmpegTest.txt:
file 'c:/temp/ffmpeg/01.mov'
file 'c:/temp/ffmpeg/02.mov'

"Y:/Shotgun/bin/ffmpeg/bin/ffmpeg.exe" -f concat -i "C:/temp/ffmpeg/ffmpegTest.txt" -c copy "C:/temp/ffmpeg/test.mov
ffmpeg version N-58949-g0e575c2 Copyright (c) 2000-2013 the FFmpeg developers
  built on Dec  9 2013 22:06:49 with gcc 4.8.2 (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-libcaca --enable-libfreetype --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-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      52. 58.100 / 52. 58.100
  libavcodec     55. 45.100 / 55. 45.100
  libavformat    55. 22.100 / 55. 22.100
  libavdevice    55.  5.102 / 55.  5.102
  libavfilter     3. 92.100 /  3. 92.100
  libswscale      2.  5.101 /  2.  5.101
  libswresample   0. 17.104 /  0. 17.104
  libpostproc    52.  3.100 / 52.  3.100
[concat @ 0000000000337920] Impossible to open 'C:/temp/ffmpeg/c:/temp/ffmpeg/01.mov'
C:/temp/ffmpeg/ffmpegTest.txt: Invalid argument

6 ответов6

15

Я просто столкнулся с подобными сообщениями об ошибках. В конце концов я понял это. Были две проблемы.

Выпуск 1:

При выполнении

ffmpeg -f concat -i <path_to_text_file> ...

path_to_text_file должен использовать прямую, а не обратную косую черту, даже в Windows. Это правило, похоже, не применяется к путям видеофайлов в командной строке - только к пути текстовых файлов в командной строке.

Выпуск 2:

Пути, перечисленные в вашем текстовом файле, интерпретируются ffmpeg как относящиеся к местоположению вашего текстового файла. (В частности, перечисленные пути не относятся к текущему рабочему каталогу.)

Так, например, если видеофайлы, которые вы пытаетесь объединить вместе, находятся в том же каталоге, что и ваш текстовый файл (но отличаются от текущего рабочего каталога), то пути, перечисленные в вашем текстовом файле, должны быть просто именами видеофайлов. без каких-либо предшествующих каталогов.

Надеюсь, это поможет кому-то в будущем.

2

использование

ffmpeg.exe" -f concat -safe 0 -i fileWithAbsoluePaths.txt -c copy out.mov

В твоем случае

"Y:/Shotgun/bin/ffmpeg/bin/ffmpeg.exe" -f concat -safe 0 -i "C:/temp/ffmpeg/ffmpegTest.txt" -c copy "C:/temp/ffmpeg/test.mov

Ключ -safe 0. Это позволяет вам помещать абсолютные пути в текстовый файл.

2

Вы можете использовать текстовый файл , который представляет собой список входных файлов , так как:

ffmpeg -f concat -i ffmpegTest.txt -c:v copy output.mov

ИЛИ ЖЕ

Вы можете явно назвать файлы так:

ffmpeg.exe -f concat -i 'c:/temp/ffmpeg/01.mov' -i 'c:/temp/ffmpeg/02.mov' -c:v copy 'C:/temp/ffmpeg/output.mov'    

Обратите внимание, что вы используете 2 входа один за другим, а затем используете -c:v copy чтобы сказать, что не должно быть никакого соединения только для перекодировки. Кроме того, это демоверсия concat. Это гибко, но требует, чтобы 2 входных файла имели одинаковые кодеки.

Содержание текстового файла такое, как вы написали:

file 'c:/temp/ffmpeg/01.mov'
file 'c:/temp/ffmpeg/02.mov'

Обратите внимание на одинарные кавычки

Общий формат:

file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'

Это относится к нескольким дискам и путям.

Вот реальный пример файла конкатенации, который работает:

file '/run/media/rnx/New Volume1/PREMIER_OUTPUTEST/Sequence004.mpeg'
file '/home/rnx/Sequence003.mpeg'
file '/run/user/rnx/gvfs/users on edtmchn/Public/Sequence01.mpeg'

Это через:
Один внутренний диск
Один внешний USB-накопитель
Один сетевой диск на другом компьютере с Windows в том же домене

Использование команды:

ffmpeg -f concat -i conc.txt -c:v copy -strict -2 output.mpeg

Это работает, как и ожидалось, без каких-либо ошибок.

1

Обратите внимание; в Windows, если вы используете concat с текстовым файлом, пути в текстовом файле должны быть связаны с выходным путем.

Например

ffmpeg -f concat -i file.txt "C:\foo\file.mp4"

Если ваши файлы находятся в каталоге C:\temp\bar.mp4 ваш текстовый файл выглядит так:

file ..\temp\bar.mp4
...
1

Ответ @ Эрика содержит важную инструкцию, разрешающую полные пути на входе демультиплексора concat (вы должны указать опцию -safe 0 для ffmpeg). Однако под Windows concat demuxer ffmpeg неправильно обрабатывает абсолютные / полные пути, начиная с имени диска. Хотя он правильно распознает полные пути в своих проверках безопасности, он неправильно интерпретирует такие пути как относительные (потому что они не начинаются с косой черты) при открытии файла. Поскольку неабсолютные пути относятся к расположению входного скрипта демультиплексора concat, ffmpeg добавляет путь последнего к пути к файлу. Если аргумент командной строки сценария concat не содержит разделителей пути к файлу (то есть является просто именем файла), проблема маскируется.

Иллюстрация:

concat.txt:
file 'c:/videos/01.flv'
file 'c:/videos/02.flv'


ffmpeg -f concat -safe 0 -i "C:/temp/concat.txt" -c copy "C:/temp/test.flv"
...
[concat @ 0000000000abcdef] Impossible to open 'C:/temp/c:/videos/01.flv'
C:/temp/concat.txt: Invalid argument


cd C:\temp
ffmpeg -f concat -safe 0 -i "./concat.txt" -c copy "C:/temp/test.flv"
...
[concat @ 0000000000abcdef] Impossible to open './c:/videos/01.flv'
./concat.txt: Invalid argument


ffmpeg -f concat -safe 0 -i "concat.txt" -c copy "C:/temp/test.flv"
# Works successfully!
-1

Хотя cmd.exe нечувствителен к регистру, ffmpeg - нет (будучи построенным в основном на Linux, он стремится к соглашениям оболочки * nix). Если вы поменяете c: в каждой строке входного файла на C: это должно сработать, я думаю.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .