Использование Gracenote SDK (GNSDK) для чтения файла и выполнения распознавания отпечатков пальцев

Я пытаюсь прочитать 16-битный wav-файл 16 кГц (длиной 20 секунд) на iOS и выполнить идентификацию по отпечатку пальца. Я пытался следовать руководству «GNSDK-for-Mobile-iOS-Developers-Guide», но на стр. 53 нет примера Objective-C (только C#). Мой код читает весь файл, а затем записывает блоки размером 2 КБ в функцию fingerprintWrite (я также пытался передать указатель на весь файл). Переменная «результат» никогда не устанавливается в 1, что указывает на то, что было передано недостаточно данных, но 20 секунд должно быть достаточно, верно? Кто-нибудь может помочь? Спасибо.

Вот что я сделал:

    NSString *filepath = [[NSBundle mainBundle] pathForResource:@"Human.signed.20s.16bit" ofType:@"raw"];

    NSData *audioData= [NSData dataWithContentsOfFile:filepath];

    BOOL result;



    if (error)

        NSLog(@"Error reading file: %@", error.localizedDescription);



    // for debugging...

    NSLog(@"contents: %@", audioData);

    NSLog(@"Done:");

    unsigned char buffer[audioData.length];

    [audioData getBytes:buffer length:audioData.length];

    for (int i = 0; i < audioData.length; i++) {

        printf("0x%02x ",(unsigned char)buffer[i]);

    }



    [self.gnMusicIDFileInfo fingerprintBegin:16000 audioSampleSize:16 audioChannels:1 error:&error];

    if (error) {

        NSLog(@"Error = %@", [error localizedDescription]);

    }



    int count = 0;

    result = 0;

    while (result==0 && count<sizeof(buffer)-2048)

    {

        result = [self.gnMusicIDFileInfo fingerprintWrite:&buffer[count] audioDataSize:2048 error:&error];

        NSLog(@"Count = %i",count);

        count=count+2048;

    }



    NSLog(@"result = %i", result);

    if (error) {

        NSLog(@"Error = %@", [error localizedDescription]);

    }



    [self.gnMusicIDFileInfo fingerprintEnd:&error];

    if (error) {

        NSLog(@"Error = %@", [error localizedDescription]);

    }



    [self.gnMusicIDFileInfo fingerprint:&error];

    if (error) {

        NSLog(@"Error = %@", [error localizedDescription]);

    }

person Martin Harrison    schedule 16.02.2016    source источник
comment
Можете ли вы поделиться информацией о вашем случае использования? Вы пытаетесь идентифицировать музыкальный файл с компакт-диска? Или идентификация музыки с радиостанции/потокового вещания?   -  person WYH    schedule 18.02.2016


Ответы (1)


20 секунд может быть недостаточно, потому что для процесса идентификации требуется достаточное количество «полезного» звука. Кроме того, при идентификации файла MusicID необходимо иметь аудиофайл с начала песни. Если в вашем варианте использования представлена ​​только часть песни и песня не запускается с самого начала, скорее всего, она не сработает. Вместо этого вам нужно будет использовать MusicID Stream.

person WYH    schedule 03.03.2016