2016-02-16 40 views
0

我試圖從iOS上讀取16位16KHz wav(20秒長)並執行指紋識別。我嘗試遵循指南「GNSDK-for-Mobile-iOS-Developers-Guide」,但它沒有第53頁的Objective-C示例(僅C#)。我的代碼讀取整個文件,然後將2K塊寫入函數fingerprintWrite(我也嘗試將指針傳遞給整個文件)。變量「結果」是永遠不會設置爲1 - 表示沒有足夠的數據已經過去了 - 但以20秒應該介於夠了吧誰能幫助感謝使用Gracenote SDK(GNSDK)讀取文件並執行指紋識別

這是我做了什麼:??

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]); 

    } 
+0

您可以分享有關您的用例的信息嗎?您是否想要識別來自CD的音樂文件?或從電臺/流媒體中識別音樂? – WYH

回答

1

20秒可能還不夠,因爲識別過程需要足夠數量的「可用」音頻才能繼續進行。另外,在進行MusicID文件識別時,需要從歌曲的開始處獲取音頻文件。用例只提供歌曲的一部分,歌曲不從一開始就啓動,它很可能不起作用,您將需要使用MusicID流代替