将音频数据从libspotify写入文件时出现奇怪的噪音和异常

时间:2013-01-29 16:14:25

标签: spotify libspotify

目前我们正在win 7 64位系统中实施Libspotify。除了播放之外,一切似乎都能正常工作。我们从回调中获取数据,但即使对已保存的音频使用音频,也会出现异常。因此,为了进一步研究,我们采用了win32示例(spshell)并对其进行了修改以将音乐数据保存到文件中。同样的问题,肯定是带有这些滴答声的音乐。我确信这里有一些简单的东西,但是我对这可能是什么问题感到茫然。任何帮助都会很棒,因为我们的项目处于停滞状态,直到我们能够解决这个问题。

可以在此处查看保存的音频 http://uploader.crestron.com/download.php?file=8001d80992480280dba365752aeaca81

以下是我为保存文件所做的代码更改(仅用于测试)

static FILE *pFile;
int numBytesToWrite=0;
CRITICAL_SECTION m_cs;

int SP_CALLCONV music_delivery(sp_session *s, const sp_audioformat *fmt, const void *frames, int num_frames)
{
    if ( num_frames == 0 )
        return;
    EnterCriticalSection(&m_cs);
    numBytesToWrite = ( num_frames ) * fmt->channels * sizeof(short);
    if (numBytesToWrite > 0 )
        fwrite(frames, sizeof(short), numBytesToWrite, pFile);
    LeaveCriticalSection(&m_cs);
    return num_frames;
}
static void playtrack_test(void)
{


    sp_error err;
    InitializeCriticalSection(&m_cs);
    pFile = fopen ("C:\\zzzspotify.pcm","wb");
    test_start(&playtrack);
    if((err = sp_session_player_load(g_session, stream_track)) != SP_ERROR_OK) {
        test_report(&playtrack, "Unable to load track: %s",  sp_error_message(err));
        return;
    }

    info_report("Streaming '%s' by '%s' this will take a while", sp_track_name(stream_track),
            sp_artist_name(sp_track_artist(stream_track, 0)));
    sp_session_player_play(g_session, 1);
}

void SP_CALLCONV play_token_lost(sp_session *s)
{
    fclose(pFile);
    DeleteCriticalSection(&m_cs);
    stream_track_end = 2;
    notify_main_thread(g_session);
    info_report("Playtoken lost");
}
static int check_streaming_done(void)
{
    if(stream_track_end == 2)
        test_report(&playtrack, "Playtoken lost");
    else if(stream_track_end == 1)
        test_ok(&playtrack);
    else
        return 0;
    fclose(pFile);
    stream_track_end = 0;
    return 1;
}

1 个答案:

答案 0 :(得分:3)

看起来这就是问题所在:

fwrite(frames, sizeof(short), numBytesToWrite, pFile);

fwrite文档指出第二个参数是“要写入的每个元素的字节大小”,第三个参数是“元素数量,每个元素的大小为 size < / em> bytes“。

您调用frwrite的方式将告诉它写入numBytesToWrite * sizeof(short)个字节,它将在给定缓冲区的末尾运行。我真的很惊讶它没有崩溃!

我建议您将fwrite电话改为:

fwrite(frames, sizeof(char), numBytesToWrite, pFile);

或:

int numSamplesToWrite = num_frames * fmt->channels;
fwrite(frames, sizeof(short), numSamplesToWrite, pFile);

修改

在详细查看您的音频后,我更确信这是事实。这首歌似乎是以半速播放(即,正在写入2倍的数据)并且伪像似乎看起来像缓冲区溢出到随机存储器中。