Recentemente precisei converter um arquivo
SWF (Shockwave Flash) para o formato
MP4 (MPEG-4) mas não consegui encontrar nenhum programa do Linux que fizesse isso. Os conversores online também não funcionaram (o resultado sempre contém somente a faixa de áudio: a faixa de vídeo é eliminada do arquivo resultado da conversão) e aqui no fórum não encontrei nenhum tutorial ensinando a fazer esse tipo de conversão com as versões atuais do Ubuntu. Eventualmente acabei encontrando
esta dica que funcionou, porém elá está bastante incompleta e nada clara para o linuxista iniciante, por isto resolvi escrever este pequeno tutorial que explica, em português, como fazer a conversão explicada naquela dica, já incorporando todas as melhorias que desenvolvi para tornar o processo de conversão mais fácil e inteligível. Os passos são os que seguem.
PS: este método só funciona com arquivos SWF que não sejam interativos (não possuam menu, botão em que você tenha de clicar para que a animação em Flash seja executada etc.).PASSO 1 - PRÉ-INSTALE OS PROGRAMAS NECESSÁRIOS.Abra uma janela do terminal (shell) do Linux e execute o comando abaixo, que então instalará o programa
FFMPEG (programa capaz de pegar um arquivo que contenha somente uma trilha de vídeo, pegar também um segundo arquivo que contenha somente uma trilha de áudio, e então combinar os dois arquivos para gerar um novo arquivo, por exemplo com extensão MP4, que contenha as duas trilhas - a de vídeo e a de áudio), o programa
GEDIT (um editor de textos simples), o programa
GNASH (aplicativo multimídia da GNU capaz de ler e executar arquivos Shockwave Flash / SWF, assim como também capaz de extrair a trilha de áudio dele para um novo arquivo de áudio e separadamente extrair a trilha de vídeo dele também para um novo arquivo de vídeo) e o programa
MPLAYER (necessário por ser capaz de executar arquivo binário de dados de vídeo em formato RAW e também capaz de durante essa execução exportar esse conteúdo convertendo-o para algum formato de vídeo codificado que pode ser posteriormente usado pelo FFMPEG):
sudo apt-get install ffmpeg gedit gnash mplayer -y
PASSO 2 - EXECUTE O GEDIT E COLE DENTRO DELE O CÓDIGO DO SCRIPT CONVERSOR.Digamos que sua conta de usuário seja
bogus, que portanto sua pasta de usuário fique em
/home/bogus/ e que você queira criar o script dentro de uma nova pasta, intitulada
scripts, que ficará em
/home/bogus/. Em tal caso, você quer gravar o script dentro de
/home/bogus/scripts/. No Linux, um atalho para a pasta pessoal do usuário que está conectado no momento é o caractere
~ ("til"), portanto
~/scripts/ é o mesmo que
/home/bogus/scripts/. Agora que você aprendeu isso (se é que já não sabia...), execute o comando abaixo para criar a pasta
scripts dentro de sua pasta pessoal:
mkdir ~/scripts
...e em seguida execute o comando abaixo, para fazer o GEDIT criar o arquivo de script
swfpramp4.sh dentro da pasta
scripts que você acabou de criar:
gedit ~/scripts/swfpramp4.sh
Feito isso, copie o código abaixo e cole-o dentro da janela do GEDIT:
#!/bin/bash
clear
pwd=`pwd`
echo Você no momento está na pasta $pwd.
echo O arquivo SWF que você deseja converter em MP4 está nessa pasta $pwd? [S + Enter = "sim" / Qualquer outra tecla + Enter = "não"]
read resposta
if [ $resposta != s -a $resposta != S ]
then echo >&2 "Ok, então vou sair deste script. Use o comando 'cd' para entrar na pasta em que o arquivo SWF se encontra e em seguida execute este script a partir daquela pasta."
sleep 3
exit 1
fi
clear
contador=0
while [[ $resposta = s ]] || [[ $resposta = S ]]
do
echo Ok, então digite o nome completo \do arquivo SWF \(exemplo\: MeuArquivo.swf\), respeitando as maiúsculas e minúsculas \do nome \do arquivo, e em seguida pressione Enter.
read SHOCKWAVE
contador=$((contador+1))
if [ $contador = 3 ]
then clear
contador=0
fi
echo Você informou o seguinte nome de arquivo: $SHOCKWAVE
echo Esse nome de arquivo \(inclusive extensão\) está correto?
echo [S + Enter = "sim" / Q + Enter = "quero sair deste script" / Qualquer outra tecla + Enter = "não"]
read correto
if [ $correto = q -o $correto = Q ]
then echo >&2 "Ok, vou sair deste script."
sleep 3
exit 1
else if [ $correto = s -o $correto = S ]
then resposta=n
fi
fi
done
echo Ok, então vamos em frente...
RESULTADO=${SHOCKWAVE%.*}.mp4
NOMEDOIDO=`cat /dev/urandom | tr -dc 'a-zA-Z' | fold -w 32 | head -n 1`
BINARIO=$NOMEDOIDO.bin
AUDIO=$NOMEDOIDO.wav
VIDEO=$NOMEDOIDO.mp4
LOG=/tmp/gnash.log
sleep 3
# Cria um arquivo binário e um arquivo de áudio a partir das respectivas trilhas binária e de áudio do arquivo SWF.
echo Iniciando o processo de extração de vídeo e áudio a partir \do arquivo SWF. Esse processo demora um tempo...
GNASH=`dump-gnash -1 -r 3 -v -D $BINARIO -A $AUDIO $SHOCKWAVE > $LOG`
echo Extração concluída.
# Coleta os parâmetros do vídeo.
LARGURA=`cat $LOG | grep -o 'WIDTH=[^, }]*' | sed 's/^.*=//'`
ALTURA=`cat $LOG | grep -o 'HEIGHT=[^, }]*' | sed 's/^.*=//'`
QUADROS=`cat $LOG | grep -o 'FPS_ACTUAL=[^, }]*' | sed 's/^.*=//'`
# Cria o arquivo MP4 sem compressão e sem trilha de áudio a partir dos "dados brutos" (RAW) do vídeo armazenado em $BINARIO.
mplayer $BINARIO -vo yuv4mpeg:file=$VIDEO -demuxer rawvideo -rawvideo fps=$QUADROS:w=$LARGURA:h=$ALTURA:format=bgra
# Usa o FFMPEG para embutir a trilha de áudio no arquivo MP4 sem compressão e em seguida comprimir o resultado (criar um MP4 completo, de vídeo + áudio, e compacto).
ffmpeg -i $VIDEO -i $AUDIO $RESULTADO
echo Você deseja que a data e a hora de criação \do seu arquivo SWF sejam gravadas no seu arquivo MP4, para que fique parecendo que o MP4 foi criado no mesmo dia e horário \do arquivo SWF? [S + Enter = "sim" / Qualquer outra tecla + Enter = "não"]
read datahora
if [ $datahora = s -o $datahora = S ]
# Copia para o arquivo MP4 as informações originais de data e hora de criação do arquivo SWF.
then touch -r $SHOCKWAVE $RESULTADO
fi
echo Você deseja gravar no seu arquivo MP4 as mesmas permissões de leitura, escrita/gravação e execução que foram atribuídas ao proprietário, ao grupo e aos demais usuários \do arquivo SWF? [S + Enter = "sim" / Qualquer outra tecla + Enter = "não"]
read perms
if [ $perms = s -o $perms = S ]
# Copia para o arquivo MP4 as permissões originais de leitura, escrita/gravação e execução atribuídas ao proprietário, ao grupo e aos demais usuários do arquivo SWF.
then chmod --reference=$SHOCKWAVE $RESULTADO
fi
# Hora da faxina!
rm -f $BINARIO
rm -f $AUDIO
rm -f $VIDEO
echo Script finalizado!
sleep 3
exit 0
Em seguida clique no botão "Salvar" e então feche o GEDIT.
PASSO 3 - TORNE O SCRIPT EXECUTÁVEL E EXECUTE-O DENTRO DA PASTA DO ARQUIVO SWF.Agora que você tem esse script conversor armazenado lá em sua pasta
~/scripts/swfpramp4.sh, ainda no terminal do shell execute o seguinte comando para tornar o script executável:
chmod +x ~/scripts/swfpramp4.sh
Agora que o script está executável, é só utilizá-lo.
Vamos supor que em
/home/bogus/Vídeos/ exista o arquivo
XiaoXiao.swf que você gostaria de assistir novamente mas não consegue porque a Adobe descontinuou o Shockwave Player e os navegadores web também não reconhecem nem executam mais arquivos com extensão e formato SWF. Bem, o comando lá do
PASSO 1 já instalou o GNASH pra você. Esse programa permite que você execute arquivos SWF dentro do ambiente gráfico do Linux: experimente abrir seu gerenciador de arquivos, ir até a pasta em que o arquivo SWF se encontra, executar um "clique" direito sobre o arquivo
XiaoXiao.swf, selecionar
"Abrir com..." e então selecionar o programa GNASH. Se não conseguir fazer isso (porque o programa GNASH não está na lista de programas, ou por qualquer outro motivo), retorne ao terminal do shell e execute este comando:
gnash ~/Vídeos/XiaoXiao.swf
...que a mágica acontecerá.
Agora que você já viu do que o GNASH é capaz, você talvez se dê por satisfeito/satisfeita, mas
hey! O formato SWF está obsoleto e no futuro talvez até o GNASH seja descontinuado. Você vai arriscar?
Que tal, por garantia, converter esse arquivo SWF para um formato mais moderno, como é o caso do formato MPEG-4 (contêiner MP4)?
O script que você salvou aí no seu sistema serve pra isso.
Ainda no terminal do shell, acesse a pasta do seu arquivo SWF:
cd ~/Vídeos
...e então
execute o script a partir da pasta desse arquivo SWF (informe o caminho completo para o script):
~/scripts/swfpramp4.sh
O script lhe fará algumas solicitações: primeiro solicitará que você confirme estar mesmo na pasta / no diretório em que o arquivo SWF se encontra presente, em seguida solicitará que você informe o nome correto e completo do arquivo (cuidado com maiúsculas e minúsculas e não deixe de informar a extensão do arquivo), em seguida terá início um longo processo de conversão que irá temporariamente usar
MUITOS GIGABYTES DE DADOS do seu computador, porque o processo de conversão requer a extração de dados brutos/binários (formato RAW) do arquivo SWF durante a execução dele pelo GNASH, o que gera um volume gigantesco de dados.
AGUARDE e se certifique de que seu computador possui espaço de armazenamento suficiente: são recomendados cerca de 10GB para cada 1MB que o arquivo SWF tiver (mas isso varia - para mais ou para menos - de acordo com as dimensões dos quadros de vídeo do arquivo SWF e outras coisas).
Concluído o longo e volumoso processo de extração RAW, o script converterá o vídeo RAW em MP4 sem som e em seguida combinará esse MP4 sem som com a faixa de áudio anteriormente extraída pelo GNASH. O resultado será um arquivo MP4 constituído por uma trilha de vídeo e uma trilha de áudio, como tem de ser mesmo.
PASSO 4 - SEU MP4 É UMA MARCA DO PRESENTE OU UMA PRESERVAÇÃO DO PASSADO? Se você está convertendo pra MP4 um arquivo SWF que você tem guardado aí há muitos anos e gostaria de se lembrar de quando foi (data e hora) que você gravou esse arquivo SWF no seu computador, preste atenção na próxima pergunta que o script irá lhe fazer após criar o MP4 com a faixa de som: ele perguntará se você quer modificar o
timestamp do arquivo MP4 para que fique igual ao do SWF. O
timestamp é exatamente a informação, armazenada dentro do arquivo, a respeito da data e hora em que o arquivo foi criado. Enfim: se o arquivo SWF foi gravado aí no seu computador em (por exemplo) 1º de abril de 2000 e você quer continuar se lembrando disso sempre que for executar esse arquivo MP4, basta confirmar isso pro script que o script lerá o
timestamp do arquivo SWF e gravará uma cópia dele por cima do
timestamp do respectivo arquivo MP4.
Após essa etapa, o script por fim lhe perguntará se você deseja copiar pro arquivo MP4 também as permissões originais do arquivo SWF: essas são as permissões de leitura (R), escrita/gravação (W) e execução (X) atribuídas ao proprietário (UID), ao grupo (GID) e aos demais usuários do sistema. Por exemplo: talvez o arquivo SWF original possua permissões
RW-RW-R-- (em octal: 664) mas o MP4 gerado esteja com permissões
R--R--R-- (em octal: 444) e você queira corrigir isso, deixando as permissões do arquivo MP4 iguais às do SWF. O próximo comando modifica essas permissões (embora não modifique o proprietário nem o grupo do arquivo).
Regra geral, é besteira colocar essas opções de
timestamp e permissões em scripts simples como este, mas como se trata de um contexto no qual é bem provável que algumas pessoas usem o script para "salvar" arquivos SWF que contêm materiais saudosos, é maior a possibilidade de algumas pessoas quererem preservar principalmente o
timestamp do arquivo SWF no respectivo arquivo MP4.
Após essa última etapa, o script excluirá os arquivos temporários que criou e finalizará a execução dele.