ffmpeg 可以从文本文件读取输入吗?

RuM*_*N S 5 ffmpeg

是否可以将文本文件作为 stdinput 传递到其中,ffmpeg以便从中读取文本文件中存在的所有参数?

像这样的东西:

ffmpeg < foo.txt
Run Code Online (Sandbox Code Playgroud)

其中foo.txt包含

-i < file.mkv -c:v libx265 -preset medium "Encoded_file.mkv"
Run Code Online (Sandbox Code Playgroud)

原因:隐藏程序中的文件/参数,例如htop

fou*_*rio 2

可以使用预设文件为 ffmpeg 提供一些选项,请查看此处的文档。这样,只有预设文件的名称应该在 htop 中可见。有关预设文件的一些提示可以在此答案中找到。根据我从文档中收集的信息,您将无法隐藏编解码器参数,只能隐藏该编解码器的选项。更多实践示例可以在这里找到。

从您的示例来看,您没有提供任何可以写入预设文件的选项。


输入文件可以通过标准输入传递,方法是指定特殊文件-并将文件内容通过管道传递给 ffmpeg,如下所示:

cat kooky_720p.mp4 | ffmpeg -i - -c:v libx265 -preset medium out.mkv
Run Code Online (Sandbox Code Playgroud)

该命令的 htop 显示如下所示: htop extract 1


同样,可以将输出文件更改为特殊文件,-该文件会将转换后的文件重定向到标准输出。为此,您必须手动指定容器格式,因为 ffmpeg 将无法从文件名猜测它。

然后您可以将转换后的数据通过管道传输到目标文件。这可能看起来像这样:

cat kooky_720p.mp4 | ffmpeg -i - -c:v libx265 -preset medium -f matroska - > out.mkv
Run Code Online (Sandbox Code Playgroud)

该命令的 htop 显示如下所示:htop extract 2

我不知道在什么情况下 htop 会显示正在输入的文件,但我猜这是在 shell 内部处理的,所以它很可能也不会显示在zsh.


为了也从 htop 中隐藏,cat input.ext您可以使用像这样的小 python 脚本从文本文件中读取文件名并将内容复制到 stdout:

cat kooky_720p.mp4 | ffmpeg -i - -c:v libx265 -preset medium out.mkv
Run Code Online (Sandbox Code Playgroud)

用法可能是这样的,而在我们的示例中,filename.txt 是一个简单的文本文件,其中包含一行文本,其中包含要读取的视频文件kooky_720p.mp4

./pipe.py filename.txt  | ffmpeg -i - -c:v libx265 -preset medium -f matroska - > out.mkv
Run Code Online (Sandbox Code Playgroud)

该命令的 htop 显示如下所示:htop extract 3


我相信这是您最接近从 htop 隐藏信息的方法。但请记住,仍然可以通过查看打开的文件句柄来获取正在处理的文件的信息,例如使用lsof

$ pidof python3
... 19013 ...

$ lsof -a -p 19013   
COMMAND   PID   USER   FD   TYPE DEVICE   SIZE/OFF     NODE NAME
python3 19013 oliver  cwd    DIR   8,84       4096 31197648 /home/oliver/Videos/Kooky
python3 19013 oliver  rtd    DIR   8,66       4096        2 /
python3 19013 oliver  txt    REG   8,66       9992  7781733 /usr/bin/python3.6
python3 19013 oliver  mem    REG   8,66      11752  8020773 /usr/lib/python3.6/lib-dynload/grp.cpython-36m-x86_64-linux-gnu.so
python3 19013 oliver  mem    REG   8,66     154344  7743563 /usr/lib/liblzma.so.5.2.3
python3 19013 oliver  mem    REG   8,66      36856  8012780 /usr/lib/python3.6/lib-dynload/_lzma.cpython-36m-x86_64-linux-gnu.so
python3 19013 oliver  mem    REG   8,66      66960  7739636 /usr/lib/libbz2.so.1.0.6
python3 19013 oliver  mem    REG   8,66      21400  8012783 /usr/lib/python3.6/lib-dynload/_bz2.cpython-36m-x86_64-linux-gnu.so
python3 19013 oliver  mem    REG   8,66      92056  7736853 /usr/lib/libz.so.1.2.11
python3 19013 oliver  mem    REG   8,66      36744  8012786 /usr/lib/python3.6/lib-dynload/zlib.cpython-36m-x86_64-linux-gnu.so
python3 19013 oliver  mem    REG   8,66      21384  8020788 /usr/lib/python3.6/lib-dynload/_heapq.cpython-36m-x86_64-linux-gnu.so
python3 19013 oliver  mem    REG   8,66    3268160  7787080 /usr/lib/locale/locale-archive
python3 19013 oliver  mem    REG   8,66    1358168  7735428 /usr/lib/libm-2.26.so
python3 19013 oliver  mem    REG   8,66      10048  7735415 /usr/lib/libutil-2.26.so
python3 19013 oliver  mem    REG   8,66      14144  7735429 /usr/lib/libdl-2.26.so
python3 19013 oliver  mem    REG   8,66    3327592  7785916 /usr/lib/libpython3.6m.so.1.0
python3 19013 oliver  mem    REG   8,66    2065840  7735493 /usr/lib/libc-2.26.so
python3 19013 oliver  mem    REG   8,66     145336  7735516 /usr/lib/libpthread-2.26.so
python3 19013 oliver  mem    REG   8,66     176880  7735494 /usr/lib/ld-2.26.so
python3 19013 oliver    0u   CHR  136,1        0t0        4 /dev/pts/1
python3 19013 oliver    1w  FIFO   0,11        0t0  1276096 pipe
python3 19013 oliver    2u   CHR  136,1        0t0        4 /dev/pts/1
python3 19013 oliver    3r   REG   8,84 4363354747 31198177 /home/oliver/Videos/Kooky/kooky_720p.mp4
Run Code Online (Sandbox Code Playgroud)

如您所见,它列出了我在此处用作示例的视频文件。输出文件将显示在 ffmpeg 进程的句柄中。