Use o gstreamer para fazer resampling de arquivos mp3 no Ubuntu

É possível reduzir ainda mais os tamanhos dos arquivos mp3, com pouca perda da qualidade. A utilidade deste procedimento é fazer com que uma quantidade maior deles caiba em dispositivos reprodutores antigos, com capacidade de armazenamento muito limitada.
Se você não se importa em ouvir toda a sua coleção de músicas em um dispositivo de som, com qualidade de rádio, esta é uma ótima ideia.

iPods mp3 player
Coleção de iPods

No primeiro post sobre este tema mostramos como fazer este trabalho através do LAME.
É claro que a redução tem um custo — a consequente redução da qualidade do áudio do arquivo. A gente aposta na possibilidade de esta queda na qualidade ser imperceptível para a maioria das pessoas e no aproveitamento mais eficiente do espaço na mídia de armazenamento. Houve caso de triplicar a quantidade de arquivos dentro de um pendrive antigo.
Atualmente, temos outras ferramentas que também podem fazer o trabalho e é possível criar um script de automação da tarefa bem menor e mais enxuto do que o do artigo anterior.
Vamos ver aqui como isto é possível.

Instalação das ferramentas de trabalho

Aqui vamos usar o GStreamer para fazer a conversão e resampleamento (resampling) dos arquivos mp3. A principal vantagem dele, em relação ao LAME, é que ele retém as informações id3 dos arquivos. Assim, podemos fazer um único script e menor.
Abra um terminal (Ctrl + Alt + T, no Ubuntu) e digite o comando que segue, para instalar gstreamer-tools:

sudo apt-get install gstreamer-tools

Aguarde alguns minutos enquanto o pacote é instalado e prossiga.

Como criar um script de conversão de arquivos de áudio mp3

Sugiro criar um diretório para scripts e programas no seu /home:

mkdir ~/bin
cd ~/bin

Agora abra o seu editor de textos preferido, copie e cole o script abaixo dentro dele:

#!/bin/bash
#
# gshrink - Um script para resamplear todos os arquivos mp3 do
# diretorio. Este script depende do pacote gstremar-tools
# Os créditos do script original:
# Elder-Geek --> http://elder-geek.blogspot.com.br
######################################################
# Lita os arquivos mp3 no diretorio atual
ls *.mp3 > mp3_list
ls *.MP3 >> mp3_list
# Analisa a lista de arquivos mp3 e substitui os espaços por caracteres de escape
sed -i 's: :\\ :g' mp3_list
# Verifica se o subdiretorio resample já existe. Se não, cria.
if
  test -e ./resample
then
  echo "diretorio/arquivo resample ja existe - apagar? (S/n)"
  read reply
  if
    [ "$reply" != "n" ]
  then
    rm -r resample
    mkdir resample
  else
    exit
  fi
else
  mkdir resample
fi
# Resampleia cada mp3 e grava as tags
# CBR bitrate bitrate=128
# VBR quality quality=9
  cat mp3_list |while read song
do
  echo "$song"
  gst-launch filesrc location= \"$song\" ! decodebin2 ! audioconvert ! lamemp3enc target=bitrate bitrate=128 ! id3v2mux ! filesink location=\"resample/$song\"
done
#clean up
if
  test -e mp3_list
then
  rm mp3_list
fi
if
  test -e tag2.txt
then
  rm tag2.txt
fi
exit

Uma última dica

Para quem fez backup de todos os seus CD’s e guardou cada coletânea e álbum em pastas diferentes, recomendo executar o script dentro de cada pasta de arquivos mp3 – o que vai criar um subdiretório adicional resample com os mesmos arquivos da pasta pai, só que resampleados e reduzidos, prontos para ir pra qualquer lugar.

Como reduzir o tamanho do arquivo de audio mp3

O caso aqui é o de reaproveitar todo e qualquer aparelho reprodutor de mp3, ou cartões de memória velhos e, sobretudo, com espaço para armazenamento muito limitado. Eu, mesmo, tinha um pendrive “guerreiro” de 256 Mb, que devia estar próximo dos 7 anos de uso — simplesmente não lembro de quando o comprei. Mas funciona bem em uma caixa de som com entrada USB.
Recentemente, converti uma coleção inteira de CDs para mp3, como cópia de segurança. Agora, para ouvir no dia a dia, não preciso de arquivos de 320 kbps – 128 kbps, ou menos, podem ser o suficiente.

MP3 Logo
MP3 Logo

Se você tem um iPod ou celular antigo, com espaço insuficiente para armazenar músicas, fazer um downsampling nelas pode ser uma solução — é possível triplicar a quantidade de músicas que cabem no dispositivo.
OBS.:A segunda parte deste artigo ensina a fazer esta tarefa com o gstreamer-tools.

Ferramentas necessárias para reduzir o tamanho do arquivo mp3

