2012-11-18 5 views
8

में स्मृति से libvorbis ऑडियो डिकोड C++ में एन्कोडेड बफर को देखते हुए, पहले से ही मेमोरी डेटा को डीकोड करने के लिए oggvorbis structs का उपयोग करने के चरण क्या होंगे?सी ++

OggVorbis_File का उपयोग नहीं किया जा सकता है, क्योंकि संपत्ति संकुचित अभिलेखागार के भीतर होती है।

मैं आवश्यक structs और विधियों का शोध करने की कोशिश कर रहा हूं, लेकिन मैं ऑडियो एन्कोडिंग और डिकोडिंग के लिए बिल्कुल नया हूं।

कोई भी संसाधन जो मेरी पढ़ाई को आगे बढ़ाने में मदद कर सकता है उसकी भी सराहना की जाती है!

मुझे स्पष्ट करना चाहिए, मैं डीकोडेड डेटा का उपयोग ओपनएएल में स्ट्रीम करने का इरादा रखता हूं।

धन्यवाद।

उत्तर

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 जीपीएल स्रोत के लिए एक विशेष धन्यवाद, यह पर देखी जा सकती है: here

+0

इसके अलावा, आप http चेकआउट कर सकते हैं: // svn.xiph.org/trunk/vorbis/examples/decoder_example.c –

+0

ग्रेट उत्तर! क्या आपके पास कम से कम पूर्ण काम करने वाला उदाहरण है जिसके साथ मैं खेल सकता हूं? – Chimera