He creado una utilidad sencillita para inspeccionar los meta datos de ficheros de audio (wav, MP3, MP4, lo que sea) y pensé que el código podría ser interesante. Aunque es de linea de comandos, se podría aprovechar el código para una app gráfica.

Utiliza AudioToolbox, una framework que incluye las funcionalidades más comunes de CoreAudio. El código es muy sencillo y debería de ser fácil de seguir. Es más C que Objective C, pero con CoreAudio no hay escapatoria de C, ya que es una framework de bastante bajo nivel.

Espero con el tiempo ir publicando más cosas de CoreAudio.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
// Created by Fernando Rodríguez Romero on 24/10/12.
// Copyright (c) 2012 Agbo. All rights reserved.
//
 
#import <Foundation/Foundation.h>
#import <AudioToolbox/AudioToolbox.h>
 
int main(int argc, const char * argv[])
{
 
@autoreleasepool {
if (argc < 2) {
// El primer parámetro es el nombre del ejecutable
// y el segundo debería de ser el fichero que vamos
// a examinar
NSLog(@"Uso: ametadatos /ruta/a/ficheroDeAudio");
return -1;
}
// Creo una NSString a partir de una cadena C y expando
// la tilde del directorio home
NSString *audioFilePath = [[NSString stringWithUTF8String:argv[1]]
stringByExpandingTildeInPath];
// Lo que me hace falta es una url
NSURL *audioURL = [NSURL fileURLWithPath:audioFilePath];
// Aquí empieza lo bueno: un "handle" para el fichero de audio
// los hombres de verdad comprueban errores con OSStatus
AudioFileID audioFile;
OSStatus err = noErr;
// Abrimos el fichero y necesitamos una CFURLRef en vez de un NSURL:
// son toll-free bridged
err = AudioFileOpenURL((__bridge CFURLRef)audioURL, kAudioFileReadPermission, 0, &audioFile);
assert(err == noErr);
// Obetengo el tamaño de los metadatos
UInt32 dictSize = 0;
err = AudioFileGetPropertyInfo(audioFile, kAudioFilePropertyInfoDictionary, &dictSize, 0);
assert(err == noErr);
// Los leo en un CFDictionaryRef (la versión CoreFoundation de NSDictionary)
CFDictionaryRef dict = NULL;
err = AudioFileGetProperty(audioFile, kAudioFilePropertyInfoDictionary, &dictSize, &dict);
assert(err == noErr);
// Imprimimos los datos que se hayan recuperado
NSLog(@"Meta datos: %@", dict);
// Hay que liberar los objetos CoreFoundation (qué cruz...)
CFRelease(dict);
// Cerramos el fichero
err = AudioFileClose(audioFile);
assert(err == noErr);
}
return 0;
}
view raw gistfile1.m This Gist brought to you by GitHub.

Tagged with:  

One Response to Obtener meta datos de ficheros de audio con Objective C y CoreAudio, por @frr149

  1. [...] es la parte más de bajo nivel de CoreAudio, y todo el código se escribe en ObjectiveC++ (es decir, mezclando Objective C y C++) en ficheros [...]