Domanda

Come posso implementare la ricerca (funzione sequenza temporale) in un audio in streaming su iPhone?

Il metodo AudioFileStreamSeek accetta l'offset di byte da cui voglio iniziare la ricerca. Voglio essere in grado di ottenere la posizione corrente dell'mp3 in riproduzione e consentire all'utente di tornare (cercare) nella stessa posizione in un secondo momento.

Ma non sono riuscito a trovare alcun modo per conoscere il numero di byte che hanno già giocato. Posso scoprire il numero di byte che sono stati trasmessi in streaming. Ma non riesco a scoprire quanti byte sono stati riprodotti. Sto usando l'esempio dello streaming audio di Matt Gallagher come base.

Qualsiasi aiuto è molto apprezzato.

Grazie.

Potrebbe essere solo in grado di trovare una soluzione. La documentazione di AudioFileStreamSeek dice

  

Dopo aver chiamato questa funzione, il   il parser assume i dati successivi passati a   la funzione AudioFileStreamParseBytes   inizia dall'offset di byte restituito   in outAbsoluteByteOffset   parametro.

Come lo facciamo? Dovremmo usare il parametro Http Range? Se inviamo l'offset di byte a Range, funzionerà come previsto? E come devo cancellare i byte esistenti nel buffer per evitare che due stream vengano riprodotti insieme?

Qualsiasi aiuto è stato molto apprezzato. Grazie.

È stato utile?

Soluzione

AudioFileStreamSeek funziona con i pacchetti, non con il numero di byte. Quindi, ciò di cui hai davvero bisogno per tracciare è il conteggio dei pacchetti.

Il metodo MyEnqueueBuffer nel codice di Matt è il punto in cui i buffer vengono inviati ad AudioQueue per la riproduzione. Prendi i pacchetti riempiti e incrementa la tua variabile indice prima che i pacchetti riempiti siano reimpostati su 0:

myData.absolutePackets = myData.absolutePackets + myData- > packetsFilled;

Il mio problema è che non riesco a implementare AudioFileStreamSeek correttamente anche con questo valore. Quindi, se hai un codice di esempio di una ricerca di lavoro con il codice di Matt, ti preghiamo di condividere.

Grazie!

Altri suggerimenti

Non ho davvero provato l'API AudioFileStream per questo (ne abbiamo creato uno nostro internamente), ma ecco alcune cose di cui devi occuparti.

Supponendo che tu non abbia problemi a cercare casualmente il flusso di byte, allora devi continuare a monitorare la relazione tra il numero di frame MP3 e la posizione assoluta del flusso di byte, proprio come dice Paul. Presumo che tu possa farlo nel tuo AudioFileStream_PacketsProc chiamando AudioFileStreamSeek lungo la strada.

Ecco la parte più complicata. Quando si esegue una ricerca casuale, è necessario ripristinare gli stati interni di AudioFileStream. Perché potrebbe essere in uno stato intermedio aspettarsi che i byte successivi in ??arrivo completino il frame corrente. Non sono sicuro se puoi semplicemente alimentare gli zeri per saltare il frame corrente e ricominciare (che devi provare, poiché non vedo nulla come AudioFileStreamReset nell'API; tuttavia la coda audio stessa avere la funzione di ripristino che è possibile ripulire il frame già in coda). In ogni caso devi occuparti anche del tuo AudioFileStream_PacketsProc perché analizzerai una parte del flusso di byte di cui hai già tenuto traccia.

Nota che non puoi semplicemente trovare l'inizio di un frame MP3 facendo affidamento sul secondo e sul bitrate. Anche con un flusso MP3 a velocità non variabile, ci possono essere dei pad ogni pochi fotogrammi. Quindi le informazioni più accurate provengono ancora dal parser.

Dovrei aggiungere rapidamente che un altro modo di fare una ricerca casuale è semplicemente "cache". (archivia) i pacchetti analizzati se non stai riproducendo un flusso veramente lungo e grande. L'indice del frame può essere calcolato dalle informazioni sull'intestazione del frame. Per MP3 non VBR, i frame al secondo sono una costante (ad es. 44100/1152 = 38.28125 frame al secondo per MP3 stereo non VBR a 44.1 kHz; controlla le specifiche MP3 per il motivo per cui è così).

puoi usare AudioQueueStart con il mSampletime del luogo che vuoi cercare?

quindi basta interrompere il gioco .... e iniziare con un tempo di campionamento diverso? [basta prendere il tempo di campionamento corrente e manipolarlo secondo ciò che è necessario?]

inDeviceStartTime L'ora in cui dovrebbe iniziare la coda audio.

Per specificare un'ora di inizio relativa alla linea temporale del dispositivo audio associato, utilizzare il campo mSampleTime della struttura AudioTimeStamp. Utilizzare NULL per indicare che la coda audio deve iniziare il prima possibile.

Valore restituito Un codice risultato. Vedi & # 8220; Codici risultato coda audio. & # 8221;

Discussione Se il dispositivo audio associato non è già in esecuzione, questa funzione lo avvia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top