2012-11-18 3 views
8

C++でエンコードされたバッファがある場合、oggvorbis構造体を使用して既にメモリ内のデータをデコードするステップは何ですか?libvorbis C++のメモリからのオーディオデコード

アセットが圧縮されたアーカイブ内にあるため、OggVorbis_Fileは使用できません。

私は必要な構造とメソッドを研究しようとしていますが、私はオーディオのエンコードとデコードにはかなり新しいです。

私の読書をさらに助けることができるどんなリソースも高く評価されています!

私は、デコードされたデータをOpenALにストリームするために使用することを明確にする必要があります。

ありがとうございました。

答えて

9

私自身の質問に答える。

これは、vorbisにカスタムコールバックを提供することによって実行できます。

struct ogg_file 
{ 
    char* curPtr; 
    char* filePtr; 
    size_t fileSize; 
}; 

size_t AR_readOgg(void* dst, size_t size1, size_t size2, void* fh) 
{ 
    ogg_file* of = reinterpret_cast<ogg_file*>(fh); 
    size_t len = size1 * size2; 
    if (of->curPtr + len > of->filePtr + of->fileSize) 
    { 
     len = of->filePtr + of->fileSize - of->curPtr; 
    } 
    memcpy(dst, of->curPtr, len); 
    of->curPtr += len; 
    return len; 
} 

int AR_seekOgg(void *fh, ogg_int64_t to, int type) { 
    ogg_file* of = reinterpret_cast<ogg_file*>(fh); 

    switch(type) { 
     case SEEK_CUR: 
      of->curPtr += to; 
      break; 
     case SEEK_END: 
      of->curPtr = of->filePtr + of->fileSize - to; 
      break; 
     case SEEK_SET: 
      of->curPtr = of->filePtr + to; 
      break; 
     default: 
      return -1; 
    } 
    if (of->curPtr < of->filePtr) { 
     of->curPtr = of->filePtr; 
     return -1; 
    } 
    if (of->curPtr > of->filePtr + of->fileSize) { 
     of->curPtr = of->filePtr + of->fileSize; 
     return -1; 
    } 
    return 0; 
} 

int AR_closeOgg(void* fh) 
{ 
    return 0; 
} 

long AR_tellOgg(void *fh) 
{ 
    ogg_file* of = reinterpret_cast<ogg_file*>(fh); 
    return (of->curPtr - of->filePtr); 
} 

使用

ov_callbacks callbacks; 
ogg_file t; 
t.curPtr = t.filePtr = compressedData; 
t.fileSize = compressedDataSize; 

OggVorbis_File* ov = new OggVorbis_File; 
mOggFile = ov; 
memset(ov, 0, sizeof(OggVorbis_File)); 

callbacks.read_func = AR_readOgg; 
callbacks.seek_func = AR_seekOgg; 
callbacks.close_func = AR_closeOgg; 
callbacks.tell_func = AR_tellOgg; 

int ret = ov_open_callbacks((void *)&t, ov, NULL, -1, callbacks); 

vorbis_info* vi = ov_info(ov, -1); 
assert(vi); 

/* compressed data is available to use, to uncompress look into ov_read */ 

これのヘルプのほとんどのDoom3 GPLソースへの感謝が、 で見ることができます。また、HTTPをチェックアウトすることができhere

+0

:// svn.xiph.org/trunk/vorbis/examples/decoder_example.c –

+0

偉大な答え!私は周りに遊ぶことができる最小の完全な実例を持っていますか? – Chimera

関連する問題