Newsgroup: it.comp.programmare.win32
Titolo: AVIFile: perche` mi si sovrappongono stream audio e video?

Ciao a tutti, sto scrivendo un programma di cattura audio/video basato su 
AVICap, ma utilizzando capCaptureSequenceNoFile e gestendo a mano la parte 
di compressione e salvataggio nel file .AVI.
Il video e` gia` a punto. Il problema e` che una volta aggiunta la parte che 
crea anche lo stream audio, la riproduzione di quello video si interrompe 
dopo un secondo o due.
In pratica:
1) Apro un file con AVIFileOpen() (con diritti di scrittura/creazione)
2) Creo uno stream di tipo streamtypeVIDEO con AVIFileCreateStream();
3) Lo inizializzo con AVIStreamSetFormat()
4) Ci scrivo dentro i frames con AVIStreamWrite().
Funziona tutto a meraviglia. Adesso ho aggiunto lo step 2 per un secondo 
stream, di tipo streamtypeAUDIO, nello stesso file precedentemente aperto 
con AVIFileOpen(). Lo inizializzo con AVIStreamSetFormat() passando la 
WAVEFORMATEX di acquisizione, e poi ci scrivo dentro con AVIStreamWrite().
Come dicevo, il filmato che ottengo ha l'audio PERFETTAMENTE FUNZIONANTE ma 
il video si inceppa dopo qualche decina di fotogrammi. Acquisito da solo, il 
video funziona benissimo. Ogni volta che scrivo un frame (o un blocco audio) 
incremento il contatore del numero di sample che sto scrivendo. Ovviamente 
ho due contatori separati per audio e video. Ho il sospetto che non ci 
possano essere numeri di sample uguali fra i due stream, pero` non ha 
neanche tanto senso perche` se sono due stream separati, dovrebbe andare 
bene cosi`.
Qualcuno ha una idea? Aggiungo che l'effetto che ho descritto lo ottengo se 
apro il filmato con media player, mentre con vlc il video funziona bene e 
non si sente nulla.
Ciao e grazie!
Alessandro

non si sente nulla.
Hai testato il video con GSpot?

 Hai testato il video con GSpot?
Secondo lui e` tutto ok.
Ciao! 

 comprimi nulla?
Aggiornamento: sono riuscito a farlo funzionare, ma ho qualche interrogativo 
residuo.
Ho imboccato la strada giusta quando, grazie ad un PC piu` veloce, mi sono 
accorto che il video non andava a scatti per poi bloccarsi, ma veniva 
riprodotto AD UNA VELOCITA` 2X o 4X a seconda delle impostazioni di cattura 
audio, piu` precisamente a seconda del numero di canali (mono o stereo) e i 
bit (8 o 16) per campione. Anche la durata veniva riportata in modo erroneo 
(ma concorde), ovvero un filmato da 10 secondi poteva diventare da 20 o 40 a 
seconda del numero di bit per campione.
Al momento di chiamare AVIFileCreateStream, impostavo queste variabili nel 
seguente modo:
  strHdr.dwScale = m_wih.nBlockAlign;
  strHdr.dwRate = m_wih.nSamplesPerSec;
Ebbene, funzionava solo se nBlockAlign era == 1, ovvero MONO a 8 BIT.
Se == 2 avevo riproduzione video a 2X, e via discorrendo. Ho due situazioni 
in cui il problema e` apparentemente risolto: la prima consiste nel caricare 
sempre 1 in dwScale; la seconda consiste in questo:
  strHdr.dwScale = m_wih.nBlockAlign;
  strHdr.dwRate = m_wih.nAvgBytesPerSec;
...ovvero quello che conta e` che il rapporto fra le due variabili sia pari 
a nSamplesPerSec, che e` poi quello che succede nel primo caso visto che 
forzo dwScale = 1. Infatti, essendo che (per il momento) l'audio e` 
non-compresso e di tipo PCM, nAvgBytesPerSec altro non e` che il prodotto 
fra nSamplesPerSec e nBlockAlign.
Qualche considerazione? (il prossimo step sara` cercare di implementare la 
compressione audio, cosa che potra` facilmente far saltare fuori nuovi 
casini se la cosa spiegata qui sopra dovesse rivelarsi poco ortodossa).
Ciao e grazie!

Qualche considerazione?
Nella AVISTREAMINFO leggo infatti:
"Time scale applicable for the stream. Dividing dwRate by dwScale
gives the playback rate in number of samples per second."