ffmpeg concat не працює з абсолютним шляхом


14

Мені потрібно використовувати concat з абсолютним шляхом, але це, здається, не працює. У документі сказано, що це має працювати. У когось є ідея, як змусити це працювати? ffmpeg Док

Це не працює, оскільки, здається, додає каталог текстових файлів до шляху файлу

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

Відповіді:


16

Я просто натрапив на подібні повідомлення про помилки. Зрештою я зрозумів це. Було два випуски.

Випуск 1:

Коли робиш

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

path_to_text_fileповинні використовувати пряму похилу лінію, а НЕ зворотну косу риску, навіть в Windows. Це правило, здається, не застосовується для шляхів відеофайлів у командному рядку - лише для шляху текстового файлу в командному рядку.

Випуск 2:

Шлях, перелічений у текстовому файлі, інтерпретується ffmpeg як відносний до вашого текстового файлу. (Зокрема, перелічені шляхи не відносяться до поточного робочого каталогу.)

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

Сподіваюся, це допоможе комусь у майбутньому.


Шлях, перелічений у текстовому файлі, інтерпретується ffmpeg як відносний до вашого текстового файлу. Під вікнами є помилка ffmpeg, що підкреслено у моїй відповіді
Леон,

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'    

Зауважте, що ви використовуєте два входи один за одним, а потім використовуєте, -c:v copyщоб сказати, що не повинно бути повторного кодування, яке з'єднується лише. Крім того, це конмат- демексер . Це гнучко, але вимагає, щоб два вхідні файли мали однакові кодеки.

Вміст текстового файлу є таким, як ви написали:

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
Мені потрібно використовувати файл, оскільки я можу мати багато відео. І мені потрібен абсолютний шлях у файлі
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
Відсутній "персонаж?
DavidPostill

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

Ключ - -безпечний 0 . Це дозволяє розмістити абсолютні шляхи у файлі txt.


Під вікнами є застереження, про яке йдеться у моїй відповіді: superuser.com/a/1374679/598963
Леон

2

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

Ілюстрація:

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:, я думаю, він повинен працювати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.