SDL播放YUV----单帧

用到的项目:Tocy-Android-SDLv2

 

C中的 入口: main.c as_lesson_XXX.c

 

bmp_main :

在C中定义文件的路径: char *filepath = "/sdcard/hello_world.bmp"; (貌似可以直接调用)

 

SDL 初始化: 图像,视频他初始化3个,音频只初始化SDL_INIT_AUDIO。

SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)

 

创建窗口 和渲染器

SDL_CreateWindow SDL_CreateRenderer (图片,YUV都是一样的参数)

 

图片:SDL_CreateWindow("Hello World!", 100, 100, 640, 480,SDL_WINDOW_SHOWN);

YUV:SDL_CreateWindow("Hello World!", 100, 100, 640, 480, SDL_WINDOW_SHOWN);

音频:不需要

 

加载资源

 

图像加载: SDL_Surface * bmp = SDL_LoadBMP(filepath); 自带的API

YUV加载: load_yuv(yuv_path) //自己写的加载YUV方法

 

创建纹理texture

图片:SDL_CreateTextureFromSurface(render, bmp);

YUV:texture_create();——SDL_CreateTexture(render, SDL_PIXELFORMAT_IYUV, SDL_TEXTUREACCESS_STREAMING, w, h);

 

创建纹理时候要选择合适的纹理格式来装,如: SDL_PIXELFORMAT_IYUV、SDL_PIXELFORMAT_YV12、

 

设置填充(更新)纹理数据

1,用SDL的API接口 SDL_UpdateTexture(SDL_Texture* texture, const SDL_Rect* rect, const void* pixels, int pitch)

例子:SDL_UpdateTexture( m_pTexture, NULL, YUV_pBuffer, m_nWidth);

一般第二个是空,更新整个区域,第三个是一个YUV帧数据大小,第四是一行(长)的数据。

2,用TONY自己建的。texture_update() ------SDL_LockTexture锁住,复制完再SDL_UnlockTexture解锁纹理

 

复制显示纹理到渲染器

SDL_RenderClear(render);

SDL_RenderCopy(render, texture, NULL, NULL);

SDL_RenderPresent(render); //显示

 

int SDLCALL SDL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * srcrect, const SDL_Rect * dstrect);

 

參数的含义例如以下。

renderer:渲染目标。

texture:输入纹理。

srcrect:选择输入纹理的一块矩形区域作为输入。设置为NULL的时候整个纹理作为输入。

dstrect:选择渲染目标的一块矩形区域作为输出。设置为NULL的时候整个渲染目标作为输出。

 

 

 

总结:

 

1,播放YUV时候,是不能获取视频的长和高的,要手动填写参数输入。YUV数据没有分辨率信息。

 

2,要给播放器提供你的YUV格式,一般是yuv420P都支持。SDL支持的格式在SDL_pixels.h

 

3,待优化:

竖屏时候窗口不能适应,只显示一半,切到横屏时候,拉伸全部。

路径参数是固定的,应该在java层传入 比较好。

 

4,帧率。 YUV没有帧率控制,它是所有的帧叠加在一起。 比如一共有90帧。

如果你以10帧播放,那么能放9s ,30帧播放,3s 就放完了。

TONY的demo播放视频只是放一帧而已……test_720x576.yuv

720X576 一帧的大小 720X576X1.5 = 622080字节 = 607.5KB

 

5, 转了一帧YUV数据播放是绿屏, 一看数据,都是00 ,没数据的。

看来要自己用FFmpeg转 查看FFMPEG转 YUV.note

用自己转的然后播放720的YUV帧,OK

 

6,全屏还会有状态栏。加上这句

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

 

 

 

 

 

posted @ 2019-04-26 17:13  风飘而去  阅读(921)  评论(0编辑  收藏  举报