Newsgroup: it.comp.software.divx
Titolo: Impostare ritardo audio su MP3 VBR

Avete mai provato a impostare un ritardo audio su uno stream MP3 VBR?
Io ci ho provato con un AVI con due stream audio, ma ne' mplayer ne'
il lettore stand-alone lo riproducono correttamente.
Ho risolto ugualmente, senza alcuna ricodifica (aggiungendo in testa
alle tracce un mp3 silenzioso della durata desiderata), tuttavia mi
chiedo cosa faccia in un caso analogo VirtualDubMod...

 chiedo cosa faccia in un caso analogo VirtualDubMod...
Io l'ho fatto sempre con VirtualDubMod e non ho mai riscontrato
problemi, almeno con mplayer (per quelle volte che l'ho usato). Il
lettore stand-alone non l'ho.
bye, giubbe

 problemi, almeno con mplayer (per quelle volte che l'ho usato).
a questo punto devo assolutamente sapere cosa fa VDubMod :-)
Che tu sappia, anche con gli audio VBR si limita a impostare
il valore del ritardo nel contenitore AVI, oppure fa
qualcos'altro (tipo aggiungere dati in testa al flusso audio)?

Frank Sinapsi ha scritto:

Questo lo ignoro completamente. Se hai tempo e voglia, però, puoi
leggerti i sorgenti... ^_^
bye

 leggerti i sorgenti... ^_^
no, casomai farei molto prima a fargli generare un paio di esempi e
osservare i risultati con un editore esadecimale :-)




adesso ho capito che la risposta alla mia domanda e' che VdubMod si
limita a modificare un campo dell'AVI, senza fare nient'altro.
Il mio errore e' che non avevo capito che, in caso di audio VBR,
cambia l'interpretazione del valore di quel maledetto campo.
Se voglio impostare 1 secondo (1000 ms) di ritardo, se l'audio e' CBR,
il valore da impostare e' 16*1000=16000 (in esadecimale 0x3e80).
Per impiegare meno tempo, ho imparato a impostare tale ritardo con
l'editor esadecimale: individuo a colpo d'occhio la posizione del
campo e rimpiazzo due zeri con il ritardo voluto (per 1 secondo
mettero' "80 3e").
Questo metodo pero' funziona solo per audio CBR.
Quando ho fatto la stessa cosa con audio VBR, non ha funzionato, ne'
con mplayer ne' con il lettore da tavolo.
Avevo ipotizzato che con VBR non fosse possibile, ma quando ho letto
che lo e', ho generato pochi frames con audio VBR (impostando un
ritardo di 1 secondo con mencoder) e sono andato a guardare cosa ci
aveva messo nel campo: "29 00 00 00", ovvero 41.
Ma che relazione c'e' tra 41 e 1 secondo?
Inoltre mencoder mi ha scritto:
--------------------------------------------
Setting audio delay to 0.984s.
--------------------------------------------
Perche' 0.984s ?
Non ha potuto usufruire di un grado di precisione sufficiente a
impostare 1 secondo esatto...
Se fosse il numero di frame video, sarebbe stato 25 (il framerate
e' 25 fps), invece ci ha messo 41... perche'?
Dato che 984/41 = 24 (esatto), sembra che ogni unita' stia per 24 ms;
quindi, se volessi impostare un ritardo di 200 ms, dovrei metterci 8,
e avrei un ritardo di 192 ms.
Ho provato e ci ha messo veramente 8 (08 00 00 00) e mi ha scritto
"Setting audio delay to 0.192s", quindi la regola parebbe giusta.
Pero' non ho mica capito perche' l'unita' di misura sia proprio
24 ms (e si possono impostare solo ritardi multipli di 24 ms).
Pazienza, per ora mi accontento di avere in qualche modo
risolto... :-)

 risolto... :-)
Quello che descrivi parrebbe il funzionamento di synchronizer che infatti
cambia il tempo al volo. Però deve esserci quancosa in più perchè a volte
tale programma non riesce a manetnere il ritardo impostato. Se dovesse solo
scrivere due byte non vedo dove possa essere il problema.
Riguardo al fatto dei 24ms, sinceramente non ne so nulla, ma mi hai messo
una certa curiosità...
bye
-- 
HomePage e FAQ: 
http://giubbe.altervista.org
Inutile scrivere in privato, non ricevo le email

 una certa curiosità...
