2009-03-16 7 views
2

en flux continu Comment puis-je mettre en œuvre la recherche (fonction timeline) dans un audio diffusé en continu sur l'iPhone?iPhone - recherche audio

La méthode AudioFileStreamSeek prend dans l'octet décalé par rapport à ce que je veux commencer à chercher. Je veux être en mesure d'obtenir la position actuelle du mp3 qui joue et laisser l'utilisateur revenir (chercher) à la même position à un moment ultérieur.

Mais je ne pouvais pas trouver un moyen de connaître le nombre d'octets qui ont déjà joué. Je peux trouver le nombre d'octets qui ont été diffusés. Mais ne peut pas savoir combien d'octets ont été joués. J'utilise l'exemple de streaming audio de Matt Gallagher comme base.

Toute aide est grandement appréciée.

Merci.

Pourrait juste être capable de trouver une solution. documentation AudioFileStreamSeek dit

Une fois que vous appelez cette fonction, l'analyseur suppose que les prochaines données transmises à la AudioFileStreamParseBytes fonction commence à partir de l'octet offset renvoyée dans le paramètre outAbsoluteByteOffset .

Comment faisons-nous cela? Devrions-nous utiliser le paramètre Http Range? Si nous envoyons l'offset octet à Range, cela fonctionnera-t-il comme prévu? Et comment dois-je effacer les octets existants dans le tampon pour éviter que deux flux jouent ensemble?

Toute aide grandement appréciée. Merci. AudioFileStreamSeek fonctionne avec les paquets et non avec le nombre d'octets

Répondre

2

Donc, ce que vous avez vraiment besoin de suivre est le nombre de paquets.

La méthode MyEnqueueBuffer dans le code de Matt est l'endroit où les tampons sont envoyés à AudioQueue pour la lecture. Saisissez les paquets remplis et incrémentez votre variable d'index avant que les paquets soient remis à 0:

myData.absolutePackets = mesData.absolutePackets + myData-> paquetsFilled;

Mon problème est que je ne peux pas AudioFileStreamSeek correctement mis en œuvre, même avec cette valeur. Donc, si vous avez un exemple de code d'une recherche de travail avec le code de Matt s'il vous plaît partager.

Merci!

1

Je n'ai pas vraiment essayé AudioFileStream API pour cela (nous avons roulé notre propre interne), mais voici quelques éléments dont vous devez vous occuper. En supposant que vous n'ayez aucun problème à rechercher le flux d'octets, vous devez continuer à suivre la relation entre le numéro de trame MP3 et l'emplacement du flux d'octets absolus, comme le dit Paul. Je suppose que vous pouvez faire cela dans votre AudioFileStream_PacketsProc en appelant AudioFileStreamSeek en cours de route.

est ici la partie plus délicate. Lorsque vous effectuez une recherche aléatoire, vous devez réinitialiser les états internes de AudioFileStream. Parce qu'il pourrait être dans un état intermédiaire attendant que les prochains octets entrants pour compléter l'image en cours.Je ne suis pas sûr si vous pouvez simplement envoyer des zéros pour l'ignorer, et recommencer (que vous devez essayer, car je ne vois rien comme AudioFileStreamReset dans l'API, mais la file d'attente audio elle-même avoir réinitialiser la fonction que vous pouvez nettoyer l'image déjà en file d'attente). En tout cas, vous devez aussi prendre soin de votre AudioFileStream_PacketsProc parce que vous allez analyser une partie du flux d'octets dont vous avez déjà suivi.

Notez que vous ne pouvez pas simplement trouver le début d'un cadre MP3 en vous basant sur la seconde et le débit binaire. Même avec un flux MP3 à débit non variable, il peut y avoir des paddings toutes les autres images. Donc, l'information la plus précise provient toujours de l'analyseur.

Je devrais ajouter rapidement qu'une autre façon de faire de la recherche aléatoire est simplement de "mettre en mémoire cache" (stocker) les paquets analysés si vous ne jouez pas un très long flux. L'index de trame peut être calculé à partir des informations d'en-tête de trame. Pour les fichiers MP3 non VBR, les images par seconde sont une constante (par exemple, 44100/1152 = 38,28125 images par seconde pour un fichier MP3 non VBR stéréo de 44,1 kHz; consultez la spécification MP3 pour savoir pourquoi).

0

pouvez-vous utiliser AudioQueueStart avec le mSampletime de l'endroit que vous voulez chercher? Donc juste arrêter le jeu .... et commencer à un temps d'échantillonnage différent? [il suffit de prendre le temps d'échantillonnage actuel et de le manipuler selon ce dont vous avez besoin?]

inDeviceStartTime L'heure à laquelle la file d'attente audio doit démarrer.

Pour spécifier une heure de début relative au scénario du périphérique audio associé, utilisez le champ mSampleTime de la structure AudioTimeStamp. Utilisez NULL pour indiquer que la file d'attente audio doit démarrer dès que possible.

Valeur de retour Un code de résultat. Voir "Codes de résultat de la file d'attente audio".

Discussion Si le périphérique audio associé n'est pas déjà en cours d'exécution, cette fonction le lance.

+2

AudioQueueStarts mSampletime est seulement un délai avant le démarrage de l'AudioQueue - pas une position à partir de laquelle jouer. – Constantin