Android – 在我自己的项目中包含原生StageFrightfunction

我目前正在开发一种应用程序,它需要记录音频,将其编码为AAC,对其进行流式传输,并在反向中执行相同的操作 – 接收流,解码AAC和播放音频。

我使用MediaRecorder成功录制了AAC(包装在MP4容器中),并使用AudioRecord类成功上传了音频。 但是,我需要能够在流式传输时对音频进行编码,但这些类似乎都没有帮助我这样做。

我研究了一下,发现大多数有这个问题的人最终都使用像ffmpeg这样的本地库。

但我想知道,因为Android已经包含StageFright ,它具有可以进行编码和解码的本机代码(例如, AAC编码和AAC解码 ),有没有办法在我的应用程序上使用这个本机代码? 我怎样才能做到这一点?

如果我只需要用他们的本机代码实现一些JNI类,那就太好了。 另外,因为它是一个Android库,所以不会出现许可问题(如果我错了,请纠正我)。

是的,你可以使用libstagefright,它非常强大。

由于stagefright不会暴露给NDK,因此您将不得不做额外的工作。

有两种方法:

(1)使用android完整源代码树构建你的项目。 这种方式需要几天时间才能完成设置,一旦准备好,就很容易了,你可以充分利用stagefright。

(2)您可以将包含文件复制到您的项目中,它位于此文件夹中:

机器人-4.0.4_r1.1 /框架/碱/包含/媒体/怯场

然后你将通过动态加载libstagefright.so导出库函数,你可以链接到你的jni项目。

要使用statgefright进行编码/解码,它非常简单,只需几百行即可。

我使用stagefright捕获截图以创建一个video,该video将在我们的Android VNC服务器中提供,即将发布。

以下是一个片段,我认为这比使用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 img_source = new ImageSource(width, height, colorFormat); sp 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 encoder = OMXCodec::Create( client.interface(), enc_meta, true, image_source); sp 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 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();