在上一篇文章中实现了Android平台MP4解码YUV数据,
本篇我们实现Android平台解码avi并用SurfaceView播放。
先上图看效果:
思路:
1.把封装好的视频数据解码为YUV
2.YUV数据转化为RGB。
3.一帧一帧的传给SurfaceView显示出来
PS:
其实YUV数据可直接在SurfaceView显示,在研究Android系统多媒体框架的stagefright视频显示时发现,根本找不到omx解码后的yuv是怎么转换成RGB的代码,yuv数据在render之后就找不到去向了,可画面确确实实的显示出来了。
稍微看一下AsomePlayer的代码,不难发现,视频的每一帧是通过调用了SoftwareRenderer来渲染显示的、这是一个很大的突破,以后可以直接丢yuv数据到surface显示,无需耗时耗效率的yuv转RGB了,这部分知识点会在以后的文章中实现本篇不涉及。
下面看具体实现:
1.首先我们拷贝一份上一章的代码命名为ffmpegandroidplayer
2.根据本章需要修改代码
界面上一个SurfaceView
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".MainActivity"
tools:showIn="@layout/activity_main">
<SurfaceView
android:id="@+id/surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
一个native 的play方法负责把Surface传给底层
@Override
public void surfaceCreated(SurfaceHolder holder) {
new Thread(new Runnable() {
@Override
public void run() {
play(surfaceHolder.getSurface());
}
}).start();
}
...
pub