opus_decode, возвращающий поврежденный поток - PullRequest
1 голос
/ 31 октября 2019

Я декодирую данные ogg opus, которые транслируются в прямом эфире с сервера icecast. Я использую libopus для декодирования. Данные иногда декодируются, но в большинстве случаев op_decode () возвращает -4, что указывает на поврежденный поток. Это функция обратного вызова, используемая для доступа к данным с использованием библиотеки curl.

#define SAMPLE_RATE 48000
#define CHANNELS 2
#define MAX_FRAME_SIZE 6*960
size_t play_stream(void *buffer, size_t size, size_t nmemb, void *userp)
{
    FILE *fp;
    opus_int16 out[MAX_FRAME_SIZE * CHANNELS];
    int error;
    int i;
    unsigned char pcm_bytes[MAX_FRAME_SIZE * CHANNELS * 2];
    int frame_size;

    frame_size = opus_decode(decoder, (unsigned char*)buffer, (opus_int32)size * nmemb, out, MAX_FRAME_SIZE, 0);

    if (frame_size < 0)
    {
        fprintf(stderr, "decoder failed: %s\n", opus_strerror(frame_size));

    }


    return size * nmemb;
}

Может кто-нибудь помочь мне?

1 Ответ

1 голос
/ 10 ноября 2019

Функция opus_decode() декодирует пакет Opus, а не поток Ogg Opus. Вы можете использовать библиотеку Ogg, чтобы получить пакеты из потока, а затем libopus, чтобы декодировать пакеты, но более простой способ - использовать библиотеку opusfile . Opusfile может даже читать поток прямо из сети.

...