2012-03-23 4 views
14

मैं वर्तमान में एक ऐसे एप्लिकेशन को विकसित कर रहा हूं जिसमें ऑडियो रिकॉर्ड करने की आवश्यकता है, इसे एएसी के रूप में एन्कोड करें, इसे स्ट्रीम करें, और रिवर्स-प्राप्त स्ट्रीम में, एएसी डीकोडिंग और ऑडियो बजाना।एंड्रॉइड - मेरे स्वयं के प्रोजेक्ट में मूल स्टेजफ़ाइट फीचर्स शामिल करें

मैंने MediaRecorder का उपयोग करके सफलतापूर्वक एएसी (एमपी 4 कंटेनर में लपेटा) रिकॉर्ड किया, और AudioRecord कक्षा का उपयोग करके सफलतापूर्वक ऑडियो स्ट्रीम किया। लेकिन, मुझे ऑडियो स्ट्रीम करने में सक्षम होने की आवश्यकता है क्योंकि मैं इसे स्ट्रीम करता हूं, लेकिन इनमें से कोई भी वर्ग मुझे ऐसा करने में मदद नहीं करता है।

मैं थोड़ा शोध किया और पाया कि ज्यादातर लोगों को लगता है कि इस समस्या ffmpeg की तरह एक देशी लाइब्रेरी का उपयोग कर अंत।

लेकिन मैं सोच रहा था, के बाद से एंड्रॉयड पहले से ही StageFright, मूल कोड है कि एन्कोडिंग और डिकोडिंग कर सकते हैं है कि शामिल हैं (उदाहरण के लिए, AAC encoding और AAC decoding), वहाँ अपने आवेदन पर इस मूल कोड का उपयोग करने के लिए एक रास्ता है? मैं उसे कैसे कर सकता हूँ?

यह बहुत अच्छा होगा अगर मुझे केवल अपने मूल कोड के साथ कुछ जेएनआई कक्षाओं को लागू करने की आवश्यकता हो। इसके अलावा, चूंकि यह एक एंड्रॉइड लाइब्रेरी है, इसलिए यह कोई लाइसेंसिंग समस्या नहीं होगी (अगर मैं गलत हूं तो मुझे सही करें)।

उत्तर

16

हाँ, आप libstagefright का उपयोग कर सकते हैं, यह बहुत शक्तिशाली है।

चूंकि स्टेजफ़ाइट एनडीके के संपर्क में नहीं है, इसलिए आपको अतिरिक्त कार्य करना होगा।

(1) अपनी परियोजना एंड्रॉयड पूर्ण स्रोत पेड़ का उपयोग कर निर्माण:

वहाँ दो तरीके हैं। एक बार तैयार होने के लिए इस तरह सेटअप करने में कुछ दिन लगते हैं, यह बहुत आसान है, और आप मंच के पूर्ण लाभ ले सकते हैं।

(2) तुम सिर्फ कॉपी कर सकते हैं अपनी परियोजना के लिए फ़ाइल में शामिल हैं, यह इस फ़ोल्डर के अंदर है:

android-4.0.4_r1.1/चौखटे/आधार/शामिल/मीडिया/stagefright

तो आप करेंगे libstagefright.so को गतिशील रूप से लोड करके लाइब्रेरी फ़ंक्शन निर्यात करें, और आप अपनी जेनी प्रोजेक्ट से लिंक कर सकते हैं।

statgefright का उपयोग करके एन्कोड/डीकोड करने के लिए, यह बहुत सरल है, कुछ सौ लाइनें कर सकती हैं।

मैंने वीडियो बनाने के लिए स्क्रीनशॉट को कैप्चर करने के लिए मंचफ्रेम का उपयोग किया, जो जल्द ही रिलीज़ होने के लिए हमारे एंड्रॉइड वीएनसी सर्वर में उपलब्ध होगा।

निम्नलिखित स्निपेट है, मुझे लगता है कि यह फिल्म को एन्कोड करने के लिए ffmpeg का उपयोग करने से बेहतर है। आप ऑडियो स्रोत भी जोड़ सकते हैं।

class ImageSource : public MediaSource { 
    ImageSource(int width, int height, int colorFormat) 
    : mWidth(width), 
     mHeight(height), 
     mColorFormat(colorFormat) 
    { 
    } 

    virtual status_t read(
     MediaBuffer **buffer, const MediaSource::ReadOptions *options) { 
     // here you can fill the buffer with your pixels 
    } 

    ... 
}; 

int width = 720; 
int height = 480; 
sp<MediaSource> img_source = new ImageSource(width, height, colorFormat); 

sp<MetaData> enc_meta = new MetaData; 
// enc_meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_H263); 
// enc_meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG4); 
enc_meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC); 
enc_meta->setInt32(kKeyWidth, width); 
enc_meta->setInt32(kKeyHeight, height); 
enc_meta->setInt32(kKeySampleRate, kFramerate); 
enc_meta->setInt32(kKeyBitRate, kVideoBitRate); 
enc_meta->setInt32(kKeyStride, width); 
enc_meta->setInt32(kKeySliceHeight, height); 
enc_meta->setInt32(kKeyIFramesInterval, kIFramesIntervalSec); 
enc_meta->setInt32(kKeyColorFormat, colorFormat); 

sp<MediaSource> encoder = 
    OMXCodec::Create(
      client.interface(), enc_meta, true, image_source); 

sp<MPEG4Writer> writer = new MPEG4Writer("/sdcard/screenshot.mp4"); 
writer->addSource(encoder); 

// you can add an audio source here if you want to encode audio as well 
// 
//sp<MediaSource> audioEncoder = 
// OMXCodec::Create(client.interface(), encMetaAudio, true, audioSource); 
//writer->addSource(audioEncoder); 

writer->setMaxFileDuration(kDurationUs); 
CHECK_EQ(OK, writer->start()); 
while (!writer->reachedEOS()) { 
    fprintf(stderr, "."); 
    usleep(100000); 
} 
err = writer->stop(); 
+2

जब नकल, सावधान रहना JNI समारोह सी है कि और Stagefright C++ है। स्टेजफ्राइट जेएनआई के लिए एनडीके पर्यावरण के साथ असंगत दिखने वाले कुछ निर्भर शीर्षलेखों में से कुछ है। –

+2

ध्यान दें कि सभी एंड्रॉइड डिवाइसों में मंचदर्शी नहीं है, और एपीआई संस्करण के आधार पर भिन्न होता है। बहुत सावधान रहें क्योंकि इन एपीआई के लिए कोई अनुबंध नहीं है, इसलिए वे स्थिर नहीं हो सकते हैं। – dagalpin

+0

सीधे सीधे छवियों का उपयोग कर एक वीडियो प्रस्तुत कर सकते हैं ?? –

संबंधित मुद्दे