Como adicionar um arquivo de áudio a um script de shell

2

Como posso adicionar um arquivo de áudio (OGG vorbis) a um script de shell, tornando o script o menor possível e, ao mesmo tempo, podendo executá-lo na maioria dos sistemas possível? Eu quero que o arquivo de áudio seja reproduzido.

Eu não quero que ele seja uuencode d, porque os sharutils não estão instalados em muitos sistemas. O base64 é legal, mas torna o arquivo / script maior, o que eu não quero.

Devo usar o comando mplayer ou play do pacote sox? É mais comum em sistemas Linux / BSD? Ou há outro media player instalado principalmente? Devo converter o arquivo de áudio em outro formato / codec (caso isso não torne o arquivo muito maior) para ter mais jogadores possíveis para reproduzir o arquivo ou o OGG vorb é uma boa escolha?

    
por erik 07.02.2014 / 16:39

2 respostas

0

Com o script a seguir, ele funciona (usando mplayer , que provavelmente não está presente em muitos sistemas).

#!/bin/sh
grep -A 1000 --text -m 1 ^Ogg "$0" | mplayer -
exit
OggS^@^B^@^@^@^@^@^@^@^@^]f<8a>g^@^@^@^@lY߸^A^^^Avorbis^@^@^@^@^A"V^@^@^...

A última linha é o começo do binário do arquivo de áudio.

O comando grep procura a primeira ocorrência de Ogg no arquivo $0 (que é o próprio arquivo de script) e imprime 1000 linhas depois dessa linha (é suficiente para meu pequeno áudio arquivo de teste). A saída de grep é então canalizada para mplayer , que está lendo /dev/stdin (abreviação de /dev/stdin is - ).

Eu criei esse arquivo concatenando o arquivo de script playmeBashScript.sh com o arquivo de áudio sound.ogg :

cat playmeBashScript.sh sound.ogg > playme.sh

Uma versão mais geral e um pouco mais curta com sed em vez de grep (graças ao Elias):

#!/bin/sh
sed 1,/^exit$/d "$0" | mplayer -
exit
OggS^@^B^@^@^@^@^@^@^@^@^]f<8a>g^@^@^@^@lY߸^A^^^Avorbis^@^@^@^@^A"V^@^@^...

Nesse caso, sed seleciona todas as linhas do número um até a linha onde encontra a palavra exit e as exclui. O restante é colado e canalizado para mplayer . É claro que isso só funciona se a palavra sair ocorrer apenas uma vez no script antes dos dados binários.

    
por 07.02.2014 / 16:49
0

Seu script deve conter também os dados concatenados:

#!/bin/sh

TMPFILE=$(mktemp)
trap "rm ${TMPFILE}" 0 1 2 3 11 15
tail -n +7 $0 ${TMPFILE}
exec mplayer ${TMPFILE}

Vamos chamar o script omniplay . Então você precisa cat seu arquivo ogg anexando ao script:

cat file.ogg >> omniplay
chmod +x omniplay
./omniplay

Este é um método padrão usado por muitos arquivos install.sh. Veja também gzexe . Você também pode ajustar as linhas finais.

    
por 07.02.2014 / 16:59