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

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

是否可以将文本文件作为 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.exthtop,您可以使用例如这样的小型 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)

相关内容