2012-03-23 28 views
14

Tôi hiện đang phát triển một ứng dụng cần ghi âm, mã hóa dưới dạng AAC, phát trực tuyến và thực hiện tương tự ở luồng nhận ngược, giải mã AAC và phát âm thanh.Android - Bao gồm các tính năng StageFright gốc trong dự án của riêng tôi

Tôi đã ghi thành công AAC (được bao gói trong hộp chứa MP4) bằng cách sử dụng MediaRecorder và âm thanh được phát trực tiếp thành công bằng cách sử dụng lớp AudioRecord. Nhưng, tôi cần để có thể mã hóa âm thanh khi tôi phát trực tuyến, nhưng không có lớp nào trong số này dường như giúp tôi làm điều đó.

Tôi đã nghiên cứu một chút và thấy rằng hầu hết mọi người gặp sự cố này đều sử dụng thư viện gốc như ffmpeg.

Nhưng tôi đã tự hỏi, vì Android đã bao gồm StageFright, có mã nguồn gốc có thể làm mã hóa và giải mã (ví dụ, AAC encodingAAC decoding), là có một cách để sử dụng mã gốc này trên ứng dụng của tôi? Làm thế nào tôi có thể làm điều đó?

Thật tuyệt vời nếu tôi chỉ cần triển khai một số lớp JNI với mã gốc của chúng. Hơn nữa, vì nó là một thư viện Android, nó sẽ không có vấn đề cấp phép gì cả (đúng với tôi nếu tôi sai).

Trả lời

16

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(); 
+2

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. –

+2

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

+0

có thể StraightFright hiển thị video bằng hình ảnh không ?? –

Các vấn đề liên quan