ci sara' sicuramente una spiegazione, ma al momento mi sfugge.
Comunque, se in futuro ti capita di usare Synchronizer e vuoi
controllare quei due byte (in realta' e' un campo di 32 bit, quindi
quattro byte; avevo sbagliato a scrivere nel post precedente),
e' molto facile individuarli: aprendo il file con l'edito esadecimale,
puoi notare che nella parte iniziale dell'AVI ci sono alcune stringhe
del tipo "strlstrh"; queste sezioni sono tante quanti gli stream:
una per il video, caratterizzata dalla stringa "vids" = video stream,
le altre per gli audio, caratterizzate dalla stringa "auds"
(ce n'e' una diversa per ogni audio).
I quattro byte che contengono il ritardo si trovano 24 byte dopo
la stringa "auds" (o "vids" nel caso del video).
Nell'esempio qui sotto, ho racchiuso tale campo tra parentesi:
-----------------------------------------------------------------------------
000010f0  00 00 00 00 4c 49 53 54  8a 10 00 00 73 74 72 6c |....LIST....strl|
00001100  73 74 72 68 38 00 00 00  61 75 64 73 00 00 00 00 |strh8...auds....|
00001110  00 00 00 00 00 00 00 00  01 00 00 00 80 04 00 00 |................|
00001120  80 bb 00 00(29 00 00 00) 54 fc 02 00 c0 03 00 00 |.»..)...Tü..À...|
-----------------------------------------------------------------------------
Di solito questo campo contiene 0, ma qui c'e' "29 00 00 00" (41
in decimale), perche' ce l'ho messo io: avevo bisogno di un ritardo
di un secondo e l'audio e' VBR (se fosse stato CBR avrei dovuto
metterci "80 3e 00 00").
Dopo avere scritto il precedente post, ho masterizzato un film a
cui avevo impostato su entrambi gli audio il valore "29 00 00 00"
e verificato il comportamento del lettore stand-alone: tutto ok.
Si puo' osservare che i ritardi impostati in questo campo sono
sempre positivi. E se l'audio, invece di essere in anticipo,
fosse in ritardo? Anche se VirtualDubMod consente, nella
finestrina, di impostare un ritardo negativo (perche' l'audio
va anticipato), in realta' quello che fa e' di impostare il
ritardo non sull'audio, ma sul video, con una precisione a
livello dei frame video.
Se ci sono due tracce audio, in cui la prima e' in anticipo di
0.2 s sul video e l'altra in ritardo di 0.2 s, la soluzione e'
di impostare un ritardo di 0 sul secondo audio, un ritardo di
0.2 secondi sul video, e un ritardo di 0.4 s sul primo audio.

 ci sara' sicuramente una spiegazione, ma al momento mi sfugge.
ok, ho trovato come escono fuori i 24 ms.
E' spiegato in questa pagina:
http://virtualdub.com/blog/pivot/entry.php?id=27
che suppongo abbia scritto l'autore di VirtualDub
---------------------------------------------------------------
The start (dwStart) of the stream determines when the first sample in the
stream starts. A start value of 2 for a 25 sample/sec stream would mean 80ms
of dead time before the first sample starts. Generally this is filled in by
extending the first sample backwards in time. VirtualDub does not yet support
non-zero start values. (I need to fix this.)
---------------------------------------------------------------
Il sample rate di uno stream di un AVI e' il rapporto tra i due
campi dwRate e dwScale, che sono memorizzati negli 8 byte
precedenti al campo dwStart.
Quindi, nell'esempio che avevo per le mani ieri:
-----------------------------------------------------------------------------
000010f0  00 00 00 00 4c 49 53 54  8a 10 00 00 73 74 72 6c |....LIST....strl|
00001100  73 74 72 68 38 00 00 00  61 75 64 73 00 00 00 00 |strh8...auds....|
00001110  00 00 00 00 00 00 00 00  01 00 00 00 80 04 00 00 |................|
00001120  80 bb 00 00 29 00 00 00  54 fc 02 00 c0 03 00 00 |.»..)...Tü..À...|
-----------------------------------------------------------------------------
dwRate = 80 bb 00 00 = 0xbb80 = 48000
dwScale = 80 04 00 00 = 0x480 = 1152
Quindi il ritardo impostato (0x29 = 41) equivale a:
41 / samplerate = 41 * dwScale / dwRate = 41*1152/48000 = 0.984 s
Quindi l'unita' di misura non e' sempre 24 ms, ma di volta in volta
bisogna leggere i valori dwScale, e dwRate, e calcolarne il rapporto.
E questo e' tutto...
sperando che non ci siano altre generalizzazioni...

 E questo e' tutto...
Spettacolare.
Fino ad ora ho sempre aggiunto il tempo che serviva di silenzio sullo
stream audio che non era sincronizzato (demuxandolo e poi rimuxandolo),
ma ora mi sa che convenga imparare  ad usare un editor esadecimale.
Il fatto è che tutti quei numeri in fila mi spaventano! ;)
-- 
Saluti, Kap - 
www.lordkap.it
 - ¥'s Fan #01 - 
www.pianetalibri.com
 - VCC
Il tempo tutto toglie e tutto dà; ogni cosa si muta, nulla s'annichila.
Giordano Bruno

 ma ora mi sa che convenga imparare  ad usare un editor esadecimale.
