121 votes

ffmpeg concat : "Nom de fichier non sécurisé"

J'essaie de convertir un tas de fichiers mts en un gros fichier mp4 :

stephan@rechenmonster:/mnt/backupsystem/archive2/Videos/20151222/PRIVATE/AVCHD/BDMV$ ~/bin/ffmpeg-git-20160817-64bit-static/ffmpeg -v info -f concat -i <(find STREAM -name '*' -printf "file '$PWD/%p'\n") -deinterlace -r 25 -s hd720 -c:v libx264 -crf 23 -acodec copy -strict -2 ~/tmp/Videos/20151222.mp4
ffmpeg version N-81364-gf85842b-static http://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.4.1 (Debian 5.4.1-1) 20160803
  configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --enable-libmp3lame --enable-libx264 --enable-libx265 --enable-libwebp --enable-libspeex --enable-libvorbis --enable-libvpx --enable-libfreetype --enable-fontconfig --enable-libxvid --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvo-amrwbenc --enable-gray --enable-libopenjpeg --enable-libopus --enable-libass --enable-gnutls --enable-libvidstab --enable-libsoxr --enable-frei0r --enable-libfribidi --disable-indev=sndio --disable-outdev=sndio --enable-librtmp --enable-libmfx --enable-libzimg --cc=gcc-5
  libavutil      55. 28.100 / 55. 28.100
  libavcodec     57. 53.100 / 57. 53.100
  libavformat    57. 46.101 / 57. 46.101
  libavdevice    57.  0.102 / 57.  0.102
  libavfilter     6. 51.100 /  6. 51.100
  libswscale      4.  1.100 /  4.  1.100
  libswresample   2.  1.100 /  2.  1.100
  libpostproc    54.  0.100 / 54.  0.100
[concat @ 0x56054a0] Unsafe file name '/mnt/backupsystem/archive2/Videos/20151222/PRIVATE/AVCHD/BDMV/STREAM'
/dev/fd/63: Operation not permitted

Une idée de ce qui ne va pas ici ? Que signifie l'expression "fichier non sécurisé" dans ce contexte ?

71 votes

Ajouter -safe 0 avant -i . Voir ffmpeg.org/ffmpeg-all.html#Options-31

0 votes

@Gyan pourquoi il faut encore ajouter -safe 0 même si j'utilise la dernière version (j'ai créé toute l'application mais je n'ai jamais utilisé cette option auparavant et elle fonctionne bien) ?

107voto

sers Points 907

La réponse indiquée par @Mulvya (merci !) fonctionne : "Ajouter -safe 0 avant -i ". Puis un autre problème est apparu avec find STREAM -name '*' -printf "file '$PWD/%p'\n" qui renvoie le chemin vide comme première entrée. J'ai changé cela pour for f in ./*.wav; do echo "file '$PWD/$f'"; done (voir https://trac.ffmpeg.org/wiki/Concatenate ) et maintenant cela semble fonctionner. Hourra !

1 votes

Vous pouvez également modifier le find à la sous-commande find STREAM -type f -name '*' -printf "file '$PWD/%p'\n" (et n'oubliez pas d'ajouter le -safe 0 à la commande ffmpeg).

27voto

林果皞 Points 4216

Dans mon cas, guillemets doubles provoque l'erreur.

J'utilise ffmpeg -f concat -i concat.txt -c copy output.m4a que la commande concat.txt contient la liste des fichiers d'entrée à concaténer.

Nom de fichier non sécurisé (les guillemets doubles sont traités comme une partie du nom de fichier, -safe 0 ne peut pas régler ce problème) :

file "song1.m4a"
file "song2.m4a"

Nom de fichier sûr (guillemets simples) :

file 'song1.m4a'
file 'song2.m4a'

Nom de fichier sûr (sans guillemets) :

file song1.m4a
file song2.m4a

Ce qui précède guillemets simples et sans guillemets n'est sûr que s'il ne contient que "lettres, chiffres, point (sauf préfixe), trait de soulignement et trait d'union". . Ainsi, le nom de fichier commun suivant ne fonctionnera pas :

  • espace
  • glyphe
  • / (chemin)
  • période de préfixe (fichier caché)

Vous avez toujours besoin -safe 0 pour ces cas.

[Avertissement sur la citation et l'évasion]

Vous avez toujours besoin de vous échapper ' dans la partie du nom de fichier . la raison en est que file Im' .avi ajoutera automatiquement le guillemet fermant à Im' .avi' qui est identique à file Im' .avi' . La dernière citation étrange dans file Im' .avi'''''' Les guillemets fermés seront également ajoutés pour devenir file Im' .avi''''''' donc il n'a pas No such file or directory erreur. J'ai compris que ce phénomène est dû au fait que l'espace n'a plus besoin d'être échappé par \ après le préfixe avec le guillemet simple, sans avoir à ajouter le guillemet fermant.

Malgré ce qui précède (doit s'échapper) ' par \ et ne pas s'échapper avec " ), le style d'échappement est similaire à celui du shell . Si le nom de fichier contient des guillemets simples, vous pouvez soit l'échapper avec I\'m\ .m4a (NON entouré de guillemets simples), ou 'I'\''m .m4a' OU 'I'\''m'\ '.m4a' (entouré de guillemets simples), mais ni l'un ni l'autre des styles suivants 'I\'m\ .m4a' ni 'I'm .m4a' .

Lorsque vous testez ffmpeg, faites attention à la première ligne message d'erreur Impossible to open peut induire en erreur (le fichier existe), vous devez vérifier la deuxième ligne qui est l'une des deux suivantes No such file or directory (le fichier n'existe pas) ou Invalid data found when processing input (fichier multimédia invalide).

26voto

Manthan Patel Points 99

La réponse de @sers est tout à fait correcte, je vous montre juste la commande pour que vous ne mettiez pas -safe 0 à n'importe quel endroit.

ffmpeg.exe -f concat -safe 0 -i "clips.txt" -c copy "video.mp4"

26voto

qwr Points 840

Pour répondre à cette question, nous devons voir le fonctionnement des démuxeurs de ffmpeg, qui lisent les flux multimédia à partir d'un fichier d'entrée. Dans ce cas, nous utilisons "concat", avec les options suivantes : (docs archivés)

Ce démuxeur accepte l'option suivante :

safe S'il a la valeur 1, il rejette les chemins de fichiers non sûrs. Un chemin de fichier est considéré comme sûr s'il ne contient pas de spécification de protocole et s'il est relatif et tous ses composants ne contiennent que des caractères du jeu de caractères portables (lettres, chiffres, point, soulignement et trait d'union). (lettres, chiffres, point, trait de soulignement et trait d'union) et ne comportent aucun point au début d'un composant.

S'il est défini à 0, tout nom de fichier est accepté.

La valeur par défaut est 1.

-1 équivaut à 1 si le format a été sondé automatiquement et 0 sinon.

Il s'avère que find . met un ./ devant le fichier. Voir Comment enlever le premier "./" dans le "find" d'unix ? pour des solutions si vous ne voulez pas utiliser -safe 0 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X