是否可以将文本文件作为 stdinput 传递,以便ffmpeg
从中读取文本文件中的所有参数?
像这样:
ffmpeg < foo.txt
其中foo.txt
包含
-i < file.mkv -c:v libx265 -preset medium "Encoded_file.mkv"
原因:隐藏以下程序中的文件/参数htop
答案1
可以使用预设文件为 ffmpeg 提供一些选项,点击此处查看文档。这样,只有预设文件的名称才会在 htop 中可见。有关预设文件的一些提示可以在这个答案。从我从文档中收集到的信息来看,您将无法隐藏编解码器参数,只能隐藏为该编解码器提供的选项。可以找到更多实际操作示例这里。
从您的示例来看,您没有提供任何可以写入预设文件的选项。
可以通过指定特殊文件-
并将文件内容传送到 ffmpeg,从而通过标准输入传递输入文件,如下所示:
cat kooky_720p.mp4 | ffmpeg -i - -c:v libx265 -preset medium out.mkv
该命令的 htop 显示如下: htop 提取 1
类似地,输出文件可以更改为特殊文件-
,该文件会将转换后的文件重定向到标准输出。为此,您必须手动指定容器格式,因为 ffmpeg 无法从文件名中猜出它。
然后,您可以将转换后的数据通过管道传输到目标文件。如下所示:
cat kooky_720p.mp4 | ffmpeg -i - -c:v libx265 -preset medium -f matroska - > out.mkv
该命令的 htop 显示如下:htop 提取 2
我不知道在什么情况下 htop 会显示被管道传输的文件,但我猜这是在 shell 内部处理的,因此它很可能也不会出现在除 之外的 shell 中zsh
。
为了隐藏cat input.ext
htop,您可以使用例如这样的小型 Python 脚本从文本文件中读取文件名并将内容复制到 stdout:
#!/usr/bin/env python
from __future__ import print_function
import shutil
import sys
# Print errors to stderr, since we will pipe to stdout
# For an explanation, see https://stackoverflow.com/questions/5574702/how-to-print-to-stderr-in-python
def eprint(*args, **kwargs):
print(*args, file=sys.stderr, **kwargs)
# Check if there is a filename given
if len(sys.argv) < 2:
eprint("Please specify an input file")
sys.exit(1)
# Open the file and read the first line
try:
fl = open(sys.argv[1], "r")
filename = fl.readline().strip()
fl.close()
except Exception as e:
eprint("Could not read filename from " + sys.argv[1])
eprint(e)
sys.exit(1)
# Pipe the content from the file to standard output
try:
with open(filename, "rb") as ffmpegInput:
if sys.version_info >= (3, 0):
# Python 3
shutil.copyfileobj(ffmpegInput, sys.stdout.buffer)
else:
# Python 2
shutil.copyfileobj(ffmpegInput, sys.stdout)
except Exception as e:
eprint("Could not pipe input file " + filename)
eprint(e)
sys.exit(1)
用法可能是这样的,而在我们的示例中,filename.txt 是一个简单的文本文件,包含一行包含要读取的视频文件的文本kooky_720p.mp4
。
./pipe.py filename.txt | ffmpeg -i - -c:v libx265 -preset medium -f matroska - > out.mkv
该命令的 htop 显示如下:htop 提取 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
如您所见,它列出了我用作示例的视频文件。输出文件将显示在 ffmpeg 进程的句柄中。
答案2
简单地 cat 参数:
$ ffmpeg $(cat foo.txt)