我\xe2\x80\x99m编写了一个名为video2png的简单bash脚本,使用ffmpeg
将视频的某些帧转换为png:
#!/bin/bash\nffmpeg -ss 30:00 -i "$1" -frames 1 -s 1280x880 -f image2 "$2"\n
Run Code Online (Sandbox Code Playgroud)\n我将视频路径和所需的输出路径作为第一个和第二个参数传递给脚本。正如您在脚本中看到的,我通过"$1"
和获得了这两条路径"$2"
。\n我在 Mac 上的终端中运行该脚本,如下所示:
Path1="/Users/jintai/Downloads/demon/a b/demon.mp4"\nPath2="/Users/jintai/Downloads/demon/a b/demon.png"\nbash video2png "$Path1" "$Path2" \n
Run Code Online (Sandbox Code Playgroud)\n-frames
但是,脚本中的标志参数似乎ffmpeg
被误解为视频路径下的文件,因为我收到以下错误消息:
Trailing option(s) found in the command: may be ignored.\n-frames: No such file or directory\n
Run Code Online (Sandbox Code Playgroud)\n我该如何解决这个问题?感谢您的时间和建议!
\n编辑:根据@muru的建议,我用-x
after运行我的脚本bash
。但问题仍然在这里。这是我的运行和所有输出:
(base) jintai@192 missing % bash -x video2png "$Path1" "$Path2" \n+ ffmpeg -ss 30:00 -i -frames 1 -s 1280x880 -f image2\nffmpeg version 4.4.2 Copyright (c) 2000-2021 the FFmpeg developers\n built with Apple clang version 13.0.0 (clang-1300.0.29.30)\n 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\n libavutil 56. 70.100 / 56. 70.100\n libavcodec 58.134.100 / 58.134.100\n libavformat 58. 76.100 / 58. 76.100\n libavdevice 58. 13.100 / 58. 13.100\n libavfilter 7.110.100 / 7.110.100\n libavresample 4. 0. 0 / 4. 0. 0\n libswscale 5. 9.100 / 5. 9.100\n libswresample 3. 9.100 / 3. 9.100\n libpostproc 55. 9.100 / 55. 9.100\nTrailing option(s) found in the command: may be ignored.\n-frames: No such file or directory\n\n
Run Code Online (Sandbox Code Playgroud)\n编辑:\n根据@Gilles的建议\'SO-停止邪恶\xe2\x80\x99,我在这里发布了我的脚本。实际上我\xe2\x80\x99m是Bash的新学习者,我使用它echo
来写入脚本。第一篇文章中的第一个代码块是我用来echo
写入脚本的内容。这是脚本:\n video2png。谢谢大家的建议!我期待更多的讨论。
#!/bin/bash
ffmpeg -ss 30:00 -i "$1" -frames 1 -s 1280x880 -f image2 "$2"
Run Code Online (Sandbox Code Playgroud)
问题中发布的脚本和上面复制的脚本看起来完全一样。如果使用两个参数调用脚本,第一个参数将扩展为"$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 '
Run Code Online (Sandbox Code Playgroud)
第一个应该将显式显示''
为 的参数ls
,并且行为应该完全不同。
现在,由于某种原因,您在共享中的文件如下:
#/bin/bash -c
ffmpeg -ss 30:00 -i -frames 1 -s 1280x880 -f image2
Run Code Online (Sandbox Code Playgroud)
这行不通。其一,hashbang 行缺少!
(爆炸)。然后,该-c
选项用于直接从命令行传递 shell 命令,例如bash -c "echo foo"
。它在 hashbang 行中不起作用。(话又说回来,您通过 Bash 显式调用了该脚本,而bash video2png
不是仅使用./video2png
,因此 hashbang 不会出现在其中。)
$1
此外,该脚本完全缺少对命令行参数的引用$2
。
另请参见例如: