Pergunta

Eu quero reproduzir um MP3 em vez de um arquivo descompactado usando RemoteIO / AudioUnit. Usando arquivos descompactados, obviamente, usa espaço em disco longe demais (30MB vs 3MB para mp3).

Este é mesmo possível? Se assim for, você pode fornecer um pouco headstart código?

Graças um milhão.

Foi útil?

Solução

Sim, é possível. Mas isso requer o uso da API de áudio múltiplas e vários segmentos.

Devido às restrições de tempo real da Unidade de áudio fio tampão de retorno de chamada, você terá que fazer a conversão de arquivos compactados para amostras PCM matérias fora do callback Unidade de áudio. Você poderia usar estendidas Serviços arquivo de áudio ou AVAssetReader para fazer a conversão para amostras não comprimidas fora do callback Unidade de áudio. No entanto, você não precisa para descompactar o arquivo inteiro de uma vez. Um buffer descompactado curto de uma fração de segundo, provavelmente, fazer, desde que você mantenha preenchê-lo muito à frente da Unidade de áudio de chamada de retorno tampão taxa de consumo. Isto pode ser feito de um fio impulsionado temporizador separado que monitores tampão consumo, e descomprime áudio apenas o suficiente em conformidade, talvez em um tampão de anel ou circular FIFO.

O que você vai acabar com será semelhante a uma reescrita da camada API de fila de áudio, mas com mais personalização.

Outras dicas

Como de baixo nível que você quer ir? Você pode usar a API AudioHardware:

err = AudioDeviceAddIOProc(deviceID, ioProc, self);

e em sua IOProc preencher os buffers mesmo, escutar alterações de hardware, e lidar com segmentação em tempo real e um monte de outras coisas de baixo nível.

Eu estou supondo que você já está decodificar os dados de mp3 com AudioConverter e saber como fazer isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top