[DICA] Como converter arquivo SWF para MP4

Iniciado por Sampayu, 21 de Novembro de 2019, 12:34

tópico anterior - próximo tópico

Sampayu

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.  ;D

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!  :P 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)?  ;D 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.  8)

PASSO 4 - SEU MP4 É UMA MARCA DO PRESENTE OU UMA PRESERVAÇÃO DO PASSADO?  ;D

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.
Yuri Sucupira ("Sampayu")

galactus

O cara só pode ser Ninja mesmo!!  :D

Parabéns!

BigLinux no Notebook  / Várias Distros Virtualizadas no PC.

Sampayu

Yuri Sucupira ("Sampayu")

romulodovale

Em pleno 2023, no trabalho, deparei-me com a situação de uma wiki de um dos nossos sistemas que tem um totorial em swf e que os navegadores não suportam mais.
Tentei baixar o gnash.deb a partir de repositórios  para instalar no Pop_OS 22.04 e não  consegui. Então usei o Gnome Boxes para criar uma VM com o Ubuntu 18.04, última versão que tinha o pacote gnash em seus repositórios para poder usar o seu script, mas o resultado é que mesmo um arquivo de 1,6 MB em swf começava a gerar arquivos temporários (o .bin especialmente) infinitamente até ocupar todo o espaço em disco da VM.
Achei que o problema era a VM, estão, em casa, fiz uma instalação real do Ubuntu 18.04 e o resultado foi o mesmo, como pode ser visto no link da imagem no meu Google Drive https://drive.google.com/file/d/1XkMLptAe7S4VG5MEuuMJ1mVbrbHO-em_/view?usp=sharing, o arquivo Criar_Senha.swf, de 1,6MB, está gerando um .bin que já passa dos 179,2GB e vai até o limite do meu SSD de 240GB.
Alguma dica sobre o quê pode estar errado?

Sampayu

Citação de: romulodovale online 09 de Abril de 2023, 14:58
Criar_Senha.swf, de 1,6MB, está gerando um .bin que já passa dos 179,2GB e vai até o limite do meu SSD de 240GB.
Alguma dica sobre o quê pode estar errado?

O programa Gnash infelizmente está obsoleto. Cheguei a testar uma versão do repositorio Git, mas deu vários problemas.

De qualquer modo, uma versão snap está disponível e pode ser instalada com este comando:

sudo snap install gnash-raymii

Após instalar o snap, edit o script substituindo dump-gnash por gnash-raymii.dump-gnash e então salve.

O arquivo .bin gerado realmente pode ficar enorme: eu usei um arquivo sample.swf de 1,2MB para testar a dica acima e o script com o gnash-raymii criou um arquivo .bin de 6GB e um arquivo .mp4 (somente vídeo) com um tamanho de 2,4GB. Mas o arquivo final sample.mp4 (contendo vídeo + áudio) ficou com apenas 7,1MB e tocou normalmente no Mplayer e no VLC Media Player.

Enfim: como o Gnash extrai os dados binários e de vídeo em formato bruto (raw), os arquivos podem mesmo ficar gigantescos, mas então o conteúdo deles é codificado no formato final .mp4 com 1 trilha de vídeo e 1 trilha de áudio e essa codificação comprime os dados.

Se a solução acima não der nenhum erro no script porém gerar arquivos grandes, então o seu arquivo .swf, apesar de pequeno, possui tantos gráficos vetoriais e outras informações codificadas que a descodificação realmente produz arquivos raw gigantescos. Neste caso, você vai mesmo precisar de mais espaço de armazenamento. Desconheço um método mais eficaz para extrair os dados brutos do arquivo swf e recodificar em mp4.
Yuri Sucupira ("Sampayu")