Extrait Bibliothèque iPod raw PCM échantillons et de jouer avec des effets sonores
Je suis en train de l'extrait brut échantillons PCM à partir d'un MP3 dans la Bibliothèque iPod afin que je puisse jouer la chanson et de manipuler le pitch, tempo, et appliquer des effets sonores (tels que les filtres). J'ai déjà descendu la route de AVPlayer et AVAudioPlayer qui à la fois ne permettent pas beaucoup de contrôle sur la lecture à tous.
Le code ci-dessous est comme ce que j'ai obtenu avec cette. Je suis à un point où je ne sais pas quoi faire avec le CMSampleBufferRef est dans ma boucle while car je ne sais pas qui cadre à utiliser pour la lecture de l'audio et de les appliquer à de tels effets.
Une idée de ce que serait la meilleure approche pour atteindre cette? J'ai regardé le cas où le fichier est converti à l'aide d'un AVAssetWriter mais cela ne va pas le couper pour moi parce que le processus est trop long. Certes, je peux juste lire les échantillons PCM en mémoire pour la lecture sans avoir à les écrire sur le disque en premier?
NB: je sais que le code ci-dessous fait référence à un mp3 dans le projet, mais je suis conscient que cette approche fonctionne de la même comme si je tire un NSURL de la MPMediaPropertyAssetURL
-(IBAction)loadTrack:(id)sender {
NSString *songPath = [[NSBundle mainBundle] pathForResource:@"Smooth_Sub Focus_192" ofType:@"mp3"];
NSURL *assetURL = [[NSURL alloc] initFileURLWithPath:songPath];
AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:assetURL options:nil];
NSError *assetError = nil;
AVAssetReader *assetReader = [[AVAssetReader assetReaderWithAsset:songAsset
error:&assetError] retain];
if (assetError) {
NSLog (@"Error: %@", assetError);
return;
}
AVAssetReaderOutput *assetReaderOutput = [[AVAssetReaderAudioMixOutput assetReaderAudioMixOutputWithAudioTracks:songAsset.tracks
audioSettings: nil] retain];
if (![assetReader canAddOutput:assetReaderOutput]) {
NSLog (@"Incompatible Asser Reader Output");
return;
}
[assetReader addOutput: assetReaderOutput];
[assetReader startReading];
CMSampleBufferRef nextBuffer;
while (nextBuffer = [assetReaderOutput copyNextSampleBuffer]) {
/* What Do I Do Here? */
}
[assetReader release];
[assetReaderOutput release];
}
OriginalL'auteur Dino | 2011-01-25
Vous devez vous connecter pour publier un commentaire.
Je suis en train de faire quelque chose de semblable dans mon propre code. La méthode suivante retourne quelques NSData pour un AVURLAsset:
Je recommanderais de faire cela sur un thread d'arrière-plan parce que c'est beaucoup de temps.
Un inconvénient de cette méthode est que l'ensemble du morceau est chargé en mémoire, ce qui est bien sûr limité.
Je n'ai jamais utilisé Finch moi-même, donc je ne suis pas sur si il accepte directement NSData.
Pour info: je l'ai essayé, et j'ai eu EXC_BAD_ACCESS... je pourrais le supprimer en cochant la OSStatus retourné par
CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer
avant de faire lafor
.OriginalL'auteur Tom Irving
En outre à Tom Irving Réponse, je suggère de remplacer
avec
qui permet d'éviter la double manipulation des échantillons, et réduit l'utilisation de la mémoire de frais généraux.
alternativement, vous pouvez envelopper [NSMutableData dataWithLength:longueur] dans une auto de libération de la piscine comme l'a démontré dans cette réponse à un autre, mais la même question.
Évidemment, je pourrais le lire une fois, sans copier quoi que ce soit, juste obtenir la longueur de chaque échantillon et de la somme, mais il semble trop salissant.
OriginalL'auteur unsynchronized
Je pense que vous voulez ce sont là pour assurer son PCM...
OriginalL'auteur TurqMage
Pour la durée de la chanson, je crois que vous pouvez simplement requête de la chanson de l'Actif ainsi:
Oui, pourquoi? Il fonctionne dans mon code...
OriginalL'auteur Jake Jacobs