2014-05-22 6 views
1

J'ai travaillé sur l'utilisation d'OpenSL pour une application audio à faible latence pour Android. Jusqu'à présent, la latence la plus faible que j'ai réussi à atteindre est de 200ms sur un Samsung Galaxy S5 (toucher-à-son, mesuré en tapant et en enregistrant le son du clapet suivi du son de l'application). Je pense que je peux l'amener à 160ms en améliorant la logique de l'application interne. À l'heure actuelle, il y a jusqu'à 40ms de délai entre l'application qui reçoit le contact et le rappel pour cet audio. Je pense que c'est parce que je file constamment des tampons vides quand il n'y a pas d'audio. Est-ce une mauvaise pratique? Je reçois des artefacts audio quand j'essaie des approches qui ne font que se mettre en file d'attente quand il y a de l'audio pour une raison quelconque. Quoi qu'il en soit, ma question est, quelle est la latence la plus basse possible en utilisant OpenSL de toucher à la sortie audio sur l'un des plus récents appareils Android? (Je sais que cela diffère d'un périphérique à l'autre, mais je me demandais quel est le meilleur périphérique pour une faible latence s'il y en a un, et quelle est la valeur de cette latence la plus basse?Android: OpenSL latence la plus faible possible

Android: sound API (deterministic, low latency)

Le lien ci-dessus d'environ un an il y a qu'il affirme est autour de la gamme 180ms. Est-ce encore le plus bas possible pour OpenSL? La réponse recommandée dit que Music Synthesizer pour android obtient une "latence de sortie totale" de moins de 30 ms. Mais quand je le lance sur un Samsung Galaxy S5 il a une latence sonore de 200ms. A quoi correspond cette "latence de sortie totale"? Est-ce que je manque quelque chose?

Comment diminuer davantage la latence?

Merci pour toute aide que vous pouvez me donner! Edit: Je fais tout ce qui est indiqué ici Low-latency audio playback on Android sauf les instructions NEON ou SSE mais mon temps de traitement est inférieur aux 15% indiqués ici, donc cela ne devrait pas poser de problème. Je suis en train de mettre en file d'attente un tampon avec 2 courts métrages PROPERTY_OUTPUT_FRAMES_PER_BUFFER pour le son stéréo. Est-ce trop haut?

+0

Cette question est susceptible d'attirer des réponses anecdotiques basées sur des expériences personnelles avec un ensemble limité de dispositifs, plutôt que des réponses définitives qui sont manifestement bonnes ou fausses. Par conséquent, il ne semble pas vraiment approprié pour StackOverflow, car ce n'est pas un forum de discussion. Quoi qu'il en soit, les chiffres que vous citez semblent un peu élevés. En utilisant la même méthode de mesure, j'ai obtenu des temps inférieurs à 100 ms sur un XPeria Z alors que j'exécutais des tests de latence il y a environ un an et demi. – Michael

+0

Vous utilisez openSL? Y at-il un mode rapide que je dois activer? J'utilise le simplebufferedqueueplayer avec des shorts (PROPERTY_OUTPUT_FRAMES_PER_BUFFER * 2) dans le tampon mis en file d'attente et PROPERTY_OUTPUT_SAMPLE_RATE pour les données audio ainsi que le lecteur. J'utilise un son stéréo, c'est pourquoi le * 2 pour le nombre de courts métrages. La seule chose que je peux penser de ce que je ne fais pas est d'utiliser des instructions NEON ou SSE, mais mon temps de traitement est inférieur à 15% du temps de lecture et le délai est encore élevé. –

Répondre

3

Il semble que l'appareil que je suis en train de tester, le Galaxy S5 n'a pas android.hardware.audio.low-latency. Ce qui signifie que openSL ne peut pas utiliser la fast track avec elle et entraînera une latence élevée. C'est vraiment surprenant car l'appareil est assez récent et devrait donc supporter une nouvelle fonctionnalité comme celle-ci. Mais malgré tout ce qui est nécessaire pour avoir une faible latence dans mon application, il y aura une latence élevée sur l'appareil sur lequel je suis en train de tester. De l'android ndk openSL docs: "Ces améliorations sont disponibles via OpenSL ES pour les implémentations de périphériques qui revendiquent la fonctionnalité" android.hardware.audio.low_latency "Si l'appareil ne revendique pas cette fonctionnalité mais prend en charge le niveau API 9 (Version plate-forme Android 2.3) ou ultérieure, vous pouvez toujours utiliser les API OpenSL ES, mais la latence de sortie peut être plus élevée Le chemin de latence de sortie inférieur est utilisé uniquement si l'application demande un nombre de tampons de 2 ou plus et une taille de tampon et taux d'échantillonnage compatibles avec la configuration de sortie native du périphérique. "

Pour tous ceux qui se demandent si votre application est le problème. Assurez-vous de vérifier si le périphérique sur lequel vous testez fonctionne prend en charge cette fonctionnalité. Consultez également la section Performance de la (ndk) /docs/opensles/index.html et les liens dans la question

+0

thats décevant, bonne information comme Im envisageant d'acheter le S5 – HaveAGuess

+0

Il ne supporte pas OpenSL faible latence mais il peut y avoir d'autres façons de l'obtenir sur ces appareils que je ne suis pas au courant. –

0

Il existe un échantillon audio-echo, vous pouvez le vérifier pour voir si cela aide. Lorsque vous créez un lecteur pour un son rapide, certaines interfaces de traitement du signal ne sont pas prises en charge; Si vous demandez des interfaces non prises en charge, l'audio rapide sera désactivé même si vous demandez le taux d'échantillonnage par défaut du périphérique.L'exemple fonctionne sur android L et M [pas testé sur d'autres]

Questions connexes