ffmpeg concat: “Небезпечне ім’я файлу”


92

Спроба перетворити купу mts-файлів у великий 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

Будь-які ідеї, що тут йде не так? Що в цьому контексті означає термін "небезпечний файл"?


51
Додайте -safe 0раніше -i. Дивіться ffmpeg.org/ffmpeg-all.html#Options-31
Gyan

Відповіді:


91

Відповідь, зазначена @Mulvya (дякую!), Працює: "Додати -safe 0до -i". Потім з’явилася ще одна проблема, find STREAM -name '*' -printf "file '$PWD/%p'\n"яка повертає порожній шлях як перший запис. Змінив це для for f in ./*.wav; do echo "file '$PWD/$f'"; done(див. Https://trac.ffmpeg.org/wiki/Concatenate ), і тепер це, здається, працює. Ура!


1
Ви також можете змінити findпідкоманду на find STREAM -type f -name '*' -printf "file '$PWD/%p'\n"(і не забудьте додати -safe 0команду ffmpeg).
Ерік,

17

Щоб відповісти чому, нам потрібно побачити роботу демультиплексорів ffmpeg, які зчитують мультимедійні потоки з вхідного файлу. У цьому випадку ми використовуємо "concat" із наступними опціями: (архівовані документи)

Цей демультиплексор приймає такий варіант:

safeЯкщо встановлено значення 1, відхиляйте небезпечні шляхи до файлів. Шлях до файлу вважається безпечним, якщо він не містить специфікації протоколу і є відносним, а всі компоненти містять лише символи з переносного набору символів (літери, цифри, крапка, підкреслення та дефіс) і не мають крапки на початку компонента.

Якщо встановлено значення 0, приймається будь-яке ім’я файлу.

За замовчуванням 1.

-1 еквівалентно 1, якщо формат автоматично перевірявся, а 0 - інакше.

Виявляється, find .ставить ./перед файлом. Див. Як зняти провідний символ "./" у unix "find"? рішення, якщо ви не хочете використовувати -safe 0.


16

Відповідь @sers є абсолютно правильною, я просто покажу вам команду, щоб ви ніде не ставили -safe 0.

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

11

У моєму випадку подвійні лапки викликають помилку.

Я використовую ffmpeg -f concat -i concat.txt -c copy output.m4aкоманду, яка concat.txtмістить список вхідного файлу для concat.

Небезпечне ім'я файлу (подвійні лапки розглядаються як частина імені файлу, цього -safe 0не вдається виправити):

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

Безпечне ім'я файлу (одинарні лапки):

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

Безпечне ім'я файлу (без лапок):

file song1.m4a
file song2.m4a

Вищезазначені одинарні лапки та без лапок безпечні лише у тому випадку, якщо вони містять лише "літери, цифри, крапку (крім префікса), підкреслення та дефісу" . Отже, наступне загальне ім’я файлу не буде працювати:

  • простору
  • гліф
  • / (шлях)
  • префіксний період (прихований файл)

Вам все ще потрібні -safe 0ці справи.

[Застереження щодо цитування та втечі]

Вам завжди потрібно втекти 'в частині імені файлу . Причина в тому, щоfile Im' .aviавтоматично додається цитатаIm' .avi', щододає, що є такою ж, якfile Im' .avi'. Останньою непарною лапкою вfile Im' .avi''''''додаються також додані закриваючі лапкиfile Im' .avi''''''', тому вона не маєNo such file or directoryпомилки. Я з’ясовую ці явища через те, що пробіл більше не потребує входу\після префікса з однією лапкою, без необхідності додавати закриваючу лапку.

Незважаючи на вищезазначене (потрібно втекти ', \а не втекти за допомогою "), стиль втечі схожий на оболонку . Якщо ім'я файлу містить одинарні лапки, ви можете або уникнути його зі I\'m\ .m4aстилем (НЕ оточений одинарними лапками), або 'I'\''m .m4a'АБО 'I'\''m'\ '.m4a'(оточеним одинарними лапками), але ні з, 'I\'m\ .m4a'ні з 'I'm .m4a'.

Під час тестування ffmpeg пам’ятайте, що повідомлення про помилкуImpossible to open першого рядка може ввести в оману (файл справді існує), вам потрібно перевірити другий рядок, який є або No such file or directory(файл не існує), або Invalid data found when processing input(недійсний медіафайл).


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