FFmpeg(六) 播放视频之GLSurfaceView显示RGB数据

本文介绍了如何使用FFmpeg在Android中通过GLSurfaceView播放RGB视频,详细解析了播放视频的原理和步骤,包括双缓冲机制、GLSurfaceView的使用以及在C++中处理缓冲数据的方法。
摘要由CSDN通过智能技术生成

 

一、播放视频说明

  1、两种方式播放视频

      ①shader播放YUV,后面再介绍。
      ②RGB直接显示数据,简单。性能差,用到FFmpeg的格式转换,没有shader效率高。本文介绍这个方式。
  2.GLSurfaceView原理(双缓冲机制):

      SurfaceHolder: getHolder().getSurface();
      得到Surface,取出其中缓冲地址,写入RGB数据。
  3.新建一个java的XPlay组件,继承与GLSurfaceView,并在xml中进行布局编写。

  4.调用native函数:public native void Open(String url,Object surface);

  5.在C++中进行取出缓冲地址,将数据放到缓冲并发送出去进行显示。

二、函数说明

  1、需要的头文件
      #include <android/native_window.h>
      #include <android/native_window_jni.h>
  2.函数说明
      ANativeWindow *nwin = ANativeWindow_fromSurface(env,surface);//env为JNIEnv *env ,surface为java传过来的jobject surface 生成一个原始的窗口类
      ANativeWindow_setBuffersGeometry(nwin,outWidth,outHeight,WINDOW_FORMAT_RGBA_8888); // 对原始的窗口类设置,设置宽高格式,不是surface的宽高,设置nativewindow的buff,可自动拉伸
      ANativeWindow_Buffer wbuf;
      //双缓冲
      ANativeWindow_lock(nwin,&wbuf,0); //加锁、获取nwin的缓冲到wbuf中,
      uint8_t *dst = (uint8_t*)wbuf.bits; //缓冲地址,跟显卡交互的, 地址是:内存地址
      memcpy(dst,rgb,outWidth*outHeight*4); // 复制rgb到地址中,宽*高*4 ,rgb为像素转换完成的数据
      ANativeWindow_unlockAndPost(nwin); //解锁并post出去

 

代码说明:

1.新建XPlay

2.在布局文件layout中加入Xplay

3.C++代码

layout的XML:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="aplay.testffmpeg.MainActivity">

    <XPlay
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</android.support.constraint.ConstraintLayout>

 

Xplay代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值