Конкат ffmpeg не работает с абсолютным путем

14

Мне нужно использовать 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
DarkPixel
источник

Ответы:

16

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

Выпуск 1:

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

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

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

Выпуск 2:

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

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

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

морж
источник
Пути, перечисленные в вашем текстовом файле, интерпретируются ffmpeg как относящиеся к местоположению вашего текстового файла. В ffmpeg под окнами есть ошибка, которая выделена в моем ответе
Leon
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 demuxer . Это гибкий, но требует, чтобы 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

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

Rajib
источник
1
Мне нужно использовать файл, так как у меня может быть много видео. И мне нужен абсолютный путь в файле
DarkPixel
Я не могу, файл находится на сетевом диске и в нескольких папках. Я не могу форсировать конкретный каталог
DarkPixel
У меня есть эта ошибка с абсолютным путем: невозможно открыть 'C: / temp / ffmpeg / c: /temp/ffmpeg/01.mov'
DarkPixel
Вы получаете ошибку, потому что ваша команда неверна. Смотрите ответ.
Раджиб
1
Этот ответ работает для ffmpeg версии N-90173, Win10, CMD, только если параметр -i НЕ имеет одинарных кавычек и НЕ использует прямую косую черту: -i C: \ foo \ bar \ filelist.txt
Jay Borseth
2

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

Например

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

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

file ..\temp\bar.mp4
...
Патрик
источник
1
Отсутствующий "персонаж?
ДэвидПостилл
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 . Это позволяет вам помещать абсолютные пути в текстовый файл.

Эрик
источник
Под окнами есть оговорка, которая описана в моем ответе: superuser.com/a/1374679/598963
Леон
2

@ В ответе Эрика содержится важная инструкция, позволяющая указывать полные пути на входе демультиплексора concat (необходимо указать -safe 0параметр ffmpeg). Однако под Windows concat demuxer ffmpeg неправильно обрабатывает абсолютные / полные пути, начиная с имени диска . Хотя он правильно распознает полные пути в своих проверках безопасности, он неверно интерпретирует такие пути как относительные (потому что они не начинаются с косой черты) при открытии файла. Поскольку неабсолютные пути относятся к местоположению входного скрипта демультиплексора ffmpegconcat, предварительно добавляет путь к пути к файлу. Если аргумент командной строки сценария 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 shell соглашениям). Я думаю, если вы измените значение c:в каждой строке входного файла на C:, оно должно работать.

evilsoup
источник