3

私は ogg/opus でコード化されたファイルを開こうとし、関数 opus_decode() でそれをデコードするために opus API を使用する非常に小さな C++ コードを持っています。問題は、同じサウンドに対して私が行う 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;
}
4

1 に答える 1

7

OpusFile の代わりに Opus-Tools を使用しているようです。ライブラリに対してリンクしていることは明らかですが、OpusFile 0.7 をダウンロードしてビルドし、OpusFile のビルドから作成されたlibopus.aプログラムをリンクする必要もあります。OpusFile 0.7 からプログラムにlibopusfile.aインクルードします。最後に、 xiph.orgopusfile.h / downloads から libogg 1.3.2 をダウンロードして libogg ライブラリをダウンロードしてビルドし、そのライブラリにリンクする必要があります。

このリンクは、デコードのために 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 opus ストリームを実際にデコードする関数のドキュメントです。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_read0

于 2016-08-30T02:22:10.457 に答える