Расшифровать файл Ogg / Opus

У меня есть очень маленький фрагмент кода C ++, который пытается открыть кодированный файл ogg / opus и использует API opus для его декодирования с помощью функции opus_decode (). Дело в том, что почти половина вызовов opus_decode (), которые я делаю для того же звука, возвращает отрицательные (ошибки) коды .. -4 и -2 (неверный пакет и слишком короткий буфер), которые я не могу решить. Выход похож

N декодировано: 960 N декодировано: -4 N декодировано: -4 N декодировано: 960 N декодировано:
-4 N декодировано: 1920 N декодировано: 960 N декодировано: -4 N декодировано: -4

и так далее.

#include <string.h>
#include <opus/opus.h>
#include <stdio.h>
#include <stdlib.h>
#include <cstdio>
#include <iostream>
#include <fstream>

#define LEN 1024
#define FREQ 48000
#define CHANNELS 1
#define FRAMESIZE 1920

int main(int argc, char *argv[]) {

int size = opus_decoder_get_size(CHANNELS);

OpusDecoder *decoders = (OpusDecoder*)malloc(size);
int error = opus_decoder_init(decoders, FREQ, CHANNELS);

std::ifstream inputfile;
inputfile.open("/home/vir/Descargas/detodos.opus"); //48000Hz, Mono

char input[LEN];

opus_int16 *data = (opus_int16*)calloc(CHANNELS*FRAMESIZE,sizeof(opus_int16));if(inputfile.is_open())
while (!inputfile.eof()) {

inputfile >> input;

std::cerr << "N decoded: " << opus_decode(decoders, (const unsigned char*)&input[0], LEN, data, FRAMESIZE, 0)  << "\n";

}return error;
}

1

Решение

Кажется, вы используете Opus-Tools вместо OpusFile. Очевидно, вы связались с libopus.a библиотека, но вам также нужно скачать и собрать OpusFile 0.7 и связать вашу программу с libopusfile.a создан из здания OpusFile. Включают opusfile.h в вашей программе от OpusFile 0.7. Наконец, вам нужно скачать и собрать библиотеку libogg, скачав libogg 1.3.2 из xiph.org/downloads и ссылка на эту библиотеку.

Эта ссылка документация, объясняющая, как открывать и закрывать потоки ogg opus для декодирования

Убедитесь, что у вас есть файл ogg opus и откройте поток, используя …

OggOpusFile *file = op_open_file(inputfile, error)(inputfile is char* inputfile and error is an int pointer)

Закройте поток с op_free(file), Это функциональная документация на самом деле декодировать поток OGG опус. Перед вызовом op_free декодируйте аудиоданные с помощью …

op_read(file,buffer,bufferSize,null), buffer is opus_int16 pcm[120*48*2]

bufferSize является sizeof(pcm)/sizeof(*pcm), op_read расшифрует больше файла, поэтому поместите его в for цикл до op_read возвращается 0,

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]