0

iOS から 16 ビット 16KHz wav (長さ 20 秒) を読み取って、指紋識別を実行しようとしています。ガイド「GNSDK-for-Mobile-iOS-Developers-Guide」に従ってみましたが、53 ページに目的の c の例がありません (C# のみ)。私のコードは、ファイル全体を読み取り、2K ブロックを関数 FingerprintWrite に書き込みます (ファイル全体へのポインターを渡すことも試みました)。変数 "result" が 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]);

    }
4

1 に答える 1

2

識別プロセスを進めるには十分な量の「使用可能な」オーディオが必要なため、20 秒では不十分な場合があります。また、MusicID ファイルの識別を行う場合、曲の最初からオーディオ ファイルが必要です。ユースケースが曲の一部のみを提供し、曲が最初から始まらない場合、ほとんどの場合うまくいきません。代わりに MusicID Stream を使用する必要があります。

于 2016-03-03T19:31:49.767 に答える