gpt4 book ai didi

Android - 在我自己的项目中包含 native StageFright 功能

转载 作者:可可西里 更新时间:2023-11-01 19:05:26 24 4
gpt4 key购买 nike

我目前正在开发一个应用程序,它需要录制音频、将其编码为 AAC、流式传输,然后反向执行相同的操作 - 接收流、解码 AAC 和播放音频。

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

我做了一些研究,发现大多数遇到这个问题的人最终都使用了像 ffmpeg 这样的原生库。

但我想知道,由于 Android 已经包含 StageFright,它具有可以进行编码和解码的 native 代码(例如 AAC encodingAAC decoding ),有没有办法使用这个 native 代码在我的应用程序上?我该怎么做?

如果我只需要用它们的 native 代码实现一些 JNI 类,那就太好了。另外,由于它是一个 Android 库,因此不会有任何许可问题(如果我错了请纠正我)。

最佳答案

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

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

有两种方式:

(1) 使用 android 完整源代码树构建您的项目。这种方式需要几天的时间来设置,一旦准备就绪,就非常简单,并且您可以充分利用 stagefright。

(2) 你可以将包含文件复制到你的项目中,它在这个文件夹中:

android-4.0.4_r1.1/frameworks/base/include/media/stagefright

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

使用statgefright编解码,很简单,几百行就可以了。

我使用 stagefright 捕捉屏幕截图来制作视频,该视频将在我们的 Android VNC 服务器上提供,并很快发布。

下面是一个 fragment ,我觉得比用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();

关于Android - 在我自己的项目中包含 native StageFright 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9832503/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com