web-dev-qa-db-fra.com

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

Essayer 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

Des idées ce qui ne va pas ici? Que signifie le terme "fichier non sécurisé" dans ce contexte?

59
sers

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. 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!

55
sers

Pour répondre pourquoi, de https://ffmpeg.org/ffmpeg-all.html#Options-35 :

Ce démultiplexeur accepte l'option suivante:

safe Si défini sur 1, refuse les chemins d'accès aux fichiers non sécurisés. Un chemin de fichier est considéré comme sûr s'il ne contient pas de spécification de protocole, qu'il est relatif et que tous les composants ne contiennent que des caractères du jeu de caractères portable (lettres, chiffres, point, trait de soulignement et trait d'union) et n'ont pas de période au début d'un composant.

Si défini sur 0, tout nom de fichier est accepté.

La valeur par défaut est 1.

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

Il s'avère find . met un ./ devant le fichier. Voir Comment éliminer les "./" dans "trouver"? == pour des solutions si vous ne voulez pas utiliser -safe 0.

8
qwr

À propos de la réponse est tout à fait raison je montre juste votre commande afin de ne pas mettre -safe 0 nulle part ailleurs.

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

Dans mon cas, guillemets doubles provoque l'erreur.

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

Nom de fichier non sécurisé (guillemets):

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

Nom du fichier sécurisé (guillemets simples):

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

Nom du fichier sécurisé (sans guillemets):

file song1.m4a
file song2.m4a

Notez que guillemets simples et sans guillemets ne fonctionne que s'il n'y a pas d'espace ('/' convient), vous avez toujours besoin de -safe 0 _ si le nom du fichier/chemin contient de l'espace.

1
林果皞