ffmpeg कॉन्कैट: "असुरक्षित फ़ाइल नाम"


92

Mts-files का एक गुच्छा एक बड़ी 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
ज्ञान

जवाबों:


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 0ffmpeg कमांड में जोड़ना न भूलें )।
erik

17

क्यों जवाब देने के लिए, हमें ffmpeg के डिमॉकर्स के संचालन को देखने की आवश्यकता है, जो एक इनपुट फ़ाइल से मल्टीमीडिया स्ट्रीम पढ़ते हैं। इस मामले में, हम निम्नलिखित विकल्पों के साथ "कॉनकट" का उपयोग कर रहे हैं: (संग्रहीत डॉक्स)

यह विकल्प निम्नलिखित विकल्प को स्वीकार करता है:

safeयदि 1 पर सेट किया गया है, तो असुरक्षित फ़ाइल पथों को अस्वीकार करें। एक फ़ाइल पथ सुरक्षित माना जाता है यदि इसमें प्रोटोकॉल विनिर्देश नहीं है और सापेक्ष है और सभी घटकों में केवल पोर्टेबल वर्ण सेट (अक्षर, अंक, अवधि, अंडरस्कोर और हाइफ़न) से वर्ण होते हैं और घटक की शुरुआत में कोई अवधि नहीं होती है।

यदि 0 पर सेट किया गया है, तो कोई भी फ़ाइल नाम स्वीकार किया जाता है।

डिफ़ॉल्ट 1 है।

-1 1 के बराबर है यदि प्रारूप स्वचालित रूप से जांच की गई थी और 0 अन्यथा।

यह पता चला है कि फ़ाइल के सामने find .एक पुट है ./। देखें कि "" / "को यूनिक्स में कैसे खोजें"? समाधान के लिए यदि आप उपयोग नहीं करना चाहते हैं -safe 0


16

@ उपयोगकर्ता का जवाब पूरी तरह से सही है, मैं आपको केवल कमांड दिखाता हूं ताकि आप कहीं और से 0 -safe न डालें।

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समवर्ती करने के लिए इनपुट फ़ाइल की सूची शामिल है।

असुरक्षित फ़ाइल नाम (डबल उद्धरण फ़ाइलनाम के भाग के रूप में व्यवहार करता है, -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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.