O código fonte de duas aplicações simples mas funcionais (trab1.zip - 210Kb). Uma utilizando a Win32 API diretamente e outra usando IUP.
Em ambos os casos utilizamos os módulos AVIFile, WaveOut e DrawDib da biblioteca VFW (Video for Windows) da seção de multimídia da Win32 API.
O mecanismo de sincronia do som com vídeo já está implementado e sugiro que não seja modificado. Mesmo que não haja som no arquivo AVI o sincronismo funcionará.
O formato AVI segue a especificação de um arquivo RIFF (resource information file format) do Windows. Mas as funções AVIFile do VFW nos permitem acessar o formato de uma maneira mais transparente incluindo a descompressão do vídeo.
Nele podemos na realidade armazenar vários tipos de informação diferentes. O exemplo "aviinfo" que acompanha o arquivo de distribuição do trabalho mostra isso. Inclusive pode armazenar várias seqüencias de vídeo e som. No trabalho estaremos lendo apenas a primeira seqüência de cada tipo.
Cada seqüência é chamada de "Stream" e pode estar compactada com qualquer método de compressão. Basta que esse método (ou codec) esteja instalado no sistema. Assim pode ocorrer do vídeo ser compactado em um sistema e não conseguir ser reproduzido em outro pela falta do codec.
O maior problema de portabilidade do formato AVI é a falta de codecs para outros sistemas que não o Windows.
O objetivo do trabalho é se familiarizar com os mecanismos de reprodução de vídeo em Windows. E usá-los para controlar melhor a reprodução de um vídeo. O programa não deve ter diálogos complicados, nem controles de botões para o vídeo. Apenas um menu de contexto (right click) com as opções pedidas e suas respectivas teclas de atalho. Os diálogos necessários podem usar a MessageBox.
Independente do que estiver implementado no código fornecido a aplicação deverá criar uma janela com o tamanho de toda a tela (full screen).
Assim que o programa é executado ele verifica se um arquivo foi passado na linha de comando, caso contrário mostra o diálog de seleção de arquivo. Se não foi selecionado nenhum arquivo o programa termina. Se o arquivo selecionado apresentou erro na abertura uma mensagem informa o erro e retorna para o diálogo de seleção de arquivo. No caso de já existir um arquivo aberto e o diálogo cancelar permanece o arquivo anterior.
A visualização do vídeo deve ser com o tamanho atual no centro da tela. [Opcionalmente pode-se mostrá-lo ocupando a tela toda, mas sem deformar. Optionalmente pode-se fornecer algumas opções de zoom. Nesse caso se o vídeo ficar maior que a tela pode-se usar click+drag do mouse para mover a imagem para até as bordas. Opcionalmente pode aceitar arquivos via Drag&Drop.]
Deverão ser feitas as seguintes estatísticas:
número real de quadros/segundo
número de quadros perdidos
tempo médio, máximo e mínimo para ler cada quadro (logo antes e depois da aviaudioMessage)
tempo médio, máximo e mínimo para desenhar cada quadro (logo antes e depois da DrawDib)
tempo médio, máximo e mínimo para ler o som (logo antes e depois da AVIStreamGetFrame)Para a contagem do tempo sugiro o uso da função GetTickCount.
Mostrar, se desejado pelo usuário, um feedback textual com a contagem de tempo sobre a janela no formato: 00:00:00:00 (HH:MM:SS:FF - hora:minuto:segundo:frame). E junto um feedback da acão sendo executada "Play", "Fast Forward", "Rewind", "Pause"... [Opcionalmente esse segundo feedback pode ser feito independente da opção do usuário com um temporizador de alguns segundos apenas.]
O som só deve ser reproduzido quando em "Play". [Opcionalmente pode colocar uma opção em que o usuário escuta o som enquanto avança ou retroçede.]
Deverão existir 6 controles do vídeo: "Play/Pause" e "Stop" (Pause em 00:00); "Previous" e "Next Frame" (só quando em "Pause"); "Rewind" e "Fast Forward" (só quando em "Play"). [Opcionalmente pode tocar para tráz "Shift+Space", ir para o final "Shift+Enter", "Shift+"-"" diminui a velocidade de reprodução em uma fração do número de quadros/segundo, "Shift+"+"" aumenta a velocidade de reprodução da mesma forma. "Shift+Esc" volta para o modo normal de reprodução.]
Deve haver uma opção para visualizar informações resumidas sobre o vídeo. E uma opção para ver informações sobre o trabalho: AVI Player 1.0, nome do autor e data.
Você deve ainda escolher o toolkit de interface com o usuário. E organizar o código do módulo principal.
[Opcionalmente poderíamos ter um menu que mostrasse as outras seqüências de vídeo e som no arquivo.]
Os módulos opcionais só devem ser implementados depois do término de todo o trabalho incluindo a documentação. Os módulos opcionais podem contar pontos extras.
O primeiro item é apenas decorativo e deve estar desativado.
AVI Player ---------- File Open...\tCtrl+O File Info... ---------- View -> Counter Control -> Play/Pause\tSpace Stop\tEnter ----------- Previous Frame\t{Left} Next Frame\t{Right} ----------- Rewind\t{LessThan} Fast Forward\t{GreaterThan} ---------- Statistics... About... Exit\tEscSubstitua o texto entre chaves pelo caracter da tecla correspondente.
Menu para os módulos opcionais:
AVI Player ---------- File Open...\tCtrl+O File Info... ---------- View -> Counter ----------- Zoom...\t Inc Zoom\t+ Dec Zoom\t- ----------- Fit Full Screen Control -> Play/Pause\tSpace Stop\tEnter ----------- Previous Frame\t{Left} Next Frame\t{Right} ----------- Rewind\t{LessThan} Fast Forward\t{GreaterThan} ----------- Frame Rate...\t Inc Frame Rate\tShift+"+" Dec Frame Rate\tShift+"-" Forward/Backward\tShift+Space ---------- Statistics... About... Exit\tEsc
Retorna para a página do curso: INF1378.