ffmpeg concat ne fonctionne pas avec un chemin absolu


14

J'ai besoin d'utiliser concat avec un chemin absolu, mais cela ne semble pas fonctionner. Dans le document, il dit que cela devrait fonctionner. Quelqu'un a une idée de comment le faire fonctionner? ffmpeg Doc

Cela ne fonctionne pas car il semble ajouter le répertoire du fichier texte au chemin du fichier

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

J'utilise 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

Réponses:


16

Je viens de rencontrer des messages d'erreur similaires. Je l'ai finalement compris. Il y avait deux problèmes.

Problème 1:

En faisant

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

le path_to_text_filedoit utiliser des barres obliques, pas des barres obliques inverses, même dans Windows. Cette règle ne semble cependant pas s'appliquer aux chemins de fichiers vidéo sur la ligne de commande - uniquement pour le chemin de fichier texte sur la ligne de commande.

Problème 2:

Les chemins répertoriés dans votre fichier texte sont interprétés par ffmpeg comme étant relatifs à l'emplacement de votre fichier texte. (En particulier, les chemins répertoriés ne sont pas relatifs au répertoire de travail actuel.)

Ainsi, par exemple, si les fichiers vidéo que vous essayez de concaténer ensemble se trouvent dans le même répertoire que votre fichier texte (mais différent du répertoire de travail actuel), les chemins répertoriés dans votre fichier texte doivent simplement être les noms des fichiers vidéo sans aucun répertoire précédent.

J'espère que cela aidera quelqu'un à l'avenir.


Les chemins répertoriés dans votre fichier texte sont interprétés par ffmpeg comme étant relatifs à l'emplacement de votre fichier texte. Il y a un bug dans ffmpeg sous windows, qui est mis en évidence dans ma réponse
Leon

2

Vous pouvez soit utiliser un fichier texte qui est une liste de fichiers d'entrée comme ceci:

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

OU

Vous pouvez nommer explicitement les fichiers comme ceci:

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

Notez que vous utilisez 2 entrées l'une après l'autre, puis utilisez -c:v copypour dire qu'il ne doit pas y avoir de réencodage uniquement. Il s'agit également du démultiplexeur concat . C'est flexible, mais les 2 fichiers d'entrée doivent avoir les mêmes codecs.

Le contenu du fichier texte est comme vous l'avez écrit:

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

Notez les guillemets simples

Le format générique est:

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

Cela s'appliquerait à plusieurs lecteurs et chemins.

Voici un exemple réel d'un fichier de concaténation qui fonctionne:

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'

C'est à travers:
Un lecteur interne Un lecteur
USB externe
Un lecteur réseau sur une autre machine Windows sur le même domaine

L'utilisation de la commande est:

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

Cela fonctionne comme prévu sans aucune erreur.


1
J'ai besoin d'utiliser un fichier car je peux avoir beaucoup de vidéo. Et j'ai besoin d'un chemin absolu dans le fichier
DarkPixel

Je ne peux pas, le fichier se trouve sur un lecteur réseau et dans plusieurs dossiers. Je ne peux pas forcer un répertoire spécifique
DarkPixel

J'ai cette erreur avec le chemin absolu: Impossible d'ouvrir 'C: / temp / ffmpeg / c: /temp/ffmpeg/01.mov'
DarkPixel

Vous obtenez l'erreur car votre commande est incorrecte. Voyez la réponse.
Rajib

1
Cette réponse fonctionne sur ffmpeg version N-90173, Win10, invite CMD uniquement si le paramètre -i N'A PAS de guillemets simples et N'utilise PAS de barres obliques: -i C: \ foo \ bar \ filelist.txt
Jay Borseth

2

Remarquer; sous Windows, si vous utilisez concat avec un fichier texte, les chemins d'accès dans le fichier texte doivent être relatifs au chemin de sortie .

Par exemple

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

Si vos fichiers se trouvent dans le répertoire, C:\temp\bar.mp4votre fichier texte ressemble à ceci:

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

1
"Personnage manquant ?
DavidPostill

2

Utilisation

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

Dans ton cas

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

La clé est -safe 0 . Cela vous permet de mettre des chemins absolus dans le fichier txt.


Sous Windows, il y a une mise en garde qui est couverte dans ma réponse: superuser.com/a/1374679/598963
Leon

2

@ La réponse d'Eric fournit une instruction importante pour autoriser des chemins complets dans l'entrée du démultiplexeur concat (vous devez fournir l' -safe 0option à ffmpeg). Cependant, sous Windows, le démultiplexeur concat de ffmpeg ne gère pas correctement les chemins absolus / complets commençant par le nom du disque . Bien qu'il reconnaisse correctement les chemins d'accès complets dans ses contrôles de sécurité, il interprète mal ces chemins comme relatifs (car ils ne commencent pas par une barre oblique) lors de l'ouverture du fichier. Les chemins non absolus étant relatifs à l'emplacement du script d'entrée du démultiplexeur concat, ffmpegajoute le chemin de ce dernier au chemin du fichier. Si l'argument de ligne de commande du script concat ne contient aucun séparateur de chemin de fichier (c'est-à-dire qu'il s'agit simplement d'un nom de fichier), le problème est masqué.

Illustration:

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

Bien qu'il cmd.exesoit insensible à la casse, il ffmpegne l'est pas (étant construit principalement sur linux, il tend vers les conventions shell * nix). Si vous changez le c:sur chaque ligne de votre fichier d'entrée C:, cela devrait fonctionner, je pense.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.