博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ffmpeg编程(二)
阅读量:7248 次
发布时间:2019-06-29

本文共 3004 字,大约阅读时间需要 10 分钟。

这篇主要讲如何把视频文件播放出来

如果对YUV没有基础的可以看下:

if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {                fprintf(stderr, "Could not initialize SDL - %s/n",                        SDL_GetError());                exit(1);            }

SDL_Init()函数告诉了SDL库,哪些特性我们将要用到,SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER分别是视频,音频和时间。

 

SDL_Surface *screen;            screen = SDL_SetVideoMode(pCodecCtx->width, pCodecCtx->height, 0,                    0);            if (!screen) {                fprintf(stderr, "SDL: could not set video mode - exiting/n");                exit(1);            }

SDL_Surface是显示图像的容器。

函数SDL_SetVideoMode(pCodecCtx->width, pCodecCtx->height, 0,0);来创建一个窗口,这个函数包含四个参数,依次是窗口的宽度、高度、单个像素占用位数和一个标记变量。其中第三个参数最为简单的方法是设置为0,这样它就为当前默认的显示设置)。最后一个参数用SDL_HWSURFACE和SDL_DOUBLEBUF.联起来使用要用或操作符: SDL_HWSURFACE | SDL_DOUBLEBUF。
SDL_SetVideoMode()函数不仅仅是创建了一个窗口,它还创建了一块内存区域叫"screen buffer",用来显示图像。这块区域负责显示画面到屏幕,标记变量SDL_HWSURFACE表示在显存里头创建缓存;SDL_DOUBLEBUF表示我要创建两个缓存区域,一个用作前端缓存,这里存放的就是我们正在显示到屏幕的内容;另一个用作后端缓存,这里存放的是我们将要显示到屏幕上的内容。当我们显示将要显示的内容时候,只需要交换前端缓存和后端缓存,这样后端缓存的内容就被显示出来。(译者注:也就是说前端缓存又变成了后端缓存,可以用来存放下一幅要显示的画面)这项技术叫做双缓存,用来加速图像的渲染过程。

  SDL_Overlay *bmp;    bmp = SDL_CreateYUVOverlay(pCodecCtx->width, pCodecCtx->height,                    SDL_YV12_OVERLAY, screen);

SDL_Overlay用于存储YUV。 

函数SDL_CreateYUVOverlay(pCodecCtx->width, pCodecCtx->height,SDL_YV12_OVERLAY, screen);负责创建YUV,参数分别是宽度,高度,YUV格式和SDL_Surface。

SDL_Rect rect;            if (frameFinished) {                SDL_LockYUVOverlay(bmp);                AVPicture pict;          //把YUV赋值给AVPicture                pict.data[0] = bmp->pixels[0];                pict.data[1] = bmp->pixels[2];                pict.data[2] = bmp->pixels[1];                pict.linesize[0] = bmp->pitches[0];                pict.linesize[1] = bmp->pitches[2];                pict.linesize[2] = bmp->pitches[1];                // Convert the image into YUV format that SDL uses                img_convert(&pict, PIX_FMT_YUV420P, (AVPicture *) pFrame,                        pCodecCtx->pix_fmt, pCodecCtx->width,                        pCodecCtx->height);                SDL_UnlockYUVOverlay(bmp);                rect.x = 0;                rect.y = 0;                rect.w = pCodecCtx->width;                rect.h = pCodecCtx->height;                SDL_DisplayYUVOverlay(bmp, &rect);            }

SDL_Rect定义了屏幕上的一个矩形区域。它被 SDL_BlitSurface() 等视频函数用来定义贴图区域。

 SDL_LockYUVOverlay(bmp);对YUV加锁。

自定义函数img_convert(&pict, PIX_FMT_YUV420P, (AVPicture *) pFrame, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height);负责把YUV转换成image。

SDL_UnlockYUVOverlay(bmp);对YUV解锁。

函数SDL_DisplayYUVOverlay(bmp, &rect);负责显示图片。

 

SDL_Event event;            av_free_packet(&packet);            SDL_PollEvent(&event);            switch (event.type) {            case SDL_QUIT:                SDL_Quit();                exit(0);                break;            default:                break;            }

 

视频退出功能。

c文件下载

转载于:https://www.cnblogs.com/nanguabing/archive/2012/04/12/2443724.html

你可能感兴趣的文章
linux 缩减文件系统大小 LVM
查看>>
对比文件md5值实现去重文件
查看>>
C#设计模式之二十三解释器模式(Interpreter Pattern)【行为型】
查看>>
js处理中文乱码记录/nodejs+express error 413
查看>>
基于Keepalived实现LVS双主高可用集群
查看>>
SqlServer 使用脚本创建分发服务及事务复制的可更新订阅
查看>>
什么是Floating (浮动)规则?
查看>>
分布式文件系统-FastDFS
查看>>
HTML5 rotate 做仪表盘
查看>>
为什么说荆州松滋刘氏采穴堂是刘开七、刘广传的后裔
查看>>
React中使用Ant Table组件
查看>>
第四篇 快速、轻量、可扩展、易于使用的EmEditor
查看>>
MySQL删除小写记录
查看>>
用shell脚本收集查询IP信息的网站
查看>>
shiro整合oauth
查看>>
超级网管员——网络管理
查看>>
AjaxControltoolkit(工具包)安装步骤说明
查看>>
利用组策略进行的一次Windows主机安全整改
查看>>
Ruby语法学习笔记(1)
查看>>
Windows Phone 7 使用选择器(Chooser)
查看>>