O ffmpeg pode ler a entrada de um arquivo de texto?

2

É possível passar um arquivo de texto como stdinput para ffmpeg , a partir do qual ele pode ler todos os parâmetros presentes no arquivo de texto?

Algo parecido com isto:

ffmpeg < foo.txt

Onde foo.txt contém

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

Razão: ocultar os arquivos / parâmetros de programas como htop

    
por RuMAN S 01.11.2017 / 11:12

2 respostas

2

Algumas opções podem ser dadas ao ffmpeg usando arquivos predefinidos, verifique a documentação aqui . Dessa forma, somente o nome do arquivo predefinido deve estar visível no htop. Algumas dicas sobre arquivos predefinidos podem ser encontradas em esta resposta . Pelo que eu reuni da documentação, você não poderá ocultar o parâmetro codec, apenas as opções dadas a esse codec. Mais exemplos práticos podem ser encontrados aqui .

A julgar pelo seu exemplo, você não dá nenhuma dessas opções que poderiam ser gravadas em um arquivo predefinido.

O arquivo de entrada pode ser passado via entrada padrão especificando o arquivo especial - e canalizando o conteúdo do arquivo para ffmpeg da seguinte forma:

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

A exibição htop deste comando é assim: htop extrato 1

O arquivo de saída pode, da mesma forma, ser alterado para o arquivo especial - , que redirecionará o arquivo convertido para a saída padrão. Para fazer isso, você precisa especificar o formato do contêiner manualmente, pois o ffmpeg não poderá adivinhá-lo a partir do nome do arquivo.

Em seguida, você pode enviar os dados convertidos para o arquivo de destino. Isso pode parecer assim:

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

A exibição htop deste comando é assim: htop extrato 2

Eu não sei em quais circunstâncias o htop exibiria o arquivo sendo canalizado, mas eu acho que isso é tratado dentro do shell, então é provável que ele também não apareça em shells que não sejam zsh .

Para ocultar também o cat input.ext do htop que você pode usar, por exemplo, um pequeno script python como este para ler o nome do arquivo de um arquivo de texto e copiar o conteúdo para o 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)

O uso pode ser assim, enquanto filename.txt é um arquivo de texto simples contendo uma linha de texto que possui o arquivo de vídeo a ser lido, kooky_720p.mp4 em nosso exemplo.

./pipe.py filename.txt  | ffmpeg -i - -c:v libx265 -preset medium -f matroska - > out.mkv

A exibição htop deste comando é assim: htop extrato 3

Acredito que este é o mais próximo que você poderá ocultar informações do htop. No entanto, lembre-se de que ainda é possível obter as informações sobre quais arquivos você está processando observando as manipulações de arquivos abertos, por exemplo, usando 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

Como você pode ver, ele lista o arquivo de vídeo que usei como exemplo aqui. O arquivo de saída aparecerá nas alças do processo ffmpeg.

    
por 01.11.2017 / 14:24
-1

Basta catar os parâmetros:

$ ffmpeg $(cat foo.txt)
    
por 01.11.2017 / 11:13

Tags