나는'이라는 프로그램을 작성 중입니다.비디오 2png, ffmpeg
비디오의 일부 프레임을 png로 변환하는 데 사용합니다.
#!/bin/bash
ffmpeg -ss 30:00 -i "$1" -frames 1 -s 1280x880 -f image2 "$2"
비디오 경로와 원하는 출력 경로를 첫 번째 및 두 번째 매개변수로 스크립트에 전달합니다. 스크립트에서 볼 수 있듯이 "$1"
및 를 통해 이 두 경로를 얻습니다 "$2"
. Mac의 터미널에서 다음과 같이 스크립트를 실행하고 있습니다.
Path1="/Users/jintai/Downloads/demon/a b/demon.mp4"
Path2="/Users/jintai/Downloads/demon/a b/demon.png"
bash video2png "$Path1" "$Path2"
-frames
그러나 다음과 같은 오류 메시지가 표시되므로 스크립트의 플래그 매개변수가 ffmpeg
비디오 경로 아래의 파일로 잘못 해석된 것 같습니다.
Trailing option(s) found in the command: may be ignored.
-frames: No such file or directory
이 문제를 어떻게 해결할 수 있나요? 시간을 내어 조언해 주셔서 감사합니다!
편집: @muru의 제안에 따라 -x
after 를 사용하여 스크립트를 실행합니다 bash
. 하지만 문제는 여기에 남아있습니다. 내 실행과 모든 결과는 다음과 같습니다.
(base) jintai@192 missing % bash -x video2png "$Path1" "$Path2"
+ ffmpeg -ss 30:00 -i -frames 1 -s 1280x880 -f image2
ffmpeg version 4.4.2 Copyright (c) 2000-2021 the FFmpeg developers
built with Apple clang version 13.0.0 (clang-1300.0.29.30)
configuration: --prefix=/opt/local --enable-swscale --enable-avfilter --enable-avresample --enable-libmp3lame --enable-libvorbis --enable-libopus --enable-librsvg --enable-libtheora --enable-libopenjpeg --enable-libmodplug --enable-libvpx --enable-libsoxr --enable-libspeex --enable-libass --enable-libbluray --enable-libzimg --enable-libzvbi --enable-lzma --enable-gnutls --enable-fontconfig --enable-libfreetype --enable-libfribidi --enable-zlib --disable-libjack --disable-libopencore-amrnb --disable-libopencore-amrwb --disable-libxcb --disable-libxcb-shm --disable-libxcb-xfixes --disable-indev=jack --enable-opencl --disable-outdev=xv --enable-audiotoolbox --enable-videotoolbox --enable-sdl2 --disable-securetransport --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/clang --enable-libdav1d --enable-libaom --enable-librav1e --enable-libsvtav1 --arch=x86_64 --enable-x86asm --enable-gpl --enable-postproc --enable-libx264 --enable-libx265 --enable-libxvid --enable-libvidstab
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100
Trailing option(s) found in the command: may be ignored.
-frames: No such file or directory
편집: @Gilles 'SO - Stop the Evil' 제안에 따라 여기에 스크립트를 게시하고 있습니다. 저는 실제로 Bash를 처음 배우는 사람이고 이를 echo
스크립팅에 사용합니다. 첫 번째 게시물의 첫 번째 코드 블록은 echo
제가 스크립트를 작성하는 데 사용한 것입니다. 스크립트는 다음과 같습니다.
비디오 2png. 제안해 주신 모든 분들께 감사드립니다! 더 많은 논의를 기대합니다.
답변1
#!/bin/bash
ffmpeg -ss 30:00 -i "$1" -frames 1 -s 1280x880 -f image2 "$2"
질문에 게시된 스크립트는 위에 복사한 스크립트와 정확히 동일해 보입니다. 두 개의 인수를 사용하여 스크립트를 호출하면 첫 번째 인수는 "$1"
(따옴표로 인해) 문자열 로 확장되고 마찬가지로 두 번째 인수도 로 확장됩니다 "$2"
.
스크립트를 실행하면 video2png "$Path1" "$Path2"
완전히 올바른 것처럼 보입니다. 따옴표는 공백에 관계없이 파일 이름을 그대로 유지합니다.
반대로, 스크립트에 ffmpeg -ss 30:00 -i $1 -frames 1 ...
빈 인수가 있거나 인수가 전혀 없는 경우 호출하면 다음과 같습니다.인용되지 않음확장 프로그램은 $1
실행과 마찬가지로 완전히 사라집니다 ffmpeg -ss 30:00 -i -frames 1 ...
.
다음 두 가지의 추적 출력과 동작을 비교하십시오.
empty= bash -x -c 'ls "$empty"'
empty= bash -x -c 'ls $empty '
''
첫 번째 항목은 매개변수로 명시적으로 표시되어야 하며 ls
동작은 완전히 달라야 합니다.
이제 어떤 이유로 공유에 있는 파일은 다음과 같습니다.
#/bin/bash -c
ffmpeg -ss 30:00 -i -frames 1 -s 1280x880 -f image2
이것은 작동하지 않습니다. 우선, hashbang 라인이 누락되었습니다 !
(폭발됨). 그런 다음 이 옵션은 -c
명령줄에서 직접 셸 명령(예: )을 전달하는 데 사용됩니다 bash -c "echo foo"
. 해시뱅 라인에서는 작동하지 않습니다. (그런 다음 bash video2png
를 사용하는 것이 아니라 Bash를 통해 명시적으로 스크립트를 호출하므로 ./video2png
해시뱅이 표시되지 않습니다.)
$1
또한 스크립트에는 명령줄 인수에 대한 참조가 전혀 없습니다 $2
.
예를 들면 다음을 참조하세요.