Os aplicativos necessários para realizar esta tarefa são o python-mutagen e o lame. Ambos podem ser baixados e usados livremente.
No Ubuntu, você pode instalar os dois primeiros via terminal (Ctrl + Alt + T), assim:

sudo apt-get install lame python-mutagen

Como converter os arquivos mp3

Você deve ter centenas de arquivos para converter, não apenas um, eu sei… — mas eu quero mostrar como tudo funciona. Sinta-se livre para pular esta parte, se quiser, apressadinho(a). 😉
Dentro do terminal aberto, digite o seguinte comando para resamplear a sua música (adapte o comando à sua situação, substituindo os nomes dos arquivos):

lame -V5 --vbr-new --resample 44.1 arquivo_original.mp3 arquivo_resampleado.mp3

Aguarde alguns intantes, enquanto os arquivos são processados e, depois, compare os tamanhos.

reduzir o tamanho do mp3
Clique para ampliar a tela

Depois de concluído o trabalho, verifique os tamanhos dos arquivos.
Parece que vai dar pra reviver o antigo cartão de memória, ou não?
Como resamplear arquivos mp3
Clique para ampliar

Problemas que você pode ter com a conversão

Temos dois problemas com este método, por mais eficiente que ele seja:

  • O LAME não copia as tags id3 pro arquivo de origem — em outras palavras, na hora em que estiver tocando, o display do seu aparelho não vai mostrar as informações da música (nome, cantor, álbum etc) – o que pode ser um problema menor para quem vai tocá-las em um aparelho sem visor;
  • Como eu imagino que você tenha centenas de músicas para converter, todo este trabalho braçal não tem sentido.

Como converter muitos arquivos mp3

Para fazer o resampling de uma quantidade brutal de arquivos, o ideal é usar um script.
O Linerd do TuxTweaks, ensina a montar um este script que automatiza a nossa tarefa.
Em verdade, vos digo que serão 2 scripts. O primeiro lê todos os arquivos do diretório a partir do qual está sendo executado e os repassa pro segundo script, que faz o resampling e copia as tags id3. Todos os arquivos do diretório atual serão copiados para um segundo, chamado resample, criado pelo script.
A recomendação, aqui, é que você crie uma pasta (diretório) só para scripts e programas seus:

mkdir ~/bin
cd ~/bin

Copie o texto do script abaixo e cole-o dentro do seu editor de textos preferido. Salve-o como mp3shrink dentro do diretório criado para isto ~/bin

#!/bin/bash
#
# mp3shrink - Um script para resamplear todos os arquivos mp3
# em um diretorio. Este script chama o cptag que precisa
# estar no diretorio do mp3shrink. O cptag depende do lame
# e do mid3v2 (mid3v2 se encontra no pacote do python-mutagen
# É aconselhavel que os scripts fiquem no diretório  
# ~/bin.
######################################################

# Lita os mp3 no diretorio atual
ls *.mp3 > mp3_list
ls *.MP3 >> mp3_list

# Analisa os arquivos mp3 e substitui os espaços em branco por barras de escape.
sed -i 's: :\\ :g' mp3_list

# Verifica a existencia do diretorio resample. Cria um se nao existir
if
   test -e ./resample
then
   echo "diretorio/arquivo resample ja existe. deseja remover? (S/n)"
   read reply
   if
     [ "$reply" != "n" ]
   then
     rm -r resample
     mkdir resample
   else
     exit
   fi
else
   mkdir resample
fi

# Resampleia cada arquivo mp3 e grava as tags atraves do script cptag
cat mp3_list |while read song
do
   echo "$song"
   ~/bin/cptag "$song"
done

# fazendo a limpeza .... 
if
   test -e mp3_list
then
   rm mp3_list
fi
if
   test -e tag2.txt
then
   rm tag2.txt
fi
exit

Feito isto, crie o arquivo cptag, também dentro do diretório ~/bin. Segue o código:

#!/bin/bash
#
#cptag - Um script que resampleia arquivos mp3 com o LAME
#        e copia as tags id3v2 do original pro novo.
#
#####################

# Le as tags id3 e grava no arquivo
mid3v2 -l "$1" > tag2.txt

# Resampleia o arquivo de audio

lame -V5 --vbr-new --resample 44.1 "$1" "resample/$1"

# ajusta o valor da variavel 'title'
if
   grep TIT2= tag2.txt > /dev/null  #testa se a tag title existe
then
   title=`grep TIT2= tag2.txt | sed "s:TIT2=::"`
   echo $title
else
   echo "A tag title nao existe."
fi

# Ajusta a variavel 'album'
if
   grep TALB= tag2.txt > /dev/null  #testa se a tag album existe
then
   album=`grep TALB= tag2.txt | sed "s:TALB=::"`
   echo $album
else
   echo "A tag album nao existe."
fi

# Ajusta a variavel 'artista'
if
   grep TPE1= tag2.txt > /dev/null  #Testa se a tag artista existe
then
   artist=`grep TPE1= tag2.txt | sed "s:TPE1=::"`
   echo $artist
