实战篇

本文主要参考我之前整理的文章windows下使用SDL进行YUV渲染

相对于之前写的位图渲染部分(http://www.cnblogs.com/tocy/p/android-sdl-bitmap-render-coding.html),yuv渲染主要是增加了yuv加载、texture更新部分。注意本部分的介绍内容是在Android位图渲染框架下增加的YUV渲染部分(具体参考Android下基于SDL的位图渲染(二)理论篇)。

主要执行流程如下:

  1. 初始化SDL window和render
  2. 加载yuv数据
  3. 创建SDL texture
  4. 使用yuv数据更新texture
  5. texture通过render渲染到window上
  6. 资源销毁及释放
  7. 调用SDL_Quit通知Activity退出

实现的代码如下:

extern "C" int yuv_main(int argc, char *argv[])
{
// init sdl
if (!init())
{
LOGE("%s %d SDL init failed", __FUNCTION__, __LINE__);
deinit();
return -1;
} // load yuv
const char *yuv_path = "/sdcard/test_720x576.yuv";
LOGI("natvie_SDL %s", yuv_path);
yuv_frame.width = 720;
yuv_frame.height = 576;
if (!load_yuv(yuv_path))
{
LOGE("%s %d load yuv failed", __FUNCTION__, __LINE__);
deinit();
return -2;
} // texture operation
texture_create(yuv_frame.width, yuv_frame.height);
texture_update();
texture_render(); SDL_Delay(2000); // free resources
unload_yuv();
texture_destory();
deinit(); // Quit SDL
SDL_Quit(); return 0;
}

其中texture_update实现代码如下:

static void texture_update()
{
void * pixel = NULL;
int pitch = 0;
if(0 == SDL_LockTexture(texture, NULL, &pixel, &pitch))
{
// 如果不考虑数据对齐,直接拷贝YUV数据是没有问题的
if (pitch == yuv_frame.width)
{
memcpy(pixel, yuv_frame.data[0], yuv_frame.frame_size);
}
else // 可能发生pitch > width的情况
{
// 如果有数据对齐的情况,单独拷贝每一行数据
// for Y
int h = yuv_frame.height;
int w = yuv_frame.width;
unsigned char * dst = reinterpret_cast<unsigned char *>(pixel);
unsigned char * src = yuv_frame.data[0]; for (int i = 0; i < h; ++i)
{
memcpy(dst, src, w);
dst += pitch;
src += w;
} h >>= 1;
w >>= 1;
pitch >>= 1; // for U
src = yuv_frame.data[1];
for (int i = 0; i < h; ++i)
{
memcpy(dst, src, w);
dst += pitch;
src += w;
} // for V
src = yuv_frame.data[2];
for (int i = 0; i < h; ++i)
{
memcpy(dst, src, w);
dst += pitch;
src += w;
}
} SDL_UnlockTexture(texture);
}
}

关于texture也可以调用SDL_UpdateTexture

附加说明

源码下载

本文中涉及所有源码可以从我的git@OSC,下载之后需要切换到yuv_render的tag即可。

其他

本文主要目的是说明如何通过SDL在Android下渲染yuv数据。

重复调用texture_update()和texture_render()并更新yuv数据即可实现YUV视频序列的渲染。

如果配合ffmpeg的解码器就可以实现视频播放器的功能(ffmpeg解码器多数输出是基于YUV420的原始视频数据),当然需要考虑同步和缓冲相关问题。

Android下基于SDL的YUV渲染的更多相关文章

  1. Android下基于SDL的位图渲染(二)理论篇

    理论篇 上一篇中介绍了如何将SDL2源码应用到Android渲染中,实际上SDL本身提供的android-project实现了基于android的c运行时环境,通过上面实践篇的介绍,就是完成这个环境搭 ...

  2. Android下基于SDL的位图渲染(一)

    环境准备 安装Android开发环境(java.android-sdk.android ndk.gcc). 我使用的ndk版本是r10b/r10d,在win10/ubutu 15.04编译 下载sdl ...

  3. Android下基于PCM的音频渲染

    环境准备 请按照我之前的文章-Android下基于SDL的位图渲染,安装必要的开发环境. 实践篇 这里主要参考Beginning SDL 2.0(6) 音频渲染及wav播放,只不过将源从WAV文件改成 ...

  4. Android下基于线程池的网络访问基础框架

    引言 现在的Android开发很多都使用Volley.OkHttp.Retrofit等框架,这些框架固然有优秀的地方(以后会写代码学习分享),但是我们今天介绍一种基于Java线程池的网络访问框架. 实 ...

  5. Dalvik模式下基于Android运行时类加载的函数dexFindClass脱壳

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78003184 前段时间在看雪论坛发现了<发现一个安卓万能脱壳方法>这篇 ...

  6. SDL播放YUV——循环

    #include "SDL.h" #include "as_lesson_log.h" #define PATH_YUV420 "/sdcard/ou ...

  7. SDL 开发实战(六): 使用 SDL 实现 YUV 播放器

    前面铺垫了这么多,现在终于进入核心的主题了,那就是使用SDL播放视频,本节我们将使用SDL播放YUV视频,也就是做一个YUV播放器. 下面说明一下使用SDL播放YUV视频的基本流程,主要分为两大部分: ...

  8. Android下OpenCV的环境搭建

    目录(?)[-] 前言 系统环境 相关工具 Android ADT环境搭建 Android SDK环境变量的配置 Android NDK的安装与配置 OpenCV for Android 环境搭建 基 ...

  9. android下的数据存储

    android下数据存储的几种方式:(简单讨论) 1.文件 举例:登陆时“记住密码” 因为是基于Linux系统,直接建文件,文件会出现在项目工程:而手机登陆时,应该把文件放在手机里,通常数据放在dat ...

随机推荐

  1. 【LeetCode】215. Kth Largest Element in an Array (2 solutions)

    Kth Largest Element in an Array Find the kth largest element in an unsorted array. Note that it is t ...

  2. 树莓派进阶之路 (019) - 树莓派通过filezilla,samba与PC文件共享(转)

    虽然我们可以很方便的通过ssh譬如putty或者vnc连接操控树莓派,但是毕竟树莓派资源没那么高,在上面编程,调试要吃力的多.所以还是想在pc上编程上传到树莓派或者最好,文件共享,可以直接读写共同的文 ...

  3. mariadb/mysql配置允许远程访问方式

    首先配置允许访问的用户,采用授权的方式给用户权限 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '123456' WITH GRANT ...

  4. Mac 下查看网络端口占用情况

    1.Mac 下查看网络端口占用情况 有的时候关闭了服务器,但是端口还是占用,解决的方法是 kill 掉占用该端口的进程. # 查看 8009 端口的占用情况 $ lsof -i:8009 可以看到,该 ...

  5. Swift 封装

    前言 封装主要有两大目的:一是为了我们使用数据更加方便,二是为了数据保护. 1.Swift 访问修饰符 在 Swift 语言中,访问修饰符也分为三类,分别是 private.internal.publ ...

  6. emergency monitoring和real-time ADDM

    emergency monitoring面临的挑战: 1.sick systems 2.slow database -所有用户查询响应慢 -性能界面刷新数据慢 -吞吐量严重降低 3.因为内部资源竞争数 ...

  7. ldconfig命令

    ldconfig是一个动态链接库管理命令 为了让动态链接库为系统所共享,还需运行动态链接库的管理命令--ldconfigldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib) ...

  8. 转 阿里Dubbo疯狂更新,关Spring Cloud什么事?

    原文地址: http://www.ityouknow.com/springcloud/2017/11/20/dubbo-update-again.html阿里Dubbo疯狂更新,关Spring Clo ...

  9. HTTP 请求头 详解

    转载:https://kb.cnblogs.com/page/92320/ HTTP(HyperTextTransferProtocol)即超文本传输协议,目前网页传输的的通用协议.HTTP协议采用了 ...

  10. MSSQL2005:“超时时间已到。在操作完成之前超时时间已过或服务器未响应”

    1.今天在整合项目中有这样一个需求,就是要改变以存在表字段的文本的大小,如把char(15)改成varchar(50). 2.此时以存在表已有1885742条数据,在直接下面进行调用 ALTER TA ...