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
기안

답변:


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의 demuxer의 작동을 확인해야합니다. 이 경우 다음 옵션과 함께 "concat"을 사용합니다. (보관 된 문서)

이 demuxer는 다음 옵션을 허용합니다.

safe1로 설정하면 안전하지 않은 파일 경로를 거부합니다. 파일 경로는 프로토콜 사양을 포함하지 않고 상대적이고 모든 구성 요소가 이식 가능한 문자 집합 (문자, 숫자, 마침표, 밑줄 및 하이픈)의 문자 만 포함하고 구성 요소 시작 부분에 마침표가없는 경우 안전한 것으로 간주됩니다.

0으로 설정하면 모든 파일 이름이 허용됩니다.

기본값은 1입니다.

-1은 형식이 자동으로 검색된 경우 1이고 그렇지 않은 경우 0입니다.

그것은 밝혀 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연결할 입력 파일 목록이 포함 된 합니다.

안전하지 않은 파일 이름 (큰 따옴표는 파일 이름의 일부로 취급되며이 -safe 0문제를 해결할 수 없음) :

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

안전한 파일 이름 (작은 따옴표) :

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

안전한 파일 이름 (따옴표 제외) :

file song1.m4a
file song2.m4a

위의 작은 따옴표따옴표 없이는 포함 된 경우에만 안전합니다. "문자, 숫자, 마침표 (접두어 제외), 밑줄 및 하이픈". 따라서 다음 공통 파일 이름은 작동하지 않습니다.

  • 우주
  • 글리프
  • / (경로)
  • 접두사 마침표 (숨겨진 파일)

-safe 0그 사건 은 여전히 ​​필요 합니다.

[인용 및 탈출에 대한주의]

항상 'filename 부분에 이스케이프 가 필요합니다 . 이유 때문이다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'OR '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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.