DLNA com legendas via Mediatomb (Linux) em Smart TVs

O problema

Recentemente comprei uma Smart TV LG. Para ser mais cômodo, instalei o Mediatomb no meu Linux para poder acessar meus vídeos via compartilhamento DLNA, porém não consegui visualizar as legendas deles. Imagino que o problema está tanto no protocolo (que fuçando rapidamente não parece especificar nada a respeito), quanto na implementação de servidor e de cliente. Vi que conseguiram modificar o Mediatomb para prover legendas para TV Samsung, que implementa extensões proprietárias ao protocolo original, mas não achei nada sobre TVs LG. A única solução que vi por aí é usar transcoding e recodificar o video com legenda em tempo real. Sério? Isso não me parece uma boa solução, porque vai consumir o processamento da máquina e também porque vai diminuir a qualidade do vídeo. Fora essa proposta, não achei nenhuma outra.

A ideia

Já que a legenda precisa estar dentro do vídeo, então a minha melhor opção seria achar uma forma de colocá-la nele sem precisar recodificar. Já tinha lido um pouco sobre o formato MKV – quem costuma baixar vídeos já se deparou com esse tipo de arquivo – que não é um formato de vídeo e sim um container de vídeo. Aí é que está o pulo do gato: ele pode conter vídeo, áudio e legendas! Com isso, já temos o formato de saída do nosso arquivo com legendas. Mãos à obra.

A execução

Mais pesquisas na Internet me mostraram que existe um aplicativo chamado mkvmerge (disponível nos Debian no pacote mkvtoolnix), cuja função é criar os arquivos MKV que precisamos, juntando fontes de áudio, vídeo e legendas. Só que ele é tem muitas opções! Por sorte existe um outro aplicativo gráfico chamado mkvmerge-gui onde você fala o que quer dentro do arquivo e ele, além de gerar, também te mostra as opções da linha de comando! Com isso, dei uma limpada no que era desnecessário, e criei um script simples onde você passa o nome do arquivo de vídeo e o diretório de destino do arquivo gerado e ele monta um arquivo MKV com o vídeo legendado (desde que a legenda tenha o mesmo nome do arquivo de vídeo). O script ficou assim:

#!/bin/bash
# Build MKV file with subtitles inside
# Author: Kenzo Okamura
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License at <http://www.gnu.org/licenses/> for
# more details.
ME=$(readlink -f "$0")
SCRIPT_NAME=$(basename "$ME")
MKVMERGE=$(which mkvmerge)
if [ $# -ne 2 ];
then
echo "Builds an MKV with a subtitle file inside."
echo "Subtitle file needs to have the same base name as video file."
echo "(e.g. video.mp4 and video.srt)"
echo ""
echo "Usage:"
echo " $SCRIPT_NAME <video file> <output directory>"
exit 1
fi
input="$1"
output_dir="$2"
if [ ! -e "$input" ];
then
echo "Video file $input not found"
exit 2
fi
if [ ! -d "$output_dir" ];
then
echo "Output directory $output_dir not found or is not a directory"
exit 3
fi
base_name="$(echo $input | sed 's/\....$//')"
extensions="srt sub"
for ext in $extensions ; do
srt=$base_name.$ext;
if [[ -e $srt ]]; then break; fi
done
if [ ! -e "$srt" ];
then
echo "Subtitle for video not found"
exit 4
fi
if [ ! -x "$MKVMERGE" ];
then
echo "You need mkvmerge to continue!"
echo "(for Debian users: apt-get install mkvtoolnix)"
fi
echo "Base name: $base_name"
echo "Input: $input"
echo "Subtitles: $srt"
echo "Output Dir: $output_dir"
"$MKVMERGE" -o "$output_dir/$base_name.mkv" \
--no-global-tags \
--no-chapters "(" "$input" ")" \
--forced-track 0:no \
--no-global-tags \
--no-chapters "(" "$srt" ")"

Ainda não está exatamente perfeito, mas já funciona bem para o que precisamos (qualquer coisa, proponha alterações no github!)

Usando

Com isso, é só pegar um vídeo com a legenda com o mesmo nome do vídeo e gerar um MKV em algum diretório que você tenha configurado para o mediatomb carregar. Por exemplo:

# Neste exemplo você precisa ter um arquivo de video chamado video.mp4
# e uma legenda video.srt, e um diretório /mnt/mediatomb
build-mkv-with-subtitles video.mp4 /mnt/mediatomb

E olha só, é bem rápido! Era disso que eu precisava!

Extra

Configurando o  Mediatomb para mostrar um frame do vídeo como capa

Se quiser que a sua TV mostre um frame como capa do vídeo, é só habilitar uma configuração do mediatomb em /etc/mediatomb/config.xml, na seção extended-runtime-options:

<ffmpegthumbnailer enabled="yes">
<thumbnail-size>128</thumbnail-size>
<seek-percentage>5</seek-percentage>
<filmstrip-overlay>yes</filmstrip-overlay>
<workaround-bugs>no</workaround-bugs>
</ffmpegthumbnailer>
view raw gistfile1.xml hosted with ❤ by GitHub

Adicionar uma marca para indicar vídeo já visto

Essa configuração é legal para saber se você já assistiu um vídeo ou não. Ele vai colocar um asterisco antes do nome do arquivo. A configuração fica na mesma seção extended-runtime-options da dica anterior:

<mark-played-items enabled="yes" suppress-cds-updates="yes">
<string mode="prepend">*</string>
<mark>
<content>video</content>
</mark>
</mark-played-items>
view raw gistfile1.xml hosted with ❤ by GitHub

Recomeçando o vídeo de onde parou

Para ser honesto, não sei bem se foi isso que eu mexi que fez com que os vídeos pudessem ser reiniciados à partir de onde eu parei, mas acho que sim. 🙂 Acho legal ativar essa opção uma vez que não dá para avançar ou voltar o vídeo. A configuração é basicamente habilitar extensões de protocolo:

<protocolInfo extend="yes" />
view raw gistfile1.xml hosted with ❤ by GitHub

Fim!

One thought on “DLNA com legendas via Mediatomb (Linux) em Smart TVs

  1. Muito boa dica, funcionou muito bem. Agora tenho uma dúvida, como faço para corrigir problemas de codificação da legenda com essa solução?? As palavras com acentuação estão aparecendo com caracteres especiais.

Leave a Reply

Este site utiliza o Akismet para reduzir spam. Fica a saber como são processados os dados dos comentários.