Pular para o conteúdo

Variáveis de perfil FFmpeg: um comando, vários streams

No Senta há vários tipos de variáveis que você pode usar nos perfis:

  • Variáveis padrão: ${i} - stream de entrada, ${o} - stream de saída
  • Variáveis personalizadas (texto, booleanas e de seleção)

Após a palavra-chave WHERE no perfil, inicia-se um array JSON com a especificação das variáveis.

Para cada variável é criado um objeto com os seguintes campos:

  • desc - descrição da variável, que usamos no comando
  • name - nome que será usado no formulário de adição de stream
  • description - descrição da variável, que será usada no formulário de adição de stream (opcional)
  • command - parte do comando, em que $value será substituído pelo valor do formulário de adição de stream (exemplo -gpu $value).
  • default - valor padrão; pode ficar vazio.

Por exemplo:

Terminal window
// Simple startup profile for HD h264 encoding
// You can change it, fork it and share it with others
ffmpeg -y -hide_banner -i ${i} -map 0:0 -map 0:1 -c:v h264_nvenc ${gpu} -preset fast -profile:v main -filter:v yadif -forced-idr 1 -b:v 4M -c:a aac -b:a 128k -r 25 -g 8 -keyint_min 13 -f mpegts ${o}
NAME "HD h264"
WHERE
[
{
"desc": "gpu",
"data": {
"name": "GPU",
"description": "Select GPU which stream will use, set empty if you don't use GPU",
"command": "-gpu $value",
"default": ""
}
}
]

Neste exemplo:

Variáveis padrão:

Variáveis padrão (não é preciso descrevê-las): ${i} - stream de entrada, você pode usar mais de 1 entrada; no menu de adição de stream elas serão numeradas a partir de 0 (input #0, input #1 …) ${o} - stream de saída, você pode usar mais de 1 saída; no menu de adição de stream elas serão numeradas a partir de 0

Variáveis personalizadas:

(neste exemplo, você pode adicionar o que precisar): ${gpu} - número do adaptador de GPU

Nota: neste exemplo o valor padrão é vazio (no comando NÃO se adiciona -gpu), mas você pode definir um valor padrão

Ao montar a linha de comando, as variáveis de texto substituem a variável por um texto personalizado.

Exemplo de variável de texto:

{
"desc": "logo",
"data": {
"name": "Logo path",
"description": "Print the path to the image file with the logo",
"command": "-i $value",
"default": ""
}
}

No perfil, a variável ${logo} será substituída por -i $value.

No editor de streams, é adicionado um campo com o rótulo Logo path, com a descrição Print the path to the image file with the logo, e o valor dele substituirá $value.

No final, temos o perfil:

Terminal window
ffmpeg -i ${i} ${logo} bla-bla ${o}
NAME "TEST"
WHERE
[
{
"desc": "logo",
"data": {
"name": "Logo path",
"description": "Print the path to the image file with the logo",
"command": "-i $value",
"default": ""
}
}
]

Nas configurações do stream, vamos especificar:

input#0: 'inp.ts'
output#0: 'udp://out:1234'
logo: 'logo.ts'

Como resultado, o comando de execução será:

Terminal window
ffmpeg -i inp.ts -i logo.ts bla-bla udp://out:1234

As variáveis booleanas inserem texto ao montar o comando de execução se o valor for true e não o inserem se o valor for false.

Para definir esse tipo, é necessário adicionar "extension": {"type": "checkbox",} na estrutura da variável

Exemplo:

// Example of boolean variable
// This variable is used to set -y option, whitch need to rewrite output file
"desc": "rev",
"data": {
"name": "Rewrite file",
"description": "This option need if as output you use local file",
"command": "-y",
"default": "",
"extension": {
"type": "checkbox",
}
}

Esta variável adiciona a flag -y se a caixa de seleção estiver marcada.

Semelhantes às variáveis de texto, mas o usuário pode escolher entre valores predefinidos. É conveniente usá-las, por exemplo, para definir a resolução da imagem ou o codec

É necessário adicionar "extension": {"type": "select"} na estrutura da variável e adicionar as opções predefinidas em "options": [...]

Exemplo.

// Example of selector variable
// This variable is used to select the video codec
"desc": "cv",
"data": {
"name": "Video codec",
"description": "To copy original codec set copy",
"command": "-c:v $value",
"default": "",
"extension": {
"type": "select",
"options": [
"h264_nvenc",
"libx264",
"libx265",
"hevc_nvenc",
"libaom-av1",
"libvpx",
"libvpx-vp9",
"copy"
]
}
}

Esta funcionalidade está sendo desenvolvida para integração com outros sistemas, como o Astra Cesbo. Mas você pode usá-la manualmente. No momento, foi implementada a geração automática de entradas.

Por exemplo, um sistema externo pode enviar ao Senta streams com endereços udp://192.168.0.1:9000 - udp://192.168.0.1:9999 para transcodificação posterior. No entanto, para criar um processo, precisamos saber qual porta está disponível (pois a porta pode já estar ocupada por outro stream). Para que o Senta aloque uma porta, precisamos:

Ir em Settings, onde há uma seção chamada Auto input generation settings. Lá definimos a porta inicial: 9000, a porta final: 9999 e o IP da interface (Interface IP): 192.168.0.1. Depois, aplicamos as configurações.

Exemplo de entrada

Ao criar um processo, atribuímos o endereço de entrada como udp://${host}:${port} ( ou atribuímos o endereço ao criar o stream, pressionando o botão Set auto generation). Assim, é criado um processo com a entrada udp://192.168.0.1:9000, supondo que a porta 9000 esteja livre no servidor.

O Senta monitora as portas livres/ocupadas. Quando um stream é removido, a porta que ele ocupava é liberada.