【Android音視頻開發】從AVFrame到MediaFrame數組(三)

本文記錄的是 從AVFrame到自定義實體類MediaFrame的過程

目的

前提:假定你已經看完了 《從AVFrame到MediaFrame數組(二)》,學會了Bitmap的建立

實現從AVFrame到自定義實體類MediaFrame的過程java

Java層建立MediaFrame實體類

直接看代碼:android

// 假定全路徑名:me.oogh.xplayer.MediaFrame,後面FindClass時會用到這個全路徑
public class MediaFrame {
    private String id;
    private Bitmap bitmap;
    
    public void setId(String id) { this.id = id; }
    public String getId() { return id; }
    
    public void setBitmap(Bitmap bitmap) { this.bitmap = bitmap; }
    public Bitmap getBitmap() { return bitmap; }
}

修改Java層回調接口

JNIHelper中添加一個方法:segmentfault

public class JNIHelper {
   public void onReceived(MediaFrame frame){
       // TODO: Java層接收到MediaFrame後,能夠開始搞事情了
   }
}

Native層封裝MediaFrame

簡單回顧上節中的bitmap的建立並填充像素數據的過程:數組

1. jobject bitmap = ...;
2. AndroidBitmap_lockPixels()...;
3. libyuv::I420ToABGR()...;

執行完畢之後,咱們已經獲得了一個帶有像素數據的bitmap(jobject類型);this

封裝MediaFrame,分爲2步:
1. 建立MediaFrame對象code

jclass clz_media_frame = env->FindClass("me/oogh/xplayer/MediaFrame");
jmethodID cb_constructor = env->GetMethodID(clz_media_frame, "<init>", "()V");
jobject obj_media_frame = env->NewObject(clz_media_frame, cb_constructor);

根據全路徑找到MediaFrame.class,再根據方法簽名找到它的構造方法,調用NewObject執行它的構造方法,獲得MediaFrame對象實例。對象

2. 設置MediaFrame屬性(id, bitmap)接口

// TODO: 設置id屬性
jstring id = env->NewStringUTF("20181014");
jmethodID cb_id = env->GetMethodID(clz_media_frame, "setId", "(Ljava/lang/String;)V");
env->CallVoidMethod(obj_media_frame, cb_id, id);

// TODO: 設置bitmap屬性
jmethodID cb_bitmap = env->GetMethodID(clz_media_frame, "setBitmap", "(Landroid/graphics/Bitmap;)V");
env->CallVoidMethod(obj_media_frame, cb_bitmap, bitmap);

【注意】設置id屬性時有一個坑,就是那個CallVoidMethodd中的id參數,爲了更深入並直觀的感覺崩潰,你能夠這樣子調用:get

env->CallVoidMethod(obj_media_frame, cb_id, "20181014");

嘿,【JNI DETECTED ERROR IN APPLICATION: use of invalid jobject】崩潰的感受可還好?解決方案就是上面寫的那樣,NewStringUTF封裝成jstring就能夠了。string

Native回調Java接口

jclass clz_jni_helper = env->FindClass("me/oogh/xplayer/JNIHelper");
jmethodID cb_received = env->GetMethodID(clz_jni_helper, "onReceived", "(Lme/oogh/xplayer/MediaFrame;)V");
env->CallVoidMethod(obj, cb_received, obj_media_frame);

至此,從AVFrame到MediaFrame,再將MediaFrame上傳,就已經結束了。

連接到下一文:《從AVFrame到MediaFrame數組(四)》

相關文章
相關標籤/搜索