else
   echo "A tag artista nao existe."
fi

# Ajusta o valor da variavel 'track'
if
   grep TRCK= tag2.txt > /dev/null  # Testa se a tag track existe
then
   track=`grep TRCK= tag2.txt | sed "s:TRCK=::"`
   echo $track
else
   echo "A tag track nao existe."
fi

# Ajusta a variavel 'genre'
if
   grep TCON= tag2.txt > /dev/null  # Testa se a taf genre exsite
then
   genre=`grep TCON= tag2.txt | sed "s:TCON=::"`
   echo $genre
else
   echo "A tag genre nao existe."
fi

# Grava as tags no arquivo
mid3v2 -t "$title" -A "$album" -a "$artist" -T "$track" -g "$genre" "resample/$1"

exit

Agora, você precisa tornar estes dois scripts executáveis:

cd ~/bin
chmod u+x mp3shrink cptag

Feito!
Agora vá para o diretório em que se encontram todos os mp3 que você deseja resamplear e execute:

mp3shrink

O script vai guardar os novos arquivos em um subdiretório chamado resample. Dê uma olhada!
Divirta-se!

Como encriptar um Shell Script com SHC

Neste texto, vou ensinar a baixar, instalar e usar SHC, um programa que encripta o código do seus shell scritps.
Antes de mais nada, eu gostaria de dizer que encriptar seus códigos não é uma prática recomendável. O ideal é documentar todo o script, de forma que qualquer pessoa o possa entender facilmente. Códigos fonte devem ser o mais acessíveis possível – já a informação com a qual eles lidam, é que deve ser restringida.
Se você precisa usar informações, usualmente confidenciais, como senhas, de forma automática, então deve procurar outra solução.
Hmmmm… você ainda está aqui?
Tenha em mente, contudo, que um script codificado através do SHC pode não ser legível para usuários comuns (creio que este seja o seu objetivo) — Contudo, uma pessoa que tenha conhecimento do seu funcionamento pode extrair o código criado pelo software.
Em tempo, SHC quer dizer SHell script Compiler.

Download e instalação

O software de que vamos tratar aqui, foi desenvolvido por Francisco Javier R. Garcia e você vai encontrar sua versão mais atualizada aqui.
Vamos começar com o download do código fonte do programa:

wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9.tgz

Uma vez baixado, desempacote e instale:

tar xvfz shc-3.8.9.tgz
cd shc-3.8.9
make

Verifique se tudo correu bem:

./shc -v
shc parse(-f): No source file specified
shc Usage: shc [-e date] [-m addr] [-i iopt] [-x cmnd] [-l lopt] [-rvDTCAh] -f script

Crie um shell script de exemplo

Para testar, você pode usar seu próprio shell script ou pegar este aqui:

#!/bin/bash
echo -n "Quantos numeros aleatorios voce deseja gerar? "
read max
for (( start = 1; start
do
echo -e $RANDOM
done

rode o script:

$ ./alea.sh
Quantos numeros aleatorios voce deseja gerar? 3
24682
1678
491

Encriptando o seu shell script com shc

Use o comando, a seguir, para fazer o trabalho:

./shc -f alea.sh

isto deverá gerar os seguintes arquivos:

ls -l alea*.*
-rwxrw-r--. 1 user group 149 Mar 27 01:09 alea.sh
-rwx-wx--x. 1 user group 11752 Mar 27 01:12 alea.sh.x
-rw-rw-r--. 1 user group 10174 Mar 27 01:12 alea.sh.x.c

Dos quais:

  • alea.sh é o seu script original
  • alea.sh.x é o seu script em formato binário e encriptado
  • alea.sh.x.c é o código fonte do script original em linguagem C

Após transformar o código do seu script, originalmente escrito em Bash para um script em C, o shc o compila, gerando o executável alea.sh.x.
Veja como testar:

$ file alea.sh
alea.sh: Bourne-Again shell script text executable
$ file alea.sh.x
alea.sh.x: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
$ file alea.sh.x.c
alea.sh.x.c: ASCII C program text

Execute o seu script encriptado

./alea.sh.x
Quantos numeros aleatorios voce deseja gerar? 3
7489
10494
29627

Determine uma data de expiração pro seu script

Com o uso do shc, é possível evitar que o seu script seja executado após uma certa data. Se for feita a tentativa de executar um script que já tenha expirado, uma mensagem de erro será exibida na tela.
Crie um novo script, usando a opção “shc -e“, que permite a entrada de uma data de expiração (que deve ser fornecida no formato dd/mm/yyyy:

./shc -e 31/12/2011 -f alea.sh

Veja o que acontece quando alguém tenta executar um script vencido:

./alea.sh.x
./alea.sh.x: has expired!
Please contact your provider

Você pode criar a sua própria mensagem de expiração, para o caso de redistribuir o seu script para pessoas que não falem inglês, por exemplo. Use a opção -m para isto.
Divirta-se!