Universidade Federal do Rio de Janeiro
Escola Politécnica
Curso de Redes e Vídeo IP (RV – IP)
Avaliação de Sincronismo de Stream de Áudio e Vídeo Autor:
_________________________________________________ Eng. Luiz Fausto de Souza Brito
Orientador UFRJ:
_________________________________________________ Prof. Sergio Barbosa Villas-Boas, Ph.D.
Orientador GLOBO:
_________________________________________________ Eng. Luiz Carlos Abrahao
Examinador:
_________________________________________________ Prof. Edilberto Strauss, Ph.D.
RV-IP
Dezembro de 2009
ii
AGRADECIMENTO
A Deus, verdadeira fonte de toda sabedoria. À minha esposa, por todo suporte
que me concede. Aos meus pais, pela educação que me deram. À TV Globo, por
financiar esse curso, em particular pelos meus gestores que me confiaram essa
oportunidade. À UFRJ pelo comprometimento com a educação, em particular pela
dedicada equipe desse curso. Ao meu orientador na TV Globo e ao meu orientador na
UFRJ, pela generosidade em aceitarem assumir a orientação desse trabalho. Ao Ricardo
Fontenelle, pesquisador da TV Globo, pela sua disponibilidade e capacidade técnica
para discutir soluções para os problemas tecnológicos do nosso dia-a-dia, assim como
para o problema desse projeto em particular. Ao engenheiro Ricardo José, pela
disponibilidade em revisar este texto. Ao povo brasileiro, pela contribuição na minha
educação. A todos que, de alguma forma, me ajudaram a chegar até aqui, o meu muito
obrigado.
iii
RESUMO
Falta de sincronismo entre áudio e vídeo é um problema com muitas causas e
poucas soluções disponíveis, particularmente para a avaliação de sistemas de
transmissão por streaming. Uma metodologia simples, utilizando um sinal de teste
resistente às perdas provocadas por diferentes tipos de compressão, pode ser uma
solução efetiva para esse tipo de avaliação objetiva, como demonstrado neste trabalho.
Palavras-Chave: Sincronismo, Áudio, Vídeo, Streaming.
iv
Sumário
Capítulo 1 Introdução ................................................................................................. 1
1.1 - Tema.................................................................................................................. 1 1.2 - Delimitação ....................................................................................................... 1 1.3 - Justificativa........................................................................................................ 2 1.4 - Objetivos ........................................................................................................... 2 1.5 - Metodologia....................................................................................................... 2 1.6 - Descrição ........................................................................................................... 3
Capítulo 2 Medição de Sincronismo em Banda Base ............................................... 4
2.1 - Fontes de problemas .......................................................................................... 4 2.2 - Tolerância de Sincronismo................................................................................ 5 2.3 - Avaliação Subjetiva........................................................................................... 5 2.4 - Medição usando contadores .............................................................................. 6 2.5 - Medição usando transições rápidas ................................................................... 6 2.6 - Medição usando contadores e transições rápidas .............................................. 6 2.7 - Medição usando "marca d'água" ....................................................................... 7 2.8 - Medição usando movimento labial.................................................................... 7 2.9 - Dificuldades da aplicação a diferentes tipos de compressão............................. 7
Capítulo 3 Medição de Sincronismo em Streams ..................................................... 8
3.1 - Suportando diferentes compressões .................................................................. 8 3.2 - Plataforma de Desenvolvimento e Testes........................................................ 10 3.3 - Aplicativos Desenvolvidos.............................................................................. 10
3.3.1 - AVSyncGen.............................................................................................. 11 3.3.2 - AVSyncRead ............................................................................................ 12 3.3.3 - AVSyncAdjust.......................................................................................... 12
Capítulo 4 Resultados Experimentais ...................................................................... 14
4.1 - Teste 1: AVSyncGen + AVSyncRead............................................................. 14 4.2 - Teste 2: AVSyncGen + AVSyncAdjust + AVSyncRead................................ 14 4.3 - Teste 3: AVSyncGen + QuickTime Player + Screenium + AVSyncRead...... 15 4.4 - Teste 4: AVSyncGen + AVSyncAdjust + QuickTime Player + Screenium + AVSyncRead .............................................................................................................. 16 4.5 - Teste 5: AVSyncGen + Darwin Streaming Server + QuickTime Player + Screenium + AVSyncRead ......................................................................................... 16 4.6 - Teste 6: AVSyncGen + AVSyncAdjust + Darwin Streaming Server + QuickTime Player + Screenium + AVSyncRead ....................................................... 17
Capítulo 5 Conclusão e Trabalhos Futuros............................................................. 18
5.1 - Conclusão ........................................................................................................ 18 5.2 - Trabalhos Futuros............................................................................................ 19
v
Bibliografia .................................................................................................................... 20 Apêndice 1 Código Fonte .......................................................................................... 21
/Applications/AVSyncGen.app/Contents/Resources/Scripts/main.scpt..................... 21 /Applications/AVSyncGen.app/Contents/Resources/AVSyncGen.sce ...................... 23 /Applications/AVSyncRead.app/Contents/Resources/Scripts/main.scpt ................... 25 /Applications/AVSyncRead.app/Contents/Resources/AVSyncRead.sce................... 27 /Applications/AVSyncAdjust.app/Contents/Resources/Scripts/main.scpt................. 29
1
Capítulo 1
Introdução
1.1 - Tema
O presente trabalho propõe uma metodologia para avaliar o sincronismo entre
áudio e vídeo em um stream.
A justificativa do problema envolve um pouco de teoria de processamento e
streaming de áudio e vídeo, e a solução proposta será desenvolvida em software.
1.2 - Delimitação
Este trabalho contempla a avaliação de sincronismo relativo (latência) entre
áudio e vídeo em um stream através da transmissão de um sinal teste. Não atende à
avaliação de sincronismo entre áudio e vídeo de um sinal qualquer sendo transmitido.
Não garante, portanto, que outro sinal audiovisual transmitido tenha a mesma relação de
sincronismo, pois esta pode variar na fonte do sinal. Em diferentes sistemas de
reprodução também poderão existir diferenças decorrentes, por exemplo, de algum
eventual processamento anterior à exibição. A correção das eventuais diferenças de
sincronismo medidas também não é considerada neste trabalho.
2
1.3 - Justificativa
Por diversas razões áudio e vídeo podem perder sincronismo em uma
transmissão, seja por processamentos com latências diferenciadas seja por diferenças
nas respectivas cadeias de distribuição. Na transmissão convencional de televisão este é
um problema que pode causar muito incômodo ao espectador, porém existem algumas
soluções comerciais para avaliação objetiva de eventuais problemas. Na transmissão
pela internet, pela multiplicidade de opções e sistemas utilizados, não existem
ferramentas disponíveis para essa avaliação objetiva e a avaliação subjetiva é dificultada
pela qualidade em geral inferior do vídeo. Além disso, existem mais variáveis
envolvidas no sistema que podem gerar problemas de sincronismo, como o processo de
codificação, o transporte pela rede e o processo de decodificação. Embora se considere
que o espectador desse tipo de mídia é mais tolerante a problemas de qualidade em
geral, essa é uma situação que está sendo modificada pela crescente disponibilidade de
banda de internet para o usuário final no ambiente doméstico.
1.4 - Objetivos
Pretende-se neste trabalho desenvolver uma ferramenta, capaz de avaliar
eventuais diferenças de sincronismo entre áudio e vídeo, que se aplique a sistemas de
distribuição pela internet, independente das características particulares do sistema
escolhido, tais como protocolos, codecs, hardwares e softwares.
1.5 - Metodologia
Por analogia aos sistemas de avaliação equivalentes disponíveis para áudio e
vídeo em banda base, propõe-se uma variação aplicável a sistemas com diferentes tipos
de compressão e interface diferenciada, no caso um computador. Serão ainda
apresentados os resultados de testes práticos realizados utilizando a ferramenta
desenvolvida.
3
1.6 - Descrição
No capítulo 2 é apresentada uma breve explicação sobre os problemas de
sincronismo e alguns sistemas de avaliação disponíveis para áudio e vídeo em banda
base, além da dificuldade de aplicá-los a sistemas de distribuição pela internet com
diferentes tipos de compressão.
O capítulo 3 apresenta o desenvolvimento de ferramentas, baseadas em uma
nova proposta metodológica de avaliação de sincronismo, que se adequem às
características dos sistemas de interesse, no caso sistemas de streaming.
Os resultados de testes práticos realizados com as ferramentas desenvolvidas são
apresentados no capítulo 4.
No capítulo 5 são apresentadas as conclusões e propostas de trabalhos futuros.
4
Capítulo 2
Medição de Sincronismo em Banda Base
2.1 - Fontes de problemas
A cadeia de transmissão de um sinal audiovisual é, em geral, um sistema
complexo, com muitos componentes envolvidos. Muitos desses componentes realizam
processamento digital de áudio e/ou vídeo, o que geralmente impõe uma certa latência
ao sinal processado. Além disso, por vezes, tanto em sistemas digitais quanto
analógicos, dispositivos de gravação ou a transmissão de sinais a longas distâncias
também podem impor latência ao áudio e ao vídeo. Se houver diferença na latência
resultante do processamento, gravação ou transmissão do áudio e do vídeo, o
sincronismo entre os dois é prejudicado.
5
2.2 - Tolerância de Sincronismo
Embora pequenas diferenças de sincronismo entre áudio e vídeo possam ser
imperceptíveis para o espectador, em situações mais extremas, e dependendo do tipo de
programa, a falta de sincronismo pode se tornar incômoda. Embora esse limiar esteja
sujeito a uma certa variabilidade na percepção individual, a ATSC1 estabelece [1],
especificamente para a aplicação em TV Digital, que o áudio não pode estar adiantado
mais de 15 ms nem atrasado mais de 45 ms em relação ao vídeo na entrada do
codificador. Na saída do decodificador poderá ser acrescentado um erro de sincronismo
de até 15 ms entre áudio e vídeo, em qualquer direção. Ou seja, a latência total do áudio
em relação ao vídeo no sistema deve estar limitada entre -30 ms e +60 ms. Entretanto, a
ATSC não menciona como realizar essa medição. Não existem padrões abertos para
avaliação objetiva, embora existam opções comerciais através de alguns fabricantes,
cada um com sua tecnologia proprietária. Enquanto isso, a avaliação subjetiva ainda é
muito empregada. A seguir será apresentada uma análise das opções disponíveis.
2.3 - Avaliação Subjetiva
Na falta de um medidor objetivo, por qualquer motivo que seja, a alternativa é a
avaliação subjetiva. Pode ser feita através de sinais de teste, ou filmando alguém
falando para teste diante de uma câmera, ou até diretamente com o sinal audiovisual a
ser transmitido. Um avaliador treinado e experiente pode ser capaz de "acertar" o
sincronismo para um padrão aceitável, através de tentativa e erro, embora esse tipo de
teste seja lento e esteja sujeito às variabilidades da percepção individual, cuja precisão
também é afetada pelo tipo de sinal audiovisual utilizado para a análise.
1 ATSC: Comitê de Sistemas Avançados de Televisão (Advanced Television Systems Committee), grupo que estabeleceu os padrões de Televisão Digital dos Estados Unidos da América.
6
2.4 - Medição usando contadores
Uma das técnicas utilizadas para avaliar diferenças de sincronismo entre áudio e
vídeo consiste em injetar, no sistema sob teste, sinais nos quais são inseridos
contadores, codificados na imagem e no som, que possam ser decodificados e
comparados na saída do sistema.2
2.5 - Medição usando transições rápidas
Outra técnica de medição envolve a utilização sinais de teste que contenham
transições rápidas na imagem e no som, cujos instantes de reprodução podem ser
comparados na saída do sistema sob teste.3
2.6 - Medição usando contadores e transições rápidas
As duas técnicas anteriormente citadas podem ser combinadas. Neste caso um
dos sinais (áudio ou vídeo) contém um contador enquanto o outro contém transições
rápidas. Na saída do sistema sob teste o instante da transição rápida é comparado com o
valor do contador neste mesmo instante. [2]
2 Dois sistemas experimentais utilizando essa técnica foram desenvolvidos pelo Departamento de Manutenção da TV Globo Rio, um utilizando time-code, VTs e um waveform (pelo Engenheiro Helio Eufrauzino), e outro com o desenvolvimento de um equipamento com um sistema de contagem proprietário (pelo Pesquisador Ricardo Fontenelle). 3 Dois sistemas testados pelo Departamento de Manutenção da TV Globo Rio utilizavam essa técnica: o Pro-Bel HD Valid8 utiliza color-bars com tom, piscando um quadro em black síncrono com mute no áudio; o Tektronix TG700 possui um sinal de teste para uso em conjunto com o WFM7120 (com opcional AV Delay) utiliza black no vídeo e mute no áudio, piscando um quadro de vídeo qualquer síncrono com um tom no áudio.
7
2.7 - Medição usando "marca d'água"
Um produto [4], já descontinuado por falta de sucesso comercial, utilizava uma
técnica interessante para verificar problemas de sincronismo na distribuição de um sinal
audiovisual. Na ponta da geração de um enlace a ser verificado, em que se supõe que o
sincronismo esteja correto, um equipamento inclui no vídeo uma "marca d'água", ou
seja, um sinal praticamente invisível que corresponde ao envelope da forma de onda do
áudio correspondente. Na ponta da recepção do enlace, outro equipamento extrai essa
"marca d'água" do vídeo e compara com o envelope do áudio recebido, podendo com
isso calcular a latência. Os detalhes da implementação dessa "marca d'água" não foram
divulgados pelo fabricante.
2.8 - Medição usando movimento labial
Uma idéia aparentemente atrativa é a medição objetiva do sincronismo através
do reconhecimento dos movimentos labiais e dos fonemas correspondentes [3], porque
poderia ser aplicada sem necessidade de um sinal de teste específico e eventualmente
até para verificação do sistema em tempo real durante uma transmissão. Porém trata-se
de um processamento muito complexo (e por isso mesmo de maior custo), e cuja
eficácia é dependente da boa visibilidade do movimento labial e da qualidade do áudio.
Essas condições não são facilmente atendidas em qualquer tipo de programa.
2.9 - Dificuldades da aplicação a diferentes tipos de compressão
Alguns fabricantes alegam que seus sinais de teste suportam sofrer algum tipo
de processamento ou perda de qualidade, porém há limites. Sinais de teste que utilizam
contadores, transições rápidas, "marca d'água" ou detecção de movimento labial podem
ter sua decodificação ou interpretação seriamente dificultados por sistemas que
envolvam diferentes tipos de compressão, como é o caso de streaming pela internet. As
modificações espaciais e temporais no vídeo causadas pela mudanças na resolução, na
relação de aspecto e na taxa de quadros por segundo e a limitação de banda do áudio,
além da degradação introduzida tanto no vídeo quanto no áudio pelo processo de
codificação e decodificação, em geral inviabilizam o reconhecimento dos padrões
utilizados para avaliação de sincronismo nas técnicas mencionadas neste capítulo.
8
Capítulo 3
Medição de Sincronismo em Streams
3.1 - Suportando diferentes compressões
Em todos os sistemas que utilizam sinais de teste para a avaliação de
sincronismo entre áudio e vídeo (com contadores, transição rápida ou combinação dos
dois) trata-se de um sinal periódico, cujo período limita a faixa de erro de sincronismo
detectável. Por exemplo, admitindo que o áudio possa estar adiantado ou atrasado em
até quatro segundos em relação ao vídeo o período do sinal de teste deve ser igual ou
superior a oito segundos.
Também é necessário poder extrair sinais de sincronismo unidimensionais do
áudio e do vídeo (o vídeo é um sinal bidimensional enquanto o áudio é um sinal
unidimensional) que possam utilizar diferentes taxas de amostragem, como é o caso de
vídeo (em geral igual ou inferior a 30 quadros por segundo) e áudio (em geral igual ou
inferior a 48000 amostras por segundo).
Além disso, para suportar especificamente diferentes tipos de compressão de
áudio e vídeo, é necessário garantir que o sinal de teste seja o mais simples possível do
ponto de vista da representação do sinal comprimido, para minimizar problemas com
eventuais perdas de compressão.
Um dos sinais periódicos mais simples que se pode imaginar (ao menos do
ponto de vista da representação no domínio da frequência) é uma senóide. O passo
seguinte é encontrar uma forma conveniente de transportar uma senóide de frequência
muito baixa (por exemplo, 1/8 Hz) no vídeo e no áudio.
9
A compressão de um sinal de vídeo pode ser feita em dois domínios: espacial e
temporal. Quanto ao domínio espacial o sinal mais simples para ser codificado é aquele
que possui todos os pixels iguais. Isso também simplifica a análise do vídeo, já que
bastaria analisar um único pixel qualquer, e já o reduz de bidimensional a
unidimensional. Ainda melhor, para a representação codificada, se o sinal de vídeo não
contiver cores, já que em geral são alocados mais bits para a codificação de luminância
do que para a crominância. Quanto ao domínio temporal, um sinal com transições lentas
(acompanhando uma senóide de baixa frequência) é mais simples de codificar que um
vídeo com transições rápidas. Mesmo com uma taxa de quadros por segundo muito
baixa (e.g. 10 quadros por segundo), como o que pode acontecer nos vídeos para
internet, essa amostragem ainda estará muito acima do dobro da frequência da
frequência da senóide (e.g. 1/8 Hz), portanto o sinal de teste estará sempre
suficientemente amostrado para sua perfeita recuperação. O sinal de vídeo, pode ser
portanto, uma variação senoidal da luminância (com um offset constante, já que não
existe luminância negativa).
A compressão de áudio pode envolver filtros passa-altas e passa-baixas. Na pior
das hipóteses, pode-se supor uma filtragem equivalente à telefônica (aproximadamente
de 300 Hz a 3 kHz). Além disso, devido à filtragem psicoacústica do mascaramento, à
requantização do sinal no domínio da frequência, e às distorções de amplitude e fase dos
filtros, sinais multifrequenciais complexos e de amplo espectro podem não ser
adequadamente codificados. É necessário, portanto, mapear o sinal de sincronismo para
a faixa mais linear possível da resposta em frequência (em torno de 1 kHz) com
espectro mais simples e estreito possível. Pode-se utilizar para isso uma modulação
AM4 com portadora em 1 kHz. Como o sinal de sincronismo deve possuir frequência
muito baixa (e.g. 1/8 Hz) o espectro resultante será muito estreito, além de simples.
Adicionalmente a demodulação AM também é simples de ser implementada, o que
facilita a recuperação do sinal de sincronismo do áudio.
4 AM: Modulação em Amplitude (Amplitude Modulation).
10
3.2 - Plataforma de Desenvolvimento e Testes
O desenvolvimento e os testes foram realizados através de software. O
computador utilizado foi um Apple MacBook (identificador de modelo: MacBook 4,1),
com processador Intel Core 2 Duo 2.1 GHz e 4 GB de RAM. O sistema operacional
utilizado foi o Mac OS X versão 10.5.8. Os aplicativos desenvolvidos utilizaram o
"Editor de Roteiros" (AppleScript) versão 2.2.1, o Scilab versão 5.1.1 alpha-1, o SIVP
(Scilab Image and Video Processing toolbox) versão 0.5.0 e o QuickTime Player Pro
versão 7.6.4. Para os testes também foram utilizados os softwares Screenium versão
1.2.4 e Darwin Streaming Server versão 6.0.3. A demanda de memória e processamento
dos algoritmos propostos é relativamente pequena, uma vez que é necessário carregar na
memória apenas 8 segundos de áudio e vídeo em baixa qualidade e a análise não é feita
em tempo real.
3.3 - Aplicativos Desenvolvidos
Foram desenvolvidos três aplicativos: AVSyncGen, AVSyncRead e
AVSyncAdjust. O primeiro (AVSyncGen) é responsável pela geração do sinal de teste
utilizado. O segundo (AVSyncRead) é responsável pela análise dos sinais audiovisuais
capturados. O terceiro (AVSyncAdjust) realiza modificações de sincronismo,
adiantando ou atrasando o áudio em relação ao vídeo. Todos utilizam para codificação
do áudio o formato PCM5 linear mono a 8 kHz / 8 bits e para codificação das imagens o
formato JPEG6 com 256 tons de cinza.
O fluxo de trabalho de um teste completo utilizando esses aplicativos consiste
em:
1. Gerar um sinal de teste apropriado com o aplicativo AVSyncGen
2. Transmitir este sinal de teste através de um servidor de streaming (e.g.
Darwin Streaming Server)
3. Receber o stream através de um software cliente (e.g. QuickTime Player)
5 PCM: Modulação por Código de Pulsos (Pulse-Code Modulation). 6 JPEG: Grupo de Especialistas Fográficos Reunidos (Joint Photographic Experts Group), em referência ao grupo que criou este formato.
11
4. Gravar um pedaço da janela de exibição do software cliente utilizando
um software capaz de capturar em vídeo a tela do computador
juntamente com o áudio do sistema (e.g. Screenium)
5. Analisar a gravação realizada utilizando o aplicativo AVSyncRead
O aplicativo AVSyncAdjust pode ser utilizado para introduzir erros de
sincronismo para testar os outros dois aplicativos desenvolvidos ou para compensar a
latência de um sistema de streaming.
A seguir será apresentada uma descrição mais detalhada do funcionamento dos
três aplicativos desenvolvidos.
3.3.1 - AVSyncGen
Este aplicativo se destina a gerar sinais de teste compatíveis com diferentes
sistemas de streaming. Para tanto, o usuário é solicitado a selecionar a taxa de quadros
por segundo e as dimensões da imagem em pixels. A partir dessas informações, um
roteiro do Scilab gera uma sequência de imagens e um áudio7, de acordo com o descrito
no tópico 3.1 - : é gerado um sinal senoidal de sincronismo de 1/8 Hz, a partir do qual é
gerado o áudio (através de modulação AM8 com uma portadora em 1 kHz) e a
sequência de imagens (com a luminância determinada pelo sinal de sincronismo com
um offset constante).
Em seguida o usuário é solicitado a informar onde deseja salvar o sinal de teste a
ser gerado. A sequência de imagens e o áudio gerados pelo Scilab são unidos pelo
QuickTime e salvos em um arquivo de vídeo, com o sinal de teste repetido algumas
vezes9.
7 A sequência de imagens e o áudio são gerados em uma pasta temporária que é excluída no final da execução do aplicativo. 8 Utiliza-se modulação AM DSB-FC (Amplitude Modulation, Double-Sideband Full Carrier) com modulação a 100%. 9 O arquivo gerado possui 64 segundos, por conter oito repetições do sinal de teste (que possui 8 segundos).
12
3.3.2 - AVSyncRead
Esse aplicativo se destina a analisar sinais de teste gravados através de sistemas
a serem avaliados quanto ao sincronismo de áudio e vídeo. Para tanto, o usuário é
solicitado a selecionar o arquivo que contém o sinal de teste a ser avaliado. Esse arquivo
aberto pelo QuickTime, cortado com a duração (9 segundos) um pouco superior à do
sinal de teste (8 segundos) e transformado em uma sequência de imagens e em um
áudio10. O QuickTime é utilizado ainda para descobrir a taxa de quadros por segundo do
arquivo analisado.
Em seguida um roteiro do Scilab recupera o sinal de sincronismo (senóide de 1/8
Hz) do áudio (através de demodulação AM: retificação e filtragem) e da sequência de
imagens (através da sequência de valores de luminância de um pixel arbitrário11
filtrada). A filtragem dos sinais de sincronismo do áudio e da sequência de imagens é
feita selecionando apenas um elemento das suas FFT12s correspondente a exatamente
1/8 Hz. Esses elementos são números complexos, com magnitude e fase. Dividir um
elemento pelo outro, equivale a dividir o módulo e subtrair a fase. Dessa forma a
diferença de fase (de -π a +π) pode ser mapeada no intervalo de diferenças de
sincronismo detectáveis (4 segundos atrasados a 4 segundos adiantados)13. A diferença
de sincronismo calculada é exibida em milissegundos para o usuário.
3.3.3 - AVSyncAdjust
Esse aplicativo se destina a adiantar ou atrasar o áudio em relação ao vídeo com
uma diferença estipulável. Para tanto o usuário é solicitado a selecionar um arquivo para
ajuste, além de informar a direção do ajuste ("adiantar" ou "atrasar" ou áudio em relação
ao vídeo) e o valor (diferença de sincronismo desejada, em milissegundos).
10 Idem à nota 7. 11 É utilizado apenas o pixel da extremidade superior esquerda da imagem. 12 FFT: Transformada Rápida de Fourier (Fast Fourier Transform) 13 (-π, +π] ==> (4 segundos atrasados, 4 segundos adiantados] Utiliza-se o vídeo como referência (portanto "atrasado" e "adiantado" aqui diz respeito ao áudio, em relação ao vídeo). Note-se que a detecção é periódica, portanto, por exemplo, 5 segundos atrasados equivale a 1 segundo adiantado.
13
O QuickTime é utilizado para separar áudio e vídeo14. Em seguida esses
elementos são cortados no início ou no fim do arquivo15 pela diferença desejada e são
novamente reunidos. A diferença efetiva de sincronismo é controlada pelo corte
realizado no início do arquivo (o corte realizado no fim é apenas para não "sobrar"
áudio sem vídeo ou vídeo sem áudio). Quando o elemento cortado no início do arquivo
é o áudio (no caso de "adiantar" o áudio) a diferença cortada poderia ter precisão melhor
que 1 milissegundo, devido à elevada taxa de amostragem do áudio, porém o
QuickTime utiliza uma escala particular de tempo para esse tipo de edição que pode
limitar a precisão à ordem de 1 milissegundo. Quando o elemento cortado no início do
arquivo é o vídeo (no caso de "atrasar" o áudio), este é cortado apenas em quadros
inteiros, portanto a precisão do corte está limitada16 pela duração do quadro (inverso da
taxa de quadros por segundo). De qualquer forma, a diferença efetiva de sincronismo
(em milissegundos) obtida pelo processamento é informada ao usuário ao final da
execução do aplicativo.
14 O áudio e vídeo separados são salvos em uma pasta temporária que é excluída no final da execução do aplicativo. 15 Para adiantar o áudio este é cortado no início do arquivo e o vídeo no final; para atrasar o áudio o vídeo é cortado no início do arquivo e o áudio no final. 16 Uma alternativa, quando se deseja "atrasar" o áudio do sinal de teste com maior precisão é, tirando vantagem da sua periodicidade a cada 8 segundos, adiantá-lo em 8 segundos menos a diferença desejada (e.g. "adiantar" 7 segundos equivale a "atrasar" 1 segundo).
14
Capítulo 4
Resultados Experimentais
4.1 - Teste 1: AVSyncGen + AVSyncRead
Esse teste se destina apenas a verificar que os dois aplicativos (AVSyncGen e
AVSyncRead) estão funcionando corretamente. Um arquivo de teste foi gerado pelo
AVSyncGen e analisado pelo AVSyncRead. A título de demonstração foram utilizadas
duas combinações de taxa de quadros por segundo e resolução da imagem: 15 quadros
por segundo com resolução de 320 x 240 (pixels) e 30 quadros por segundo com
resolução de 640 x 480 (pixels). Em ambos os casos o AVSyncRead relatou que o áudio
está sincronizado com o vídeo.
4.2 - Teste 2: AVSyncGen + AVSyncAdjust + AVSyncRead
Este teste se destina a verificar a acurácia dos três aplicativos (AVSyncGen,
AVSyncRead e AVSyncAdjust). Um arquivo de teste foi gerado pelo AVSyncGen,
processado pelo AVSyncAdjust e analisado pelo AVSyncRead.
Foi gerado pelo AVSyncGen um arquivo a 24 quadros por segundo com
resolução de 320 x 200 (pixels). No AVSyncAdjust foi selecionado adiantar o áudio
713 milissegundos em relação ao vídeo. O aplicativo informou ter adiantado o áudio
exatamente em 713 milissegundos. O AVSyncRead, por sua vez, informou que no
arquivo processado pelo AVSyncAdjust o áudio estava adiantado 714 milissegundos em
relação ao vídeo. A diferença encontrada está dentro do esperado, conforme explicado
no tópico 3.3.3 - .
15
Foi também gerado pelo AVSyncGen um arquivo a 25 quadros por segundo
com resolução de 768 x 576 (pixels). No AVSyncAdjust foi selecionado atrasar o áudio
2064 milissegundos em relação ao vídeo. O aplicativo informou ter atrasado o áudio em
2080 milissegundos. A diferença encontrada está dentro do esperado, conforme
explicado no tópico 3.3.3 - . O AVSyncRead informou que no arquivo processado pelo
AVSyncAdjust o áudio estava atrasado exatamente 2080 milissegundos em relação ao
vídeo.
4.3 - Teste 3: AVSyncGen + QuickTime Player + Screenium +
AVSyncRead
Este teste se destina a verificar a acurácia da combinação do QuickTime Player
com o Screenium e a repetibilidade desse tipo de teste. Um arquivo de teste foi gerado
pelo AVSyncGen, reproduzido pelo QuickTime Player, o vídeo e o áudio do
computador foram capturados pelo Screenium e o resultado analisado pelo
AVSyncRead.
Foi gerado pelo AVSyncGen um arquivo a 15 quadros por segundo com
resolução de 320 x 200 (pixels). O arquivo gerado foi reproduzido pelo QuickTime
Player enquanto era capturado pelo Screenium17. O arquivo de captura do Screenium foi
analisado pelo AVSyncRead, que informou que o áudio estava atrasado 33
milissegundos em relação ao vídeo. Em seguida o mesmo arquivo gerado pelo
AVSyncGen foi reproduzido novamente pelo QuickTime Player e capturado novamente
pelo Screenium. A análise com o AVSyncRead do novo arquivo de captura do
Screenium informou o mesmo resultado: o áudio estava atrasado 33 milissegundos em
relação ao vídeo. Esse atraso, embora indesejável, e embora demonstre que o conjunto
QuickTime Player e Screenium não garante sincronismo perfeito de áudio e vídeo entre
reprodução e/ou captura, ainda está dentro de limites aceitáveis, de acordo com o
critério exposto no tópico 2.2 - .
17 Para as capturas realizadas com o Screenium não é necessário capturar a imagem inteira, já que apenas o pixel da extremidade superior esquerda é utilizado. Nos testes realizados foi capturada uma área de 32 x 32 pixels do centro da imagem. Também não é necessário capturar a duração do arquivo inteiro, basta capturar mais de 9 segundos ao longo da reprodução. É possível utilizar este software no modo de demonstração (gratuito) para esta finalidade, já que a limitação imposta é o limite de tempo de captura em 30 segundos. As condições necessárias para o arquivo a ser analisado estão explicadas no tópico 3.3.2 - .
16
4.4 - Teste 4: AVSyncGen + AVSyncAdjust + QuickTime Player +
Screenium + AVSyncRead
Este teste se destina a reforçar o teste anterior, verificando mais uma vez a
acurácia da combinação do QuickTime Player com o Screenium e a repetibilidade desse
tipo de teste, agora introduzindo diferenças de sincronismo aleatórias.
O mesmo arquivo gerado pelo AVSyncGen para o teste anterior foi processado
pelo AVSyncAdjust gerando duas versões diferenciadas: uma com o áudio adiantado
3000 milissegundos e outra com o áudio atrasado 1000 milissegundos. As duas versões
foram reproduzidas pelo QuickTime Player e capturadas pelo Screenium. Os arquivos
gerados pelo Screenium foram analisados com o AVSyncRead, apresentando como
resultados, respectivamente, áudio adiantado 3038 milissegundos em relação ao vídeo e
áudio atrasado 942 milissegundos em relação ao vídeo. Portanto, em relação ao que
seria a análise dos arquivos gerados diretamente pelo AVSyncAdjust, no primeiro caso
o conjunto QuickTime Player e Screenium resultou em áudio adiantado 38
milissegundos em relação ao vídeo e no segundo em áudio adiantado 58 milissegundos
em relação ao vídeo. Essas diferenças já excedem os limites aceitáveis, de acordo com o
critério exposto no tópico 2.2 - . Além disso, esses resultados demonstram que a
repetibilidade também não pode ser garantida pelo conjunto QuickTime Player e
Screenium.
4.5 - Teste 5: AVSyncGen + Darwin Streaming Server + QuickTime
Player + Screenium + AVSyncRead
Este teste visa verificar a existência de problemas de sincronismo no sistema
Darwin Streaming Server.
17
Foi utilizado o mesmo arquivo gerado pelo AVSyncGen para o Teste 3. Este
arquivo foi transmitido pelo Darwin Streaming Server, reproduzido pelo QuickTime
Player (através do endereço de loopback do mesmo computador) e capturado duas vezes
pelo Screenium. Os arquivos das capturas realizadas foram então analisados pelo
AVSyncRead. O primeiro apresentou como resultado o áudio adiantado 32
milissegundos em relação ao vídeo. O segundo apresentou como resultado o áudio
adiantado 5 milissegundos em relação ao vídeo. O áudio neste teste parece
sistematicamente mais adiantado em relação ao vídeo que no Teste 3. Esses resultados,
porém, estão dentro da variação dos resultados obtidos nos testes com o QuickTime
Player e o Screenium tornando o teste inconclusivo devido à grande incerteza dos testes
envolvendo o QuickTime Player e o Screenium.
4.6 - Teste 6: AVSyncGen + AVSyncAdjust + Darwin Streaming Server
+ QuickTime Player + Screenium + AVSyncRead
Este teste se destina a reforçar o teste anterior, verificando mais uma vez a
existência de problemas de sincronismo no sistema Darwin Streaming Server, agora
introduzindo diferenças de sincronismo aleatórias.
Foram utilizados os mesmos arquivos gerados pelo AVSyncGen e processados
pelo AVSyncAdjust para o Teste 4. Estes arquivos foram transmitidos pelo Darwin
Streaming Server, reproduzidos pelo QuickTime Player (através do endereço de
loopback do mesmo computador) e capturados pelo Screenium. Os arquivos das
capturas realizadas foram então analisados pelo AVSyncRead. O primeiro resultou no
áudio adiantado 3061 milissegundos em relação ao vídeo (61 milissegundos mais
adiantado do que deveria). O segundo resultou no áudio atrasado 955 milissegundos em
relação ao vídeo (45 milissegundos mais adiantado do que deveria). Mais uma vez,
esses resultados estão dentro da variação dos resultados obtidos nos testes com o
QuickTime Player e o Screenium, e além disso, enquanto no primeiro arquivo o áudio
foi mais adiantado neste teste que no Teste 4, no segundo arquivo o áudio foi atrasado
em relação ao Teste 4. Portanto, se existe algum problema de sincronismo com o
Darwin Streaming Server este não é detectável com esta metodologia devido à grande
incerteza dos testes envolvendo o QuickTime Player e o Screenium.
18
Capítulo 5
Conclusão e Trabalhos Futuros
5.1 - Conclusão
É possível avaliar o sincronismo entre áudio e vídeo através de uma metodologia
diferenciada das soluções atualmente disponíveis no mercado. Um sinal de teste
desenvolvido para suportar elevadas taxas de compressão de áudio e vídeo pode se
prestar a essa finalidade, o que abre caminho para a avaliação de sincronismo em
streams de áudio e vídeo. Além disso, embora isso não tenha sido considerado neste
trabalho, esta metodologia pode também ser aplicada em banda base. Os aplicativos
desenvolvidos para geração do sinal de sincronismo, alteração de sincronismo e análise
de sincronismo funcionam com a precisão desejada. Porém a dependência de aplicativos
externos para complementar o sistema de teste completo limitou severamente a precisão
do conjunto.
19
5.2 - Trabalhos Futuros
Do ponto de vista de velocidade de execução, interface com o usuário e suporte
multiplataforma os aplicativos desenvolvidos poderiam ter um ganho substancial se
fossem desenvolvidos sem a utilização de roteiros (scripts) interpretados, através de um
código compilável (por exemplo em C++, e talvez com a biblioteca wxWidgets para
prover uma interface multiplataforma), porém com um custo mais elevado de
desenvolvimento. Além disso, para melhorar o resultado do sistema proposto é
necessário desenvolver uma solução completa e autônoma, com garantia de precisão, o
que eventualmente pode não ser possível utilizando somente software (sobretudo no que
diz respeito à captura do áudio e vídeo do computador). Uma alternativa pode ser usar
uma solução híbrida, com software e hardware (por exemplo capturando uma saída de
vídeo e uma saída de áudio do computador com um hardware externo). Utilizar
hardware pode inclusive permitir a análise em tempo real. Mantendo-se apenas a
solução em software, outra alternativa, caso não seja possível obter precisão na captura
do áudio e vídeo do computador, seria usar um software cliente recebendo o stream que
fosse capaz de gravar o stream recebido para análise. Embora pareça uma solução mais
fácil e mais precisa, essa opção limitaria o suporte a diferentes codecs e mecanismos de
transporte e autenticação, além de não garantir o resultado final do usuário, que na
prática poderia utilizar outros softwares clientes, que também podem interferir no
sincronismo, para assistir a um stream.
20
Bibliografia
[1] ATSC, Relative Timing of Sound and Vision for Broadcast Operations, Doc. IS-191, Washington, 2003. Disponível em: <http://www.atsc.org/standards/is_191.pdf>. Acesso em: 21 nov. 2009.
[2] OMNITEK, Measuring Audio & Video Delays Using OmniGen and OmniView. Disponível em: <http://www.omnitek.tv/images/stories/pdfs/support/avdelay1.pdf>. Acesso em: 21 nov. 2009.
[3] PIXEL, LipTracker Data Sheet 2009. Disponível em: <http://www.pixelinstruments.tv/pdf/Manuals/LipTracker%20Data%20Sheet%202009.pdf>. Acesso em: 21 nov. 2009.
[4] TEKTRONIX, Audio to Video Delay Corrector - AVDC100. Disponível em: <http://www2.tek.com/cmsreplive/psrep/13361/25W_13988_0_2008.05.15.16.22.39_13361_EN.pdf>. Acesso em: 21 nov. 2009.
21
Apêndice 1
Código Fonte
/Applications/AVSyncGen.app/Contents/Resources/Scripts/main.scpt
try # cabeçalho set version to "Beta 30-Nov-2009" display dialog "Versao " & version & " Autor: Luiz Fausto de Souza Brito Pré-Requisitos: Scilab 5.1.1 alpha 1 SIVP 0.5.0 QuickTime Pro" buttons {"OK"} default button {"OK"} with title "AVSyncGen" with icon
POSIX file "/Applications/AVSyncGen.app/Contents/Resources/applet.icns" giving up after 5
# escolhe taxa de quadros por segundo do vídeo set fps to choose from list {60, 50, 30, 25, 24, 15} with title "AVSyncGen" with prompt
"Quantos quadros por segundo do vídeo?" default items {15} if fps = false then error end if # escolhe largura da imagem set w to text returned of (display dialog "Qual a largura da imagem (em pixels)?" default
answer "320" with title "AVSyncGen") as number # escolhe altura da imagem set h to text returned of (display dialog "Qual a altura da imagem (em pixels)?" default
answer "240" with title "AVSyncGen") as number # passa os parâmetros selecionados para o Scilab através da área de transferência set the clipboard to (fps & " " & w & " " & h) as text # executa o script do Scilab que gera imagens e som do shell script "/Applications/scilab-5.1.1-alpha-1.app/Contents/MacOS/bin/scilab -f
/Applications/AVSyncGen.app/Contents/Resources/AVSyncGen.sce" # escolhe onde salvar o sinal de teste set out_dir to POSIX file (POSIX path of (choose folder with prompt "Onde deseja salvar
o sinal de teste?" default location path to the desktop)) # configura os caminhos para pastas e arquivos utilizados set temp_dir to POSIX file ((POSIX path of the (path to the home folder)) & "temp/") set audio_file to POSIX file ((POSIX path of temp_dir) & "audio.wav") set frame_file to POSIX file ((POSIX path of temp_dir) & "frame001.jpg") set out_file to POSIX file ((POSIX path of out_dir) & "AVSync.mov") # remove sinal de teste anterior, caso exista tell application "Finder" if exists out_file then do shell script ("rm " & POSIX path of out_file) end if end tell tell application "QuickTime Player"
22
# abre o QuickTime, caso não esteja aberto activate # fecha janelas eventualmente abertas close every window saving no # abre o arquivo de som, copia e fecha open audio_file tell document 1 select all copy close end tell # abre a sequência de imagens, insere o som, repete, salva e fecha open image sequence frame_file frames per second (fps as number) tell document 1 add repeat 3 times select all copy paste end repeat select all export to out_file as QuickTime movie using settings POSIX file
"/Applications/AVSyncGen.app/Contents/Resources/QTmovie.set"
close saving no end tell # fecha o QuickTime quit end tell # limpa a área de transferência set the clipboard to "" # remove a pasta temporária do shell script ("rm -r " & POSIX path of temp_dir) # exibe mensagem de conclusão display dialog "Geração de sinal de teste concluída com sucesso!" buttons {"OK"} default
button {"OK"} with title "AVSyncGen" with icon POSIX file "/Applications/AVSyncGen.app/Contents/Resources/applet.icns"
on error # exibe mensagem em caso de erro display dialog "Erro de processamento." buttons {"OK"} default button {"OK"} with title
"AVSyncGen" with icon stop end try
23
/Applications/AVSyncGen.app/Contents/Resources/AVSyncGen.sce
//desativa exibicao dos comandos no console e a paginacao, limpa e aloca a memoria mode(-1); lines(0); clear; stacksize ('max'); //desprotege as funcoes primitivas funcprot(0); //carrega biblioteca SIVP exec('/Applications/scilab-5.1.1-alpha-1.app/Contents/MacOS/share/scilab/contrib/sivp-0.5.0/loader.sce'); //cabecalho version = 'Beta 30-Nov-2009'; disp(''); disp(''); disp('AVSyncGen'); disp('Geracao de Imagens e Som do Sinal de Teste de Sincronismo'); disp('Versao ' + version); disp('Autor: Luiz Fausto de Souza Brito'); disp(''); disp(''); //configura pasta temporaria if fileinfo('~/temp')==[] then mkdir '~/temp'; end cd ~/temp; unix('rm *'); //recebe informacoes de taxa de quadros por segundo, largura e altura da imagem v = evstr(clipboard("paste")); //cria som do sinal de teste de sincronismo disp('Criando som...'); d = 8; sr = 8000; t_aud = 0:1/sr:d-(1/sr); carrier = sin(2*%pi*1000*t_aud); sync_aud = 0.5+sin(2*%pi*t_aud/d)/2; audio = carrier.*sync_aud; wavwrite(audio,sr,8,'audio.wav'); disp('Concluido!'); disp(''); //cria imagens do sinal de teste de sincronismo disp('Criando imagens... 0 %'); t_vid = 0:1/v(1):d-(1/v(1)); sync_vid = interpln([t_aud;sync_aud],t_vid); k = 0; for i = 1:v(1)*d, j=100*i/(v(1)*d); if int(j/10)>(k/10) then k = int(j); disp('Criando imagens... '+string(k)+' %'); end im = sync_vid(i)*ones(v(3),v(2));
24
name = sprintf('frame%03d.jpg',i); imwrite(im,name); end disp('Concluido!'); disp(''); //encerra quit;
25
/Applications/AVSyncRead.app/Contents/Resources/Scripts/main.scpt
try # cabeçalho set version to "Beta 30-Nov-2009" display dialog "Versao " & version & " Autor: Luiz Fausto de Souza Brito Pré-Requisitos: Scilab 5.1.1 alpha 1 SIVP 0.5.0 QuickTime Pro" buttons {"OK"} default button {"OK"} with title "AVSyncRead" with icon
POSIX file "/Applications/AVSyncRead.app/Contents/Resources/applet.icns" giving up after 5
# escolhe o sinal de teste para análise set in_file to POSIX file (POSIX path of (choose file with prompt "Qual sinal de teste
deseja analisar?" of type {"MooV"} default location (path to the desktop) without invisibles))
# configura os caminhos para pastas e arquivos utilizados set temp_dir to POSIX file ((POSIX path of the (path to the home folder)) & "temp/") set audio_file to POSIX file ((POSIX path of temp_dir) & "audio.wav") set frame_file to POSIX file ((POSIX path of temp_dir) & "frame") # remove pasta temporária anterior, caso exista, e a (re)cria tell application "Finder" if exists temp_dir then do shell script ("rm -r " & POSIX path of temp_dir) end if make new folder at the (path to the home folder) with properties {name:"temp"} end tell tell application "QuickTime Player" # abre o QuickTime, caso não esteja aberto activate # fecha janelas eventualmente abertas close every window saving no # abre o arquivo de teste para análise, coloca a taxa de quadros por segundo na
área de transferência, reduz o arquivo ao tamanho necessário, exporta imagens e som e fecha
open in_file tell document 1 if (type of track 1) = "vide" then set track_n to 1 else set track_n to 2 end if set the clipboard to (round ((count frames of track track_n) / (duration / time
scale))) as text select at 0 to (9 * time scale) trim export to frame_file as image sequence using settings POSIX file
"/Applications/AVSyncRead.app/Contents/Resources/IMseq.set"
export to audio_file as wave using settings POSIX file "/Applications/AVSyncRead.app/Contents/Resources/wave.set"
close
26
end tell # fecha o QuickTime quit end tell # executa o script do Scilab que analisa o sincronismo entre imagens e som do shell script "/Applications/scilab-5.1.1-alpha-1.app/Contents/MacOS/bin/scilab -f
/Applications/AVSyncRead.app/Contents/Resources/AVSyncRead.sce" # exibe mensagem de conclusão, com resultado recebido do Scilab pela área de
transferência display dialog ("Análise concluída com sucesso! O áudio está " & (the clipboard) & " em relação ao vídeo.") buttons {"OK"} default button
{"OK"} with title "AVSyncRead" with icon POSIX file "/Applications/AVSyncRead.app/Contents/Resources/applet.icns"
# limpa a área de transferência set the clipboard to "" on error # exibe mensagem em caso de erro display dialog "Erro de processamento." buttons {"OK"} default button {"OK"} with title
"AVSyncRead" with icon stop end try
27
/Applications/AVSyncRead.app/Contents/Resources/AVSyncRead.sce
//desativa exibicao dos comandos no console e a paginacao, limpa e aloca a memoria mode(-1); lines(0); clear; stacksize ('max'); //desprotege as funcoes primitivas funcprot(0); //carrega biblioteca SIVP exec('/Applications/scilab-5.1.1-alpha-1.app/Contents/MacOS/share/scilab/contrib/sivp-0.5.0/loader.sce'); //cabecalho version = 'Beta 30-Nov-2009'; disp(''); disp(''); disp('AVSyncRead'); disp('Avaliacao de Sincronismo'); disp('Versao ' + version); disp('Autor: Luiz Fausto de Souza Brito'); disp(''); disp(''); //configura pasta temporaria cd ~/temp; //recebe informacao de taxa de quadros por segundo fps = evstr(clipboard("paste")) //analisa sincronismo do som disp('Analisando sincronismo do som...'); [audio,sr,bits] = wavread('audio.wav'); d = 8; audio = audio(1:sr*8); AUDIO = fft(abs(audio)); SYNC_AUD = AUDIO(2); disp('Concluido!'); disp(''); //analisa sincronismo das imagens disp('Analisando sincronismo das imagens... 0 %'); k = 0; for i = 1:fps*d, j=100*i/(fps*d); if int(j/10)>(k/10) then k = int(j); disp('Analisando sincronismo das imagens... '+string(k)+' %'); end name = sprintf('frame%03d.jpg',i); im = imread(name); sync_vid(i) = double(im(1,1)); end SYNC_VID = fft(sync_vid); SYNC_VID = SYNC_VID(2); disp('Concluido!');
28
disp(''); //calcula a diferenca de sincronismo phi=atan(imag(SYNC_AUD/SYNC_VID),real(SYNC_AUD/SYNC_VID)); delay = round(4000*phi/%pi); if delay==0 then str = "sincronizado"; elseif delay>0 then str = "adiantado "+string(delay)+" ms"; else str = "atrasado "+string(-delay)+" ms"; end clipboard("copy",str); //exclui pasta temporaria cd ../; unix('rm -r ~/temp'); //encerra quit;
29
/Applications/AVSyncAdjust.app/Contents/Resources/Scripts/main.scpt
try # cabeçalho set version to "Beta 30-Nov-2009" display dialog "Versao " & version & " Autor: Luiz Fausto de Souza Brito Pré-Requisitos: QuickTime Pro" buttons {"OK"} default button {"OK"} with title "AVSyncAdjust" with icon
POSIX file "/Applications/AVSyncAdjust.app/Contents/Resources/applet.icns" giving up after 5
# escolhe o arquivo para ajuste set in_file to POSIX file (POSIX path of (choose file with prompt "Qual arquivo deseja
ajustar?" of type {"MooV"} default location (path to the desktop) without invisibles))
# escolhe direção do ajuste set dir to choose from list {"adiantar", "atrasar"} with title "AVSyncAdjust" with prompt
"Deseja adiantar ou atrasar o áudio em relação ao vídeo?" default items {"adiantar"}
if dir = false then error end if # escolhe a diferença a ser ajustada set dif to text returned of (display dialog "Qual a diferença de tempo desejada (em ms)?"
default answer "0" with title "AVSyncAdjust") as number # configura os caminhos para pastas e arquivos utilizados set temp_dir to POSIX file ((POSIX path of the (path to the home folder)) & "temp/") set video_file to POSIX file ((POSIX path of temp_dir) & "video.mov") set audio_file to POSIX file ((POSIX path of temp_dir) & "audio.wav") # remove pasta temporária anterior, caso exista, e a (re)cria tell application "Finder" if exists temp_dir then do shell script ("rm -r " & POSIX path of temp_dir) end if make new folder at the (path to the home folder) with properties {name:"temp"} end tell # move o arquivo de entrada para um arquivo temporário do shell script ("mv " & POSIX path of in_file & " " & POSIX path of video_file) tell application "QuickTime Player" # abre o QuickTime, caso não esteja aberto activate # fecha janelas eventualmente abertas close every window saving no # abre o arquivo de vídeo para ajuste, exclui o som e corta open video_file tell document 1 export to audio_file as wave if (type of track 1) = "vide" then set track_n to 2 else set track_n to 1 end if delete track track_n
30
set dur_vid to (1000 * duration / time scale) if dir = {"adiantar"} then select at 0 to (duration - ((round (dif * time scale / (1000 * (duration of
frame 2 of track 1)))) * (duration of frame 2 of track 1)))
else select at ((round (dif * time scale / (1000 * (duration of frame 2 of track
1)))) * (duration of frame 2 of track 1)) to duration
end if trim set (duration of frame 1 of track 1) to (duration of frame 2 of track 1) set dif_vid to (dur_vid - (1000 * duration / time scale)) end tell # abre o arquivo de som, exclui o vídeo, corta, copia e fecha open audio_file tell document 1 if (type of track 1) = "vide" then set track_n to 1 else set track_n to 2 end if delete track track_n set dur_aud to (1000 * duration / time scale) if dir = {"atrasar"} then select at 0 to (round (duration - (dif * time scale / 1000))) else select at (round (dif * time scale / 1000)) to duration end if trim set dif_aud to (dur_aud - (1000 * duration / time scale)) select all copy close end tell # insere o som no arquivo para ajuste, salva e fecha tell document 1 add select all export to in_file as QuickTime movie using settings POSIX file
"/Applications/AVSyncAdjust.app/Contents/Resources/QTmovie.set"
close end tell # fecha o QuickTime quit end tell if dir = {"adiantar"} then set dif_real to dif_aud else set dif_real to dif_vid end if # limpa a área de transferência set the clipboard to "" # remove pasta temporária do shell script ("rm -r " & POSIX path of temp_dir) # exibe mensagem de conclusão display dialog ("Correção concluída com sucesso! Processamento realizado: " & dir & " áudio em " & (round (dif_real)) & " ms.") buttons
31
{"OK"} default button {"OK"} with title "AVSyncAdjust" with icon POSIX file "/Applications/AVSyncAdjust.app/Contents/Resources/applet.icns"
on error # exibe mensagem em caso de erro display dialog "Erro de processamento." buttons {"OK"} default button {"OK"} with title
"AVSyncAdjust" with icon stop end try
Top Related