【转载】使用SDL播放YUV图像数据(转) 分类: ffmpeg-SDL-VLC-Live555 2013-08-28 11:33 757人阅读 评论(0) 收藏
2013-08-28 11:33
666 查看
SDL提供了针对YUV格式数据的直接写屏操作。废话不多说,直接上代码吧
/**
* file showyuv.c
* author: rare
* date: 2009/12/06
* email: dux003#163.com
*/
#include <stdlib.h>
#include "SDL.h"
int main(int argc , char* argv[])
{
int i = 1;
int x, y;
int w = 176;
int h = 144;
char c = 'n';
FILE* fp;
char filename[64];
unsigned char* pY;
unsigned char* pU;
unsigned char* pV;
SDL_Rect rect;
if (SDL_Init(SDL_INIT_VIDEO) < 0)
{
fprintf(stderr, "can not initialize SDL:%s\n", SDL_GetError());
exit(1);
}
atexit(SDL_Quit);
SDL_Surface* screen = SDL_SetVideoMode(w, h, 0, 0);
if (screen == NULL)
{
fprintf(stderr, "create surface error!\n");
exit(1);
}
SDL_Overlay* verlay = SDL_CreateYUVOverlay(w, h, SDL_YV12_OVERLAY, screen);
if (overlay == NULL)
{
fprintf(stderr, "create overlay error!\n");
exit(1);
}
printf("w:%d, h:%d, planes:%d\n", overlay->w, overlay->h, overlay->planes);
printf("pitches:%d, %d, %d\n", overlay->pitches[0], overlay->pitches[1], overlay->pitches[2]);
pY = (unsigned char*)malloc(w*h);
pU = (unsigned char*)malloc(w*h/4);
pV = (unsigned char*)malloc(w*h/4);
while (i<=96)
{
SDL_LockSurface(screen);
SDL_LockYUVOverlay(overlay);
sprintf(filename, "./carphone/carphone%03d.yuv", i);
printf("%s\n", filename);
fp = fopen(filename, "rb");
if (fp == NULL)
{
fprintf(stderr, "open file error!\n");
exit(1);
}
fread(pY, 1, w*h, fp);
fread(pU, 1, w*h/4, fp);
fread(pV, 1, w*h/4, fp);
memcpy(overlay->pixels[0], pY, w*h);
memcpy(overlay->pixels[1], pV, w*h/4);
memcpy(overlay->pixels[2], pU, w*h/4);
fclose(fp);
SDL_UnlockYUVOverlay(overlay);
SDL_UnlockSurface(screen);
rect.w = w;
rect.h = h;
rect.x = rect.y = 0;
SDL_DisplayYUVOverlay(overlay, &rect);
SDL_Delay(40);
i += 1;
}
free(pY);
free(pU);
free(pV);
while (c != 'q')
scanf("%c", &c);
SDL_FreeYUVOverlay(overlay);
SDL_FreeSurface(screen);
return 0;
}
其中测试序列是我在网上找的,url链接为:http://www.cipr.rpi.edu/resource/sequences/sequences/qcif/yuv/qcif_yuv_carphone.zip
代码比较粗糙,有改进意见的欢迎发邮件给我,其它的就免了
/**
* file showyuv.c
* author: rare
* date: 2009/12/06
* email: dux003#163.com
*/
#include <stdlib.h>
#include "SDL.h"
int main(int argc , char* argv[])
{
int i = 1;
int x, y;
int w = 176;
int h = 144;
char c = 'n';
FILE* fp;
char filename[64];
unsigned char* pY;
unsigned char* pU;
unsigned char* pV;
SDL_Rect rect;
if (SDL_Init(SDL_INIT_VIDEO) < 0)
{
fprintf(stderr, "can not initialize SDL:%s\n", SDL_GetError());
exit(1);
}
atexit(SDL_Quit);
SDL_Surface* screen = SDL_SetVideoMode(w, h, 0, 0);
if (screen == NULL)
{
fprintf(stderr, "create surface error!\n");
exit(1);
}
SDL_Overlay* verlay = SDL_CreateYUVOverlay(w, h, SDL_YV12_OVERLAY, screen);
if (overlay == NULL)
{
fprintf(stderr, "create overlay error!\n");
exit(1);
}
printf("w:%d, h:%d, planes:%d\n", overlay->w, overlay->h, overlay->planes);
printf("pitches:%d, %d, %d\n", overlay->pitches[0], overlay->pitches[1], overlay->pitches[2]);
pY = (unsigned char*)malloc(w*h);
pU = (unsigned char*)malloc(w*h/4);
pV = (unsigned char*)malloc(w*h/4);
while (i<=96)
{
SDL_LockSurface(screen);
SDL_LockYUVOverlay(overlay);
sprintf(filename, "./carphone/carphone%03d.yuv", i);
printf("%s\n", filename);
fp = fopen(filename, "rb");
if (fp == NULL)
{
fprintf(stderr, "open file error!\n");
exit(1);
}
fread(pY, 1, w*h, fp);
fread(pU, 1, w*h/4, fp);
fread(pV, 1, w*h/4, fp);
memcpy(overlay->pixels[0], pY, w*h);
memcpy(overlay->pixels[1], pV, w*h/4);
memcpy(overlay->pixels[2], pU, w*h/4);
fclose(fp);
SDL_UnlockYUVOverlay(overlay);
SDL_UnlockSurface(screen);
rect.w = w;
rect.h = h;
rect.x = rect.y = 0;
SDL_DisplayYUVOverlay(overlay, &rect);
SDL_Delay(40);
i += 1;
}
free(pY);
free(pU);
free(pV);
while (c != 'q')
scanf("%c", &c);
SDL_FreeYUVOverlay(overlay);
SDL_FreeSurface(screen);
return 0;
}
其中测试序列是我在网上找的,url链接为:http://www.cipr.rpi.edu/resource/sequences/sequences/qcif/yuv/qcif_yuv_carphone.zip
代码比较粗糙,有改进意见的欢迎发邮件给我,其它的就免了
相关文章推荐
- 【转载】SDL2.0在mfc窗口中显示yuv的一种方法 分类: ffmpeg-SDL-VLC-Live555 2013-08-28 11:33 1124人阅读 评论(0) 收藏
- FFMPEG:H264解码-SDL显示(RGB32、RGB24、YUV420P、YUV422) 分类: DirectX ffmpeg-SDL-VLC-Live555 VC++ 2014-11-25 17:45 726人阅读 评论(0) 收藏
- 嵌入式linux------SDL移植(am335x下显示yuv420) 分类: TI-AM335X arm-linux-Ubuntu ffmpeg-SDL-VLC-Live555 2015-07-28 16:35 136人阅读 评论(0) 收藏
- DirectX--yuv420p上实现的字符叠加 分类: ffmpeg-SDL-VLC-Live555 2014-12-17 11:15 473人阅读 评论(0) 收藏
- 用SDL库播放yuy2 Packed mode 分类: ffmpeg-SDL-VLC-Live555 2013-10-30 15:34 575人阅读 评论(0) 收藏
- 使用ffserver实现转发实时流媒体(摄像头捕获) 分类: TI-AM335X arm-linux-Ubuntu ffmpeg-SDL-VLC-Live555 2015-08-04 09:36 5人阅读 评论(0) 收藏
- FFMPEG:压缩之H264编码(YUV420P->H264) 分类: DirectX ffmpeg-SDL-VLC-Live555 2014-11-26 14:31 997人阅读 评论(0) 收藏
- MinGW下简单编译FFmpeg 分类: ffmpeg-SDL-VLC-Live555 2013-07-22 16:30 378人阅读 评论(0) 收藏
- live555编译环境 分类: ffmpeg-SDL-VLC-Live555 2015-04-07 17:28 253人阅读 评论(0) 收藏
- 玩转FFmpeg的7个小技巧 分类: ffmpeg-SDL-VLC-Live555 2013-07-22 16:30 334人阅读 评论(0) 收藏
- FFMPEG在windows平台编译的详细过程,包括环境安装 分类: ffmpeg-SDL-VLC-Live555 2013-08-01 11:23 845人阅读 评论(0) 收藏
- ffmpeg入门之 Tutorial01 分类: ffmpeg-SDL-VLC-Live555 2013-08-22 17:54 495人阅读 评论(0) 收藏
- 嵌入式linux------ffmpeg移植 解码H264(am335x解码H264到yuv420并通过SDL显示) 分类: arm-linux-Ubuntu TI-AM335X ffmpeg-SDL-VLC-Live555 2015-07-29 10:28 154人阅读 评论(0) 收藏
- 利用ffmpeg做视频解码的顺序 分类: ffmpeg-SDL-VLC-Live555 2013-08-16 08:23 806人阅读 评论(0) 收藏
- 如何使用DirectDraw直接显示RGB、YUV视频数据(播放yuv) 分类: VC++ DirectX 2013-11-09 09:39 758人阅读 评论(0) 收藏
- 关于TS流的解析 分类: ffmpeg-SDL-VLC-Live555 2015-04-02 15:50 490人阅读 评论(0) 收藏
- FFmpeg-音频和视频应用程序的瑞士军刀 分类: ffmpeg-SDL-VLC-Live555 2013-07-22 16:30 411人阅读 评论(0) 收藏
- gstreamer在Ubuntu下构建开发环境 分类: ffmpeg-SDL-VLC-Live555 2015-04-07 17:56 324人阅读 评论(0) 收藏
- 在SDL工程中让SDL_ttf渲染汉字 分类: ffmpeg-SDL-VLC-Live555 2014-12-29 17:48 215人阅读 评论(0) 收藏
- TS流文件 分类: ffmpeg-SDL-VLC-Live555 2015-04-02 15:40 399人阅读 评论(0) 收藏