ffmpeg concat: "Güvenli olmayan dosya adı"


92

Bir grup mts dosyasını büyük bir mp4 dosyasına dönüştürmeye çalışıyorum:

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

Burada neyin yanlış gittiğine dair bir fikriniz var mı? "Güvenli olmayan dosya" terimi bu bağlamda ne anlama geliyor?


51
Ekle -safe 0önce -i. Bkz. Ffmpeg.org/ffmpeg-all.html#Options-31
Gyan

Yanıtlar:


91

@Mulvya'nın belirttiği cevap (teşekkür ederim!) İşe yarıyor: " -safe 0Önce ekle -i". Ardından find STREAM -name '*' -printf "file '$PWD/%p'\n"boş yolu ilk giriş olarak döndüren başka bir sorun ortaya çıktı . Bunu için değiştirildi for f in ./*.wav; do echo "file '$PWD/$f'"; done(bkz. Https://trac.ffmpeg.org/wiki/Concatenate ) ve şimdi çalışıyor gibi görünüyor. Yaşasın!


1
Ayrıca findalt komutu olarak değiştirebilirsiniz find STREAM -type f -name '*' -printf "file '$PWD/%p'\n"(ve -safe 0ffmpeg komutuna eklemeyi unutmayın ).
erik

17

Nedenini cevaplamak için, multimedya akışlarını bir giriş dosyasından okuyan ffmpeg'in demuxer'larının çalışmasını görmemiz gerekiyor. Bu durumda, aşağıdaki seçeneklerle "concat" kullanıyoruz: (arşivlenmiş dokümanlar)

Bu demuxer aşağıdaki seçeneği kabul eder:

safe1 olarak ayarlanırsa, güvenli olmayan dosya yollarını reddedin. Bir dosya yolu, bir protokol belirtimi içermiyorsa ve göreceliyse ve tüm bileşenler yalnızca taşınabilir karakter kümesinden karakterler (harfler, rakamlar, nokta, alt çizgi ve kısa çizgi) içeriyorsa ve bir bileşenin başında nokta yoksa güvenli kabul edilir.

0 olarak ayarlanırsa, herhangi bir dosya adı kabul edilir.

Varsayılan 1'dir.

Biçim otomatik olarak araştırılmışsa -1 1'e, aksi takdirde 0'a eşdeğerdir.

Bu çıkıyor find .bir koyar ./dosyasının önünde. Bkz . Unix "bul" da "./" baştan nasıl çıkarılır? kullanmak istemiyorsanız çözümler için -safe 0.


16

@sers yanıtı tamamen doğru, sadece size komutu gösteriyorum, böylece başka hiçbir yere -safe 0 koymazsınız.

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

11

Benim durumumda çift ​​tırnak işareti hataya neden oluyor.

Concat için girdi dosyasının listesini içeren ffmpeg -f concat -i concat.txt -c copy output.m4acommand kullanıyorum concat.txt.

Güvenli olmayan dosya adı (çift tırnak, dosya adının bir parçası olarak değerlendirilir, -safe 0bunu düzeltemez):

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

Güvenli dosya adı (tek tırnak):

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

Güvenli dosya adı (tırnak işaretleri olmadan):

file song1.m4a
file song2.m4a

Yukarıdaki tek tırnak işaretleri ve tırnak işaretleri olmadan yalnızca "harfler, rakamlar, nokta (önek hariç), alt çizgi ve kısa çizgi" içeriyorsa güvenlidir . Dolayısıyla aşağıdaki ortak dosya adı çalışmayacaktır:

  • Uzay
  • glif
  • / (yol)
  • önek dönemi (gizli dosya)

Hala -safe 0bu davalara ihtiyacın var.

[Alıntı yapma ve kaçma hakkında uyarı]

'Dosya adı kısmında daima kaçmanız gerekir . bunun nedeni,ile aynı olanfile Im' .avikapanış teklifinin otomatik olarak eklenmesidir. Son tek alıntıda eklenmiş kapanış teklifleri olur, böylecehata olmaz. Bu fenomeni anladım, çünkü artıktek tırnakla ön ekten sonra, kapanış tırnağı eklemeye gerek kalmadankaçmak gerekmiyor.Im' .avi'file Im' .avi'file Im' .avi''''''file Im' .avi'''''''No such file or directory\

Yukarıdaki rağmen (kaçmak zorundadır 'tarafından \ve birlikte kaçamaz ",) tarzı kaçış kabuk benzer . Dosya adı tek tırnak işareti içeriyorsa, I\'m\ .m4a(tek tırnaklarla çevrelenmemiş) stiliyle veya 'I'\''m .m4a'OR 'I'\''m'\ '.m4a'(tek tırnaklarla çevrili ) stiliyle kaçabilirsiniz , ancak ne veya 'I\'m\ .m4a'ne de 'I'm .m4a'.

Ffmpeg'i test ettiğinizde, ilk satırdaki hata mesajının Impossible to openyanıltıcı olabileceğini unutmayın (dosya mevcut), No such file or directory(dosya yok) veya Invalid data found when processing input(geçersiz ortam dosyası) olan ikinci satırı kontrol etmeniz gerekir .


1
her dosya adının önüne dosya eklemek , bir metin dosyasındaki dosyaları kullanırken sorunumu çözdü.
hdoghmen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.