Agora a criação do menu propriamente dito, que deve ser um arquivo de vídeo (com som). Para isso precisamos converter nossas imagens em vídeos. É aí que entra o
mjpegtools.
Para quem não sabe, o mjpegtools é uma suíte de aplicativos para as mais diversas tarefas relacionadas a vídeo. Eu sinceramente apenas o uso para gerar meus menus. Quem puder escrever sobre ele será muito bem vindo. :)
O nosso menu não terá som, mas mesmo assim é necessário um arquivo de som mesmo que seja mudo. Para isso usaremos o "
dd" junto com o
toolame. O seguinte comando nos dá o resultado:
dd if=/dev/zero bs=4 count=1920 | toolame -b 128 -s 48 /dev/stdin silent.mp2
Penso que não há necessidade de uma explicação passo a passo sobre o comando, já que o que obtemos é um arquivo de 128kbps com 48KHz em formato mp2 totalmente mudo.
A seguir, precisamos criar um arquivo xml que será usado com o
spumux, um programa que faz parte do mjpegtools. Para isso abra seu editor de texto preferido (kwrite, gedit, vim, joe, mcedit, nano...) e insira o seguinte conteúdo:
<subpictures>
<stream>
<spu start="00:00:00.00" image="normal.png" highlight="sobre.png" select="clicado.png" force="yes" autooutline="infer" outlinewidth="20" autoorder="rows">
</spu>
</stream>
</subpictures>
Salve este arquivo como "menu.xml" por exemplo. Ele é responsável por criar o menu propriamente dito, com os botões que criamos nos lugares certos. Em image, highlight e select, respectivamente, colocamos o nome dos arquivos dos botões que criamos para quando o botão não está selecionado, para quando o botão está selecionado, e para quando ele é clicado.
A opção force="yes" diz ao spumux que os botões devem ser exibidos independentemente das opções do tocador. Esta opção é REQUERIDA para menus.
A opção start="00:00:00.00" inicia a exibição do menu no início do filme.
A opção autooutline="infer" é importante pois diz ao spumux para colocar os botões onde eles "devem" estar. Para isso ele se baseia nos arquivos png que criamos. Sem essa opção teríamos que criar tags <button> indicando cada botão, o que daria muito mais trabalho.
outlinewidth="20" --> Esta opção diz que deve haver pelo menos 20 pixels entre as imagens (png) para que sejam tratadas como botões diferentes. Esta opção deve sempre ser observada, pois ela serve para que o spumux identifique os diferentes botões do menu. Se o espaço entre um botão e outro do seu menu for menor que 20 pixels, diminua o tamanho. DICA: No Gimp existe uma régua bastante útil para medir estas distâncias.
A opção autoorder="rows" diz que os botões serão numerados pela tela em fila do primeiro até o último.
Bom, terminado o arquivo, vamos mesclar o background, os botões e o som e gerar o menu. Esse comando na verdade é um conjunto de vários comandos onde a saída de um cai direto no outro e no final temos nosso menu:
jpegtopnm imagem-de-fundo.jpg | ppmtoy4m -n 1 -F30000:1001 -I t -A 10:11 -L -S 420mpeg2 | mpeg2enc -f 8 -n n -o imagem-de-fundo.m2v ; mplex -f 8 -o /dev/stdout imagem-de-fundo.m2v silent.mp2 | spumux -v 2 menu.xml > menu.mpg
Nesse comando monstruoso pegamos nossa imagem e nosso som (que no nosso caso é aquele arquivo mudo que criamos no começo) e "grudamos" um no outro com o mplex, depois com o spumux e aquele arquivo xml que criamos "colamos" os botões do menu gerando um arquivo chamado menu.mpg.
Esse comando é para um menu em formato NTSC. Se quiser um menu em PAL, apenas substitua o "-F30000:1001" por "-F25:1" e o "-A 10:11" por "-A 59:54".