2016-06-14 15 views
1

Ich habe ein sehr kleines Stück C++ - Code, der versucht, eine ogg/opus-codierte Datei zu öffnen und die Opus-API verwendet, um es mit der Funktion opus_decode() zu dekodieren. Die Sache ist, dass fast die Hälfte der opus_decode() -Aufrufe, die ich für den gleichen Ton mache, negative (Fehler-) Codes zurückgibt. -4 und -2 (ungültiges Paket und Puffer zu kurz), die ich nicht lösen kann. Der Ausgang ist wieDecode Ogg/Opus-Datei

N decodierte: 960 N decodierte: -4 N decodierte: -4 N decodierte: 960 N decodierte: -4 N decodierte: 1920 N decodierte: 960 N decodierte: -4 N decodierte: -4

und so weiter.

#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; 
} 

Antwort

3

Es scheint, dass Sie Opus-Tools anstelle von OpusFile verwenden. Offensichtlich hast du gegen die libopus.a Bibliothek gelinkt, aber du musst auch OpusFile 0.7 herunterladen und erstellen und dein Programm mit libopusfile.a verknüpfen, das aus dem Erstellen von OpusFile erstellt wurde. Enthalten Sie opusfile.h in Ihrem Programm von OpusFile 0.7. Schließlich müssen Sie die libogg-Bibliothek herunterladen und erstellen, indem Sie libogg 1.3.2 von xiph.org/downloads herunterladen und mit dieser Bibliothek verknüpfen.

This link ist die Dokumentation, die erklärt, wie man ogg Opusströme für das Entschlüsseln öffnet und schließt.

Stellen Sie sicher, eine ogg Opus-Datei und öffnen Sie den Strom mit ...

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

Schließen der Strom mit op_free(file). Dies ist die function documentation, um tatsächlich einen ogg-Opus-Stream zu decodieren. Bevor Sie anrufen dekodieren op_free die Audiodaten mit ...

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

bufferSize ist sizeof(pcm)/sizeof(*pcm). op_read wird mehr von der Datei dekodieren, also legen Sie es in eine for Schleife, bis op_read0 zurückgibt.