có, bạn có thể sử dụng libstagefright, nó rất mạnh mẽ.
Vì sân khấu không được tiếp xúc với NDK nên bạn sẽ phải làm thêm.
Có hai cách:
(1) xây dựng dự án của bạn bằng cách sử dụng cây nguồn đầy đủ Android. Bằng cách này mất một vài ngày để thiết lập, một khi đã sẵn sàng, nó rất dễ dàng, và bạn có thể tận dụng đầy đủ lợi thế của sân khấu.
(2) bạn chỉ có thể sao chép bao gồm tập tin để dự án của bạn, đó là bên trong thư mục này:
android-4.0.4_r1.1/khung/cơ sở/include/media/stagefright
sau đó bạn sẽ có chức năng xuất thư viện bằng cách tự động tải libstagefright.so và bạn có thể liên kết với dự án jni của bạn.
Để mã hóa/giải mã bằng cách sử dụng statgefright, rất đơn giản, một vài trăm dòng có thể thực hiện.
Tôi đã sử dụng stagefright để chụp ảnh chụp màn hình để tạo video, video sẽ có sẵn trong máy chủ Android VNC của chúng tôi, sẽ sớm được phát hành.
sau đây là một đoạn trích, tôi nghĩ nó tốt hơn sử dụng ffmpeg để mã hóa phim. Bạn cũng có thể thêm nguồn âm thanh.
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();
Khi sao chép, hãy cẩn thận rằng chức năng JNI là C và Stagefright là C++. Một số tiêu đề phụ mà Stagefright kéo trông không tương thích với môi trường NDK cho JNI. –
Lưu ý rằng không phải tất cả các thiết bị Android đều có stagefright và API khác nhau tùy theo phiên bản. Hãy rất cẩn thận vì không có hợp đồng cho các API này, vì vậy chúng có thể không ổn định. – dagalpin
có thể StraightFright hiển thị video bằng hình ảnh không ?? –