资讯专栏INFORMATION COLUMN

【Android音视频开发】从AVFrame到MediaFrame数组(三)

frontoldman / 2876人阅读

摘要:回调接口至此,从到,再将上传,就已经结束了。链接到下一文从到数组四

本文记录的是从AVFrame到自定义实体类MediaFrame的过程
目的
前提:假定你已经看完了《从AVFrame到MediaFrame数组(二)》,学会了Bitmap的创建

实现从AVFrame到自定义实体类MediaFrame的过程

Java层创建MediaFrame实体类

直接看代码:

// 假定全路径名: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中添加一个方法:

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类型);

封装MediaFrame,分为2步:
1. 创建MediaFrame对象

jclass clz_media_frame = env->FindClass("me/oogh/xplayer/MediaFrame");
jmethodID cb_constructor = env->GetMethodID(clz_media_frame, "", "()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参数,为了更深刻并直观的感受崩溃,你可以这样子调用:

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

嘿,【JNI DETECTED ERROR IN APPLICATION: use of invalid jobject】崩溃的感觉可还好?解决方案就是上面写的那样,NewStringUTF封装成jstring就可以了。

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数组(四)》

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/14481.html

相关文章

  • Android视频开发AVFrameMediaFrame数组(一)

    摘要:最近在学习中的音视频开发,从到数组是一个学习的记录它共分为个部分一是对从到数组所实现的功能以及涉及到知识点的介绍二从到层的三从到层自定义的实体类四从到层自定义的实体类的数组简介目的输入一个视频素材输出屏幕上的画面分析用户将一个视频文件传递到 最近在学习Android中的音视频开发,《从AVFrame到MediaFrame数组》是一个学习的记录它共分为4个部分:(一):是对《从AVFra...

    didikee 评论0 收藏0
  • Android视频开发AVFrameMediaFrame数组(四)

    摘要:本文记录的是从到数组的实现过程目的前提假定你已经看完了从到数组三,学会了的创建实现从到自定义实体类数组的过程修改层回调接口中添加一个方法层接收到后,可以开始搞事情了封装数组层封装数组,分为步创建数组对象数组大小元素类型元素初始化值给数组 本文记录的是从AVFrame到MediaFrame数组的实现过程 目的 前提:假定你已经看完了《从AVFrame到MediaFrame数组(三)》,学...

    ?xiaoxiao, 评论0 收藏0
  • Android视频开发AVFrameMediaFrame数组(二)

    摘要:实现从到的转换。注意哦,这时候,的值是一个随机的值假定此时为,由系统分配,它还不指向像素数据。并且锁定该地址,保证不会被移动。链接到下一文从到数组三参考链接之操作 本文记录的是从AVFrame到Bitmap的实现过程,为了突出重点,FFmpeg解码视频文件得到AVFrame的过程不在这里记录,如需要了解,可以看下【Samples】demuxing_decoding 目的 前提:假定我...

    imtianx 评论0 收藏0
  • Android 视频开发核心知识点笔记整合

    摘要:这里给大家推荐一套学习路线,并附有相关音视频开发核心知识点笔记,相信可以给大家提供一些帮助,有需要的朋友们也可以下载下来随时查漏补缺。 很多开发者都知道Androi...

    lily_wang 评论0 收藏0
  • 5步告诉你QQ音乐的完美音质是怎么来的,播放器的秘密都在这里

    摘要:音频解码在中对中的数据进行解码解码后的帧存放到中音频播放中,通过调用回调接口,对中的音频帧数据进行解码成数据写入数据到数组,并由播放。对进行修改,将数据额外输出到本地,并与正常的数据进行对比。欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由QQ音乐技术团队发表于云+社区专栏 一、问题背景与分析 不久前,团队发现其Android平台App在播放MV视频《凤凰花开的路口》时...

    voidking 评论0 收藏0

发表评论

0条评论

frontoldman

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<