나는 오랫동안 스크립트를 작성해 왔지만 최근 이 문제로 인해 미칠 지경이 되었습니다. 모든 방법을 시도했지만 해결되지 않았습니다.
find . -iname "*.mp4" -type f -exec ffmpeg -i "{}" -c:a "$ACODEC" -c:v "$VCODEC" -vf \
"subtitles={}.$SUBEXTE:'force_style=fontsize=$FSIZE,fontname=$FNAME'" \
"{}.$EXTE" -hide_banner \;
find
mp4 파일이 발견될 때마다 이 명령을 실행하는 것이 아이디어입니다 FFmpeg
. 그러나 마지막 변수의 명령 대체와 같이 더 복잡한 것을 시도하려면 {}.$EXTE
다음 구문을 사용해야 합니다.
find . -iname "*.mp4" -type f -exec sh -c 'ffmpeg -i "$1" -c:a "$2" -c:v "$3"\
-vf "subtitles=$1.$4:'force_style=fontsize=$5,fontname=$6'" \
"$1.$7" -hide_banner' -- "{}" "$ACODEC" "$VCODEC" "$SUBEXTE" "$FSIZE" "$FNAME" "$EXTE" \;
이 구문을 사용할 때 볼 수 있듯이 sh -c
작은따옴표를 추가해야 합니다 ' '
. 그러나 이는 FFmpeg
코드를 깨뜨립니다. 작은 따옴표와 큰 따옴표를 추가하고 제거하고 백슬래시도 시도하는 등 거의 모든 가능한 변형을 시도했습니다. 도와주세요! 내가 겪은 몇 가지 오류:
Unable to open ./sub.srt
[AVFilterGraph @ 0x7fffdb7d35e0] Error initializing filter 'subtitles' with args './sub.srt:force_style=fontsize='
Error reinitializing filters!
Failed to inject frame into filter network: No such file or directory
Error while processing the decoded data for stream #0:0
Conversion failed!
And sometimes I got an error like not suitable format for fontname
답변1
작은따옴표로 묶인 문자열에는 작은따옴표가 포함될 수 없습니다.
귀하의 경우 이 딜레마에 대한 해결책은 '
인라인 스크립트 sh -c
의 모든 내부를 '\''
( 또는 '"'"'
)로 바꾸는 것입니다.
정리의 목적은
- 작은 따옴표로 묶인 문자열(첫 번째
'
로 끝나는'\''
작은 따옴표 문자열)을 일시적으로 중단합니다. - 텍스트를 삽입하려면
'
(\'
in'\''
,"'"
다음과 같이 작성할 수도 있습니다.멀리참고문헌이 너무 많아 읽기가 어렵습니다.) - 이를 나머지 원래 작은 따옴표로 묶은 문자열과 연결합니다( 끝의
'
in은'\''
새 작은 따옴표로 묶인 문자열을 시작합니다).
명령 sh -c
은 다음과 같습니다
sh -c '
ffmpeg -i "$1" -c:a "$2" -c:v "$3" \
-vf "subtitles=$1.$4:'\''force_style=fontsize=$5,fontname=$6'\''" \
"$1.$7" -hide_banner' ...arguments as before ...