prima di pranzo ho scritto un programmino semplicissimo che imposta
i ritardi al volo, cosi' non ho piu' bisogno di usare l'editor
esadecimale.
Purtroppo al momento non posso compilarlo per windows (non ho un
cross compiler, devo assolutamente reinstallare win98se su una
partizioncina, e reinstallare l'ambiente di sviluppo cygwin, e
ricompilare un sacco di librerie... tutto cio' mi richiedera'
abbastanza tempo e non so quando mi decidero' a farlo... non c'e'
qualche anima pia, esperta di ambiente cygwin che vorrebbe darmi
una mano?)
Comunque ho appena messo la versione linux sulla mia pagina,
lo sto scrivendo su un post separato dal soggetto
"[linux] utility per impostare ritardi su file AVI".

 ma ora mi sa che convenga imparare  ad usare un editor esadecimale.
mi sono dimenticato di dire una cosa importante! :-)
Prova a impostare il ritardo con VDubMod (finestra "interleaving"...
nel campo piu' in basso ti permette di impostare il ritardo in
millisecondi).
Poi prova a vedere se il tuo lettore stand-alone lo rispetta.
Io ho scoperto da poco che il mio (con il firmware che uso ora)
lo rispetta molto bene. E ho saputo che anche altri lettori lo
rispettano, e altri invece no.
Quindi ti conviene provare.
Se qualcosa non ti e' chiaro fammi sapere.

 Purtroppo al momento non posso compilarlo per windows
Se mi spieghi "come ad un bambino di 4 anni" come posso farlo,
volentieri! ;)
-- 
Saluti, Kap - 
www.lordkap.it
 - ¥'s Fan #01 - 
www.pianetalibri.com
 - VCC
Questa profonda avversione che il vizio dovrebbe ispirare alle anime
virtuose. - Molière

 millisecondi).
Se mi ricapita, proverò così.
-- 
Saluti, Kap - 
www.lordkap.it
 - ¥'s Fan #01 - 
www.pianetalibri.com
 - VCC
Qualche volta il coraggio si presenta soltanto nel momento in cui non
si vede altra via d'uscita. - William Faulkner

 volentieri! ;)
temo che sia un lavoro troppo lungo...
Per prima cosa dovresti installare Cygwin ( 
http://cygwin.com
 ),
e gia' l'installazione non e' per niente facile perche' occorre
sapere quali pacchetti selezionare per mettere in piedi l'ambiente
di sviluppo necessario per compilare tutto cio' che serve...
Per andare sul sicuro potresti installare tutto, ma in tal modo
l'ambiente ti portera' via molti GB di spazio disco.
Ma i problemi piu' grossi sorgono durante le compilazioni perche'
nel 99% delle volte c'e' qualcosa che non va per il verso giusto e
occorre individuare la causa dei problemi e le relative soluzioni.
Per compilare quel programmino, occorre prima compilare il
compilatore :-) e questo e' facile perche' ti fornirei il codice
del compilatore in C (anche se il vero sorgente e' scritto nello
stesso linguaggio che compila), poi occorre compilare:
- il run time support del linguaggio (anche questo e' facile);
- tutte le librerie che servono al linguaggio e che attualmente
  non sono ancora distribuite gia' compilate per cygwin (e questo
  puo' essere molto difficile, perche' potrebbe essere necessario
  fare lunghi noiosi debugging e modifiche per riadattarli a tale
  ambiente...).
Insomma, fidati, e' un lavoro troppo lungo e complesso.
Probabilmente lo faro' se e quando verra' un momento opportuno.

 temo che sia un lavoro troppo lungo...
Mi hai spaventato! ;P
Prima o poi dovrò pure farlo, però, se voglio cominciare ad imparare a
programmare, ma credo che lo farò più seriamente quando tornerò
all'università a lezione di programmazione. ;)
-- 
Saluti, Kap - 
www.lordkap.it
 - ¥'s Fan #01 - 
www.pianetalibri.com
 - VCC
L'applauso è una ricevuta, non una cambiale. - Artur Schnabel

 all'università a lezione di programmazione. ;)
Se installi cygwin fammi sapere. Come esercizio potresti compilare
una versione recente "ffmpeg", creando anche le dll di libavcodec,
libavformat ecc.
Comunque, se voi iniziare a programmare in C con un sistema di
sviluppo open source per windows, Cygwin non e' la sola possibilita',
c'e' almeno anche Mingw ( 
http://www.mingw.org
 ), che e' preferibile
perche' ti permette di ottenere eseguibili che non hanno bisogno
di un run time support non open source (come cygwin).

 di un run time support non open source (come cygwin).
Credo che di Mingw abbia scaricato praticamente tutto, ma poi non ho mai
avuto il tempo (coraggio) di mettere in pratica l'insano gesto.
Ma in futuro, chissà...
-- 
Saluti, Kap - 
www.lordkap.it
 - ¥'s Fan #01 - 
www.pianetalibri.com
 - VCC
I primi sbagli sono di quelli che li commettono, i secondi di quelli che
glielo permettono. - Proverbio inglese