Можно ли передать текстовый файл как stdinput в ffmpeg из которого он может прочитать все параметры, присутствующие в текстовом файле?

Что-то вроде этого:

ffmpeg < foo.txt

Где foo.txt содержит

-i < file.mkv -c:v libx265 -preset medium "Encoded_file.mkv"

Причина: скрыть файлы / параметры от программ, таких как htop

2 ответа2

2

Некоторые параметры могут быть предоставлены ffmpeg с использованием предустановленных файлов, см. Документацию здесь. Таким образом, в htop должно быть видно только имя файла предустановки. В этом ответе можно найти некоторые подсказки по предварительно настроенным файлам. Исходя из того, что я почерпнул из документации, вы не сможете скрыть параметр кодека, только параметры, заданные для этого кодека. Больше практических примеров можно найти здесь.

Судя по вашему примеру, вы не предоставляете ни одной из этих опций, которые могли бы быть записаны в заданный файл.


Входной файл может быть передан через стандартный ввод, указав специальный файл - и обжигающе содержимое файла FFmpeg следующим образом:

cat kooky_720p.mp4 | ffmpeg -i - -c:v libx265 -preset medium out.mkv

Отображение htop этой команды выглядит следующим образом:htop extract 1


Выходной файл может, так же, будет изменен на специальный файл - который будет перенаправлять преобразованный файл на стандартный вывод. Для этого вы должны указать формат контейнера вручную, так как ffmpeg не сможет угадать его по имени файла.

Затем вы можете передать преобразованные данные в файл назначения. Это может выглядеть так:

cat kooky_720p.mp4 | ffmpeg -i - -c:v libx265 -preset medium -f matroska - > out.mkv

Экран htop этой команды выглядит следующим образом: htop extract 2

Я не знаю, при каких обстоятельствах htop будет отображать файл, по которому идет передача, но я думаю, что это обрабатывается внутри оболочки, так что, вероятно, он также не будет отображаться в оболочках, отличных от 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 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

Как вы можете видеть, здесь перечислены видеофайлы, которые я использовал здесь в качестве примера. Выходной файл будет отображаться в дескрипторах процесса ffmpeg.

-1

Просто следите за параметрами:

$ ffmpeg $(cat foo.txt)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .