是的,你可以使用libstagefright,它非常強大。
由於stagefright不會暴露於NDK,所以您將不得不做額外的工作。
有兩種方式:
(1)構建採用了android完整的源代碼樹中的項目。這種方式需要幾天才能完成,一旦準備就緒,這很容易,你可以充分利用stagefright。
(2)你可以複製包含文件到您的項目,這是該文件夾中:
Android的4.0.4_r1.1 /框架/基/包括/媒體/怯場
,那麼你將通過動態加載libstagefright.so來導出庫函數,並且可以鏈接到您的jni項目。
要使用statgefright進行編碼/解碼,非常簡單,只需幾百行即可完成。
我使用stagefright捕捉屏幕截圖來創建一個視頻,該視頻將在我們的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<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();
複製時,要注意JNI函數是C,Stagefright是C++。一些Stagefright所依賴的頭文件看起來與JNI的NDK環境不兼容。 – 2012-05-07 09:53:52
請注意,並非所有Android設備都有stagefright,並且API取決於版本。因爲這些API沒有合同,所以要非常小心,因此它們可能不穩定。 – dagalpin 2012-05-07 20:33:42
StraightFright可以使用圖像渲染視頻? – 2012-09-03 19:20:44