ffmpeg concat: "Tên tệp không an toàn"


83

Cố gắng chuyển đổi một loạt các tệp mts thành một tệp mp4 lớn:

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

Bất kỳ ý tưởng những gì xảy ra ở đây? Thuật ngữ "tệp không an toàn" có nghĩa là gì trong ngữ cảnh này?


49
Thêm -safe 0trước -i. Xem ffmpeg.org/ffmpeg-all.html#Options-31
Gyan

Câu trả lời:


85

Câu trả lời được nêu bởi @Mulvya (cảm ơn bạn!) Hoạt động: "Thêm -safe 0trước -i". Sau đó, một vấn đề khác xuất hiện với find STREAM -name '*' -printf "file '$PWD/%p'\n"nó trả về đường dẫn trống như mục nhập đầu tiên. Đã thay đổi điều này cho for f in ./*.wav; do echo "file '$PWD/$f'"; done(xem https://trac.ffmpeg.org/wiki/Concatenate ) và bây giờ nó có vẻ hoạt động. Tiếng hoan hô!


1
Bạn cũng có thể thay đổi findlệnh con thành find STREAM -type f -name '*' -printf "file '$PWD/%p'\n"(và đừng quên thêm lệnh -safe 0vào ffmpeg).
erik

17

Để trả lời lý do tại sao, chúng ta cần xem hoạt động của các demuxer của ffmpeg, chúng đọc các luồng đa phương tiện từ một tệp đầu vào. Trong trường hợp này, chúng tôi đang sử dụng "concat", với các tùy chọn sau: (tài liệu được lưu trữ)

Demuxer này chấp nhận tùy chọn sau:

safeNếu được đặt thành 1, hãy từ chối các đường dẫn tệp không an toàn. Đường dẫn tệp được coi là an toàn nếu nó không chứa đặc tả giao thức và là tương đối và tất cả các thành phần chỉ chứa các ký tự từ bộ ký tự di động (chữ cái, chữ số, dấu chấm, dấu gạch dưới và dấu gạch ngang) và không có dấu chấm ở đầu thành phần.

Nếu được đặt thành 0, bất kỳ tên tệp nào cũng được chấp nhận.

Giá trị mặc định là 1.

-1 tương đương với 1 nếu định dạng được tự động thăm dò và 0 nếu không.

Hóa ra find .đặt ./trước tệp. Xem Cách tách "./" ở đầu "tìm" trong unix? cho các giải pháp nếu bạn không muốn sử dụng -safe 0.


16

@sers câu trả lời là hoàn toàn đúng, tôi chỉ cho bạn thấy lệnh để bạn không đặt -safe 0 ở bất kỳ nơi nào khác.

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

11

Trong trường hợp của tôi, dấu ngoặc kép gây ra lỗi.

Tôi sử dụng ffmpeg -f concat -i concat.txt -c copy output.m4alệnh, lệnh concat.txtchứa danh sách tệp đầu vào để ghép nối.

Tên tệp không an toàn (dấu ngoặc kép coi như một phần của tên tệp, -safe 0không thể sửa lỗi này):

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

Tên tệp an toàn (dấu ngoặc kép):

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

Tên tệp an toàn (không có dấu ngoặc kép):

file song1.m4a
file song2.m4a

Các dấu ngoặc kép ở trên và không có dấu ngoặc kép chỉ an toàn nếu nó chỉ chứa "chữ cái, chữ số, dấu chấm (trừ tiền tố), dấu gạch dưới và dấu gạch ngang" . Vì vậy, tên tệp chung sau sẽ không hoạt động:

  • không gian
  • glyph
  • / (con đường)
  • khoảng thời gian tiền tố (tệp ẩn)

Bạn vẫn cần -safe 0cho những trường hợp đó.

[Cảnh báo về Trích dẫn và thoát]

Bạn luôn cần thoát 'trong phần tên tệp . lý do là vìfile Im' .aviý chí tự động thêm dấu ngoặc kép vàoIm' .avi', tương tự nhưfile Im' .avi'. Dấufile Im' .avi''''''ngoặc képcuối cùng trongcũng sẽ thêm dấu ngoặc kép đóng trở thànhfile Im' .avi''''''', vì vậy nó không cóNo such file or directorylỗi. Tôi tìm ra hiện tượng này vì không gian không còn cần phải thoát ra\sau tiền tố với dấu nháy đơn, mà không cần phải thêm dấu ngoặc kép.

Mặc dù ở trên (phải thoát 'bằng \và không thoát bằng "), phong cách thoát tương tự như shell . Nếu tên tệp chứa các dấu nháy đơn, bạn có thể thoát khỏi nó với kiểu I\'m\ .m4a(KHÔNG được bao quanh bằng dấu nháy đơn) hoặc kiểu 'I'\''m .m4a'HOẶC 'I'\''m'\ '.m4a'(được bao quanh bằng dấu nháy đơn), nhưng không có 'I\'m\ .m4a'hoặc không 'I'm .m4a'.

Khi bạn kiểm tra ffmpeg, hãy lưu ý thông báo lỗiImpossible to open dòng đầu tiên có thể gây hiểu nhầm (tệp tồn tại), bạn cần kiểm tra dòng thứ hai là của No such file or directory(tệp không tồn tại) hoặc Invalid data found when processing input(tệp phương tiện không hợp lệ).


1
thêm tệp vào trước mỗi tên tệp đã giải quyết được sự cố của tôi khi sử dụng tệp từ tệp văn bản.
hdoghmen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.