`
lobin
  • 浏览: 417634 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

C: Linux C 编程 - SDL视频处理

 
阅读更多

播放YUV格式的视频

此程序支持显示yuv420p,yuvj420p格式的YUV视频。其他格式的YUV视频没测试。

#include<stdio.h>
#include<string.h>
#include<SDL_video.h>
#include<SDL_render.h>
#include<SDL_surface.h>
#include<SDL_events.h>

int main(int argc, char **argv)
{
  char *filename;
  FILE *fp = NULL;
  
  SDL_Window *pWin;
  int width = 640;
  int height = 360;

  SDL_Renderer *renderer;
  SDL_Texture *texture;
  SDL_Rect rect;

  int pix_width;
  int pix_height;
  // sample bit size
  int sample_bit_size = 12;// 24 * 8; // 12; 1;

  int center = 0;
  int full_screen = 0;

  unsigned char *buf;
  int buf_size;

  SDL_Event e;
  int exit = 0;

  if (argc < 4)
  {
    fprintf(stderr, "invalid args.\n");
    return 1;
  }
  filename = argv[1];
  sscanf(argv[2], "%d", &pix_width);
  sscanf(argv[3], "%d", &pix_height);
  if (argc == 5)
  {
    char* param = argv[4];
    if (strcmp(param, "--center") == 0)
    {
      center = !center;
    }
  }
  if (argc == 6)
  {
    char* param = argv[5];
    if (strcmp(param, "--full-screen") == 0)
    {
      full_screen = !full_screen;
    }
  }

  if (pix_width <= 0 || pix_height <= 0)
  {
    fprintf(stderr, "invalid arg: pix width or height.\n");
    return 1;
  }

  if (pix_width > width)
  {
    width = pix_width;
  }
  if (pix_height > height)
  {
    height = pix_height;
  }
  fprintf(stdout, "video: %s, pixel: width=%d, height=%d, window: width=%d, height=%d, full screen:%s.\n", filename, pix_width, pix_height, width, height, full_screen ? "yes" : "no");

  pWin = SDL_CreateWindow("Player", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_MAXIMIZED); // SDL_WINDOW_FULLSCREEN, SDL_WINDOW_RESIZABLE
  if (pWin == NULL)
  {
    fprintf(stderr, "create window err.\n");
    return 1;
  }

  SDL_GetWindowSize(pWin, &width, &height);
  fprintf(stdout, "video: %s, pixel: width=%d, height=%d, window: width=%d, height=%d, full screen:%s.\n", filename, pix_width, pix_height, width, height, full_screen ? "yes" : "no");


  renderer = SDL_CreateRenderer(pWin, -1, 0);
  if (renderer == NULL) 
  {
    fprintf(stderr, "create renderer err: %s\n", SDL_GetError());
    return 1;
  }

  texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_IYUV, SDL_TEXTUREACCESS_STREAMING, pix_width, pix_height);
  //texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_YUY2, SDL_TEXTUREACCESS_STREAMING, pix_width, pix_height);
  //texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_UYVY, SDL_TEXTUREACCESS_STREAMING, pix_width, pix_height);
  //texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_YVYU, SDL_TEXTUREACCESS_STREAMING, pix_width, pix_height);
  if (texture == NULL) 
  {
    fprintf(stderr, "create texture err: %s\n", SDL_GetError());
    return 1;
  }

  fp = fopen(filename, "rb+");
  if (fp == NULL) 
  {
    fprintf(stderr, "open err: %s\n", filename);
    return 1;
  }

  buf_size = pix_width * pix_height * sample_bit_size / 8;
  buf = (unsigned char *) malloc(buf_size + 1);
  while (1)
  {
    if (fread(buf, buf_size, 1, fp) != 1) 
    {
      if (feof(fp))
      {
        break;
      }
      continue;
    }
    SDL_UpdateTexture(texture, NULL, buf, pix_width);
    rect.x = center ? (width - pix_width) / 2 : 0;
    rect.y = center ? (height - pix_height) / 2 : 0;
    rect.w = full_screen ? width : pix_width;
    rect.h = full_screen ? height : pix_height;

    SDL_RenderClear(renderer);
    SDL_RenderCopy(renderer, texture, NULL, &rect);
    SDL_RenderPresent(renderer);

    SDL_Delay(40);
  }

  while (! exit)
  {
  
    while (SDL_PollEvent(&e))
    {
      if (e.type == SDL_QUIT)
      {
        exit = 1;
      }
    }
  }

  SDL_DestroyWindow(pWin);
  SDL_Quit();
  return 0;
}

编译

这里一次性完成编译链接。编译的时候注意通过“-I”指定头文件目录,在链接的时候通过“-L”指定要链接的静态库文件目录,以及通过“-l”指定要链接的静态库。

 

gcc -I D:\sbin\usr\local\sdl\include\SDL2 -L D:\sbin\usr\local\sdl\lib sdl_video_test.c -o sdl_video_test -lSDL2

 

运行

在运行之前SDL2.dll拷贝到程序目录下:

>cp -rf d:\sbin\usr\local\sdl\bin\SDL2.dll .

 

.\sdl_video_test H:\\IMG_0024-pix_fmt_yuvj420p_320x180.yuv 320 180

.\sdl_video_test H:\\IMG_0024-pix_fmt_yuvj420p_320x568.yuv 320 568

 

.\sdl_video_test H:\\IMG_0024-pix_fmt_yuvj420p_320x180.yuv 320 180 --center

.\sdl_video_test H:\\IMG_0024-pix_fmt_yuvj420p_320x568.yuv 320 568 --center

 

.\sdl_video_test H:\\IMG_0024-pix_fmt_yuvj420p_320x180.yuv 320 180 --center --full-screen 

.\sdl_video_test H:\\IMG_0024-pix_fmt_yuvj420p_320x568.yuv 320 568 --center --full-screen

 

 

分享到:
评论

相关推荐

    C语言案例1:SDL2游戏编程基础之环境准备-配套资源.zip

    在本资源包中,我们主要关注的是C语言与SDL2库结合进行游戏编程的基础知识。SDL2(Simple DirectMedia Layer 2)是一个跨平台的开发库,它为开发者提供了丰富的功能,包括图形渲染、音频处理、事件管理等,是创建2D...

    开源项目-gen2brain-go-sdl2-android-example.zip

    SDL2(Simple DirectMedia Layer 2)是一个跨平台的开发库,用于处理图形、音频、输入设备等多媒体元素。它在游戏开发领域特别受欢迎,因为它的API简洁高效,并且支持多种操作系统,包括Windows、Linux、Mac OS X...

    sdl的linux源码包SDL2-2.0.2

    6. **视频流支持**:通过VAAPI(Video Acceleration API)和OpenGL ES,SDL2可以处理视频流,进行视频播放。 7. **多线程编程**:SDL2支持多线程编程,允许开发者并行处理任务,提高程序效率。 8. **网络支持**:...

    Android-运行在Android之上的Go-SDL2示例

    SDL2的一个主要优点是它的跨平台性,可以在Windows、Linux、Mac OS X、Android和iOS等操作系统上运行。 **Android NDK和JNI** 为了在Android上使用C/C++库,如SDL2,开发者需要使用Android Native Development Kit ...

    imgviewer-sdl:imgviewer-sdl

    - C++是C语言的增强版,增加了面向对象编程特性,同时保留了C语言的效率和灵活性。 - 在imgviewer-sdl项目中,C++用于编写应用程序的主要逻辑,包括图像加载、显示、缩放和旋转等功能。 ### 图像查看器功能 - 图像...

    node-sdl:Node.js的SDL2绑定

    SDL2是用C语言编写的,但具有良好的可扩展性,可以通过绑定到其他编程语言,如Python、Java、甚至JavaScript。它的核心功能包括: 1. **图形渲染**:SDL2支持2D渲染,可以创建窗口、绘制图形、线条和文本。它还提供...

    JEDI_SDL delphi开发库(可以用来开发跨WINDOWS和LINUX的游戏)

    JEDI_SDL Delphi 开发库是一个强大的工具,它允许开发者使用Delphi编程语言来创建跨平台的游戏和多媒体应用,支持Windows和Linux操作系统。这个库是基于Simple DirectMedia Layer (SDL) 库的,SDL是一个广泛使用的跨...

    alien-sdl-开源

    (let ((sdl-init (sdl:SDL_Init sdl:+SDL_INIT_VIDEO+))) (when (= sdl-init 0) (error "Failed to initialize SDL.")) (let ((window (sdl:SDL_CreateWindow title sdl:+SDL_WINDOWPOS_UNDEFINED+ sdl:+SDL_...

    SDL2.0.3源码安装包

    2. **Linux环境下的图形编程**:在Linux系统中,开发者通常需要直接操作X Window System或Wayland等窗口系统来实现图形界面,而SDL库则抽象了这些复杂的接口,提供了一套统一的编程模型。 3. **SDL2.0.3版本特点**...

    视频显示库SDL

    **视频显示库SDL** ...总之,SDL是一个强大的多媒体处理库,为开发者提供了高效且简洁的接口来处理视频显示和用户交互。无论你是初学者还是经验丰富的程序员,SDL都能帮助你轻松地实现多媒体应用和游戏的开发。

    快乐成长贪吃蛇(Linux+C+SDL)

    《快乐成长贪吃蛇》是一款基于Linux平台,利用C语言编程和SDL库开发的教育娱乐游戏。这款项目旨在将经典游戏“贪吃蛇”与学习元素相结合,特别针对100美元笔记本用户,旨在提供一个寓教于乐的环境,帮助儿童在玩乐中...

    ffmpeg与SDL编程

    ffmpeg 和 SDL 的结合使用,能够有效解决音视频解码和播放的问题,在Linux及嵌入式系统开发中有重要的应用价值。通过对上述内容的学习,开发者能够更好地掌握音视频处理的核心技术,并能够在实际项目中灵活运用这些...

    C语言+SDL(linux贪吃蛇游戏)

    贪吃蛇游戏,作为一个经典的编程实践项目,可以很好地展示C语言的基本功能以及SDL库在图形界面处理中的应用。本项目结合了C语言与SDL(Simple DirectMedia Layer)库,使得在Linux环境下开发图形化游戏成为可能。...

    sdl12-compat:一个SDL-1.2兼容性层,在后台使用SDL 2.0

    **C语言编程** sdl12-compat是用C语言编写的,这是SDL库的传统选择,因为C语言具有良好的跨平台性和高效的性能。C语言也使得SDL库成为许多其他语言(如C++、Python、JavaScript等)的绑定和接口的基础。 **项目文件...

    sdl.rar SDL2-2.0.14 SDL源码

    **标题与描述解析** ...要学习和使用SDL2,开发者通常需要具备C或C++编程基础,了解基本的计算机图形学原理,并熟悉使用相应平台的开发环境。通过阅读官方文档和实践项目,可以逐步掌握SDL2的各种功能。

    linux下实现ffmpeg+sdl视音频播放

    在Linux环境下,使用FFmpeg和SDL(Simple DirectMedia Layer)框架...这个过程中涉及的知识点包括音视频编码解码原理、多媒体文件格式、流处理技术、图形用户界面编程等,是深入理解多媒体处理和Linux开发的重要实践。

    基于SDL的音乐播放器

    - 使用SDL时,开发者可能需要熟悉C或C++编程,因为SDL是用这些语言编写的。同时,调试过程中可能涉及音频解码错误、内存管理和性能优化等问题。 通过这个基于SDL的音乐播放器,我们可以学习到多媒体处理、用户界面...

    SDL2-2.0.12-win-x64_x86.zip

    - **输入管理**:处理键盘、鼠标、触摸屏、游戏手柄等多种输入设备,提供统一的API接口。 - **窗口管理**:创建和管理窗口,包括全屏切换、分辨率更改等功能。 - **文件系统支持**:读写文件、管理文件流,支持...

    linux下V4L2+SDL摄像头采集显示程序

    关键点有二:其一,从video4linux2的编程接口笔者了解到其笔记本摄像头支持YUYV视频帧格式,显示在 SDL上需要将YUYV格式转换成SDL支持的显示格式RGB。 其二,要学会使用video4linux2获得摄像头YUYV数据流的程序框架...

    SDL2-2.28.5.zip

    1. **多平台兼容性**:SDL的一个核心优势是其跨平台性,它可以在Windows、Linux、Mac OS X、iOS、Android等多种操作系统上运行,使得开发者可以编写一次代码,轻松移植到不同平台上。 2. **图形渲染**:SDL 2.28.5 ...

Global site tag (gtag.js) - Google Analytics