Que tipo de buffer devo implementar para um dispositivo de áudio de fluxo unidirecional?

8

Estou trabalhando em um projeto em que os dados de áudio são transmitidos para um dispositivo. Os dados de áudio são codificados via opus e transmitidos com cargas úteis de 20 ms por vez. A transmissão é feita via TCP para evitar completamente a perda de pacotes. O objetivo do streaming é ter o mais próximo possível do streaming de áudio ao vivo, sem perda de áudio ou tremulação.

Atualmente, o que acontece em conexões mais lentas com a Internet, o áudio pode tremer um pouco. Atualmente, não estou usando nenhum buffer, mas o objetivo é poder ter o mais próximo possível da "transmissão ao vivo", mas ao mesmo tempo eliminando a instabilidade.

Examinei os buffers de jitter, e parece que os buffers de jitter também devem lidar com atrasos nas duas extremidades, para que ambas as extremidades estejam o mais sincronizadas possível, o que parece um exagero para a minha situação. Receio que, se eu criar um tamanho de buffer estático, ele removerá o aspecto de transmissão ao vivo, se isso não for necessário.

Então, isso me deixa com algumas perguntas, que são de alguma forma relacionadas.

  1. Qual é um bom método ou algoritmo para detectar o comprimento do buffer?
  2. Qual é a melhor maneira de começar a alimentar dados para o decodificador na extremidade do receptor? Quando o buffer atingir uma certa quantidade de milissegundos cheio, ele começará a alimentar dados em cargas úteis de 20 ms?
  3. Atraso na reprodução se o buffer ficar insuficiente?
  4. O buffer terá bytes ou duração de tempo?

Muito obrigado!

Mikey A. Leonetti
fonte
1
Quão vivo tem que ser, realmente? Mesmo se você tivesse um buffer de 10 segundos, alguém notaria? Alguns programas de TV ao vivo demoram quase tanto tempo por motivos de controle de conteúdo (por exemplo, palavrões).
Robert Harvey
1
"O streaming é feito via TCP para evitar completamente a perda de pacotes." - O TCP não evita a perda de pacotes, funciona em torno da perda de pacotes.
precisa saber é o seguinte

Respostas:

1

Depende inteiramente da taxa de transferência da sua rede - se você pode manter um único segundo de dados preenchidos, é tudo o que precisa! Obviamente, você precisa determinar por quanto tempo sua rede vai gaguejar e deixar de preencher o buffer. Teste e veja.

Caso contrário, pode ser mais fácil configurar o tamanho do buffer, as redes rápidas podem ter um segundo de buffer (ninguém notará o áudio 1 segundo após a captura) e as redes lentas de alta latência ou baixa taxa de transferência podem armazenar mais buffer. Você poderá redimensionar seu buffer durante a reprodução, se ele esvaziar completamente, mas é mais provável que você gagueje a reprodução continuamente nesse caso.

Geralmente, você só atrasa a reprodução se o buffer se esvazia completamente. Não faz sentido ter um buffer se você não o usar.

Se o seu áudio for pacotes de 20 ms, tamanho == tempo.

gbjbaanb
fonte