【转载】使用SDL播放YUV图像数据(转)

简介: <div class="bct fc05 fc11 nbw-blog ztag">SDL提供了针对YUV格式<u><strong><font color="#656d77">数据</font></strong></u>的直接写屏操作。废话不多说,直接上代码吧<br><br>/**<br> * file showyuv.c<br> * author: rare<br> * date: 2009/
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
代码比较粗糙,有改进意见的欢迎发邮件给我,其它的就免了
相关文章
|
28天前
|
编解码 计算机视觉 Python
Opencv学习笔记(九):通过CV2将摄像头视频流保存为视频文件
使用OpenCV库通过CV2将摄像头视频流保存为视频文件,包括定义视频编码格式、设置保存路径、通过write写入视频文件,并提供了相应的Python代码示例。
108 0
|
30天前
|
Windows
SDL基础使用07(YUV数据显示)
使用SDL库在Windows上处理和显示YUV数据,包括生成随机YUV数据、播放YUV文件以及实现带缩放的实时渲染。
32 1
|
6月前
|
存储 编解码 算法
深度剖析FFmpeg视频解码后的帧处理到Qt显示 从AVFrame到QImage的转换(一)
深度剖析FFmpeg视频解码后的帧处理到Qt显示 从AVFrame到QImage的转换
424 1
|
6月前
|
编解码 算法 vr&ar
深度剖析FFmpeg视频解码后的帧处理到Qt显示 从AVFrame到QImage的转换(二)
深度剖析FFmpeg视频解码后的帧处理到Qt显示 从AVFrame到QImage的转换
225 1
|
6月前
|
内存技术
SDL播放PCM
SDL播放PCM
39 0
|
编解码 Linux
SDL图像显示
计算机屏幕上的图像是由一个一个点组成的,不同颜色的点集合在一起,就构成了一幅图片。在屏幕上显示图像,就是对每一个像素点进行着色。首先我们对图片进行分析,取出每一个点的像素,CPU会将其保存在显存中,然后计算机会根据保存的像素,在屏幕上从上到下逐行逐点显示出来
172 0
|
存储 编解码 算法
【Android FFMPEG 开发】FFMPEG AVFrame 图像格式转换 YUV -> RGBA ( 获取 SwsContext | 初始化图像数据存储内存 | 图像格式转换 )
【Android FFMPEG 开发】FFMPEG AVFrame 图像格式转换 YUV -> RGBA ( 获取 SwsContext | 初始化图像数据存储内存 | 图像格式转换 )
423 0
|
存储 编解码 数据处理
一文掌握 YUV 图像的基本处理
YUV 是一种色彩编码模型,也叫做 YCbCr,其中 “Y” 表示明亮度(Luminance),“U” 和 “V” 分别表示色度(Chrominance)和浓度(Chroma)。
1323 0
一文掌握 YUV 图像的基本处理
|
消息中间件
【音视频连载-006】基础学习篇-SDL 播放 YUV 视频文件
在前面的文章中,我们已经能够加载 YUV 帧并显示了,那是把一张图片转换成 YUV 帧得到的素材。 如果是一个 YUV 视频文件的话,那就是很多 YUV 帧连续在一起,既然能展示一帧,那肯定可以连续展示多帧。 接下来就要这样的操作。
244 0
【音视频连载-006】基础学习篇-SDL 播放 YUV 视频文件
|
内存技术
【音视频连载-008】基础学习篇-SDL 播放 PCM 音频文件(下)
接上篇 SDL 播放 PCM 音频文件,已经实现了 推 的模式去播放,接下来看看 拉 的模式如何实现。
210 0
【音视频连载-008】基础学习篇-SDL 播放 PCM 音频文件(下)