播放通过curlib下载的mp3会被缩短

问题描述 投票:0回答:1

我正在尝试制作一个 C/C++ 程序,从服务器下载 mp3 文件,然后通过扬声器播放音频。问题是当我尝试播放音频时音频被缩短。每个音频的截断时间都不同,但它是一致的,因为同一文件每次都会在同一时间被截断,即使在不同的下载中也是如此。我正在使用curl来下载文件,目前我正在尝试使用sdl2_mixer来播放它。我正在研究 raspi 4 和通过插孔连接的扬声器。我通过 vscode 远程 ssh 连接到我的电脑,我可以在其中看到该文件,当我从 vscode 播放它时,它是完整的音频,但是当我尝试将它从 pi 下载到电脑时,它不会显示在我的文件中。我对这一切还很陌生,所以如果有任何错误或遗漏,请原谅。

我尝试过使用系统(mpg123...)和其他一两个东西来播放文件,但它们在播放时都会缩短。我现在有 SDL2_mixer 来做,但结果相同。当我通过谷歌用我的电脑访问服务器时,我得到了一个正确的mp3,所以我认为这并不是我以任何方式从服务器获得了错误的数据。

dt(日期时间)用于记录和命名目的。

 // temporary file to store the response
    string rf = program_id + "-" + dt + ".mp3";
    FILE *rfptr = fopen(rf.c_str(), "wb");


    // setup curl
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, rfptr);

    // perform request
    res = curl_easy_perform(curl);
    if (res != CURLE_OK)
    {
        cerr << "Error: " << dt << " Curl failed" << endl;
        return -1;
    }

    // play mp3 file using sdl2-mixer
    if (PlaySound(rf, dt))
    {
        cerr << "Error: " << dt << " Could not play mp3 file" << endl;
        return -1;
    }

    // cleanup
    curl_easy_cleanup(curl);
    // remove(rf.c_str());
    fclose(rfptr);

int PlaySound(string rf, string dt)
{
    if (SDL_Init(SDL_INIT_AUDIO) < 0)
    {
        cerr << "Error: " << dt << " Could not initialize SDL" << endl;
        return -1;
    }
    if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 2048) < 0)
    {
        cerr << "Error: " << dt << " Could not open audio" << endl;
        return -1;
    }
    Mix_Music *music = Mix_LoadMUS(rf.c_str());
    if (music == NULL)
    {
        cerr << "Error: " << dt << " Could not load music" << endl;
        return -1;
    }
    Mix_PlayMusic(music, 1);
    while (Mix_PlayingMusic())
    {
        SDL_Delay(100);
    }
    Mix_FreeMusic(music);
    Mix_CloseAudio();
    SDL_Quit();
    return 0;
c++ audio mp3
1个回答
0
投票

您需要刷新打开的文件流(或关闭它),因为最后一位挂在内存缓冲区中。以下其中一项就足够了:

fflush(rfptr);

fclose(rfptr);
© www.soinside.com 2019 - 2024. All rights reserved.