当前位置: 首页 > news >正文

在VS2017下FFmpeg+SDL编写最简单的视频播放器

1.下载ShiftMediaProject/FFmpeg

2.下载SDL2

3.新建VC++控制台应用

3.配置include和lib

 4.把FFmpeg和SDL的dll 复制到工程Debug目录下,并设置调试命令

5.复制一下mp4视频到工程Debug目录下(复制一份到*.vcxproj同一目录,用于调试)

6.编写代码

#include <stdio.h>
#include <stdlib.h>
#include <iostream>extern "C" {
#include "libavcodec\avcodec.h"
#include "libavformat\avformat.h"
#include "libavutil\avutil.h"
#include "SDL.h"
}SDL_Window *window;
SDL_Texture* texture;
SDL_Renderer* renderer;
SDL_Rect rect;
int width;
int height;void display(AVFrame* frame);
void iniSdl();#undef main
int main()
{int ret = -1;AVFormatContext* ctx = avformat_alloc_context();ret = avformat_open_input(&ctx, "my.mp4", NULL, NULL);ret = avformat_find_stream_info(ctx, NULL);int videoindex = -1;for (int i = 0; i < ctx->nb_streams; i++){if (ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO){videoindex = i;break;}}const AVCodec* codec = avcodec_find_decoder(ctx->streams[videoindex]->codecpar->codec_id);AVCodecContext* avcc = avcodec_alloc_context3(codec);ret = avcodec_parameters_to_context(avcc, ctx->streams[videoindex]->codecpar);ret = avcodec_open2(avcc, codec, NULL);width = avcc->width;height = avcc->height;rect.x = 0;rect.y = 0;rect.h = height;rect.w = width;iniSdl();AVFrame* frame = av_frame_alloc();AVPacket* packet = av_packet_alloc();while (true){ret = av_read_frame(ctx, packet);if (ret >=0){if (packet->stream_index == videoindex){ret = avcodec_send_packet(avcc, packet);while (ret >= 0){ret = avcodec_receive_frame(avcc, frame);if (ret >= 0){display(frame);av_frame_unref(frame);}else{av_frame_unref(frame);break;}}}			}else{av_packet_unref(packet);break;}}SDL_DestroyWindow(window);std::cout << "finish\n";
}void display(AVFrame* frame)
{SDL_UpdateYUVTexture(texture, &rect, frame->data[0], frame->linesize[0], frame->data[1], frame->linesize[1], frame->data[2], frame->linesize[2]);SDL_RenderClear(renderer);SDL_RenderCopy(renderer, texture, NULL, NULL);SDL_RenderPresent(renderer);
}void iniSdl()
{SDL_Init(SDL_INIT_VIDEO);window = SDL_CreateWindow("test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_RESIZABLE);renderer = SDL_CreateRenderer(window, -1, 0);texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_IYUV, SDL_TEXTUREACCESS_STREAMING, width, height);
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 科研绘图系列:R语言金字塔图(pyramid plot)
  • Linux上启动和停止jar
  • 【C++】P10287 [GESP样题 七级] 最长不下降子序列 题解_动态规划dp_图论_拓扑排序_洛谷_算法竞赛
  • DeepSORT:高效对象跟踪算法
  • 实验四:图像的锐化处理
  • LLM量化--AWQ论文阅读笔记
  • 达梦数据库的系统视图v$sqltext
  • HTML 基础
  • Nginx的反向代理缓存
  • Web3 ETF软件系统的功能
  • Spring MVC入门5
  • Gitee简易使用流程(后期优化)
  • 《算法笔记》总结No.7——二分(多例题详解版)
  • uniapp字符串转base64,无需导入依赖(多端支持)
  • Chrome调试工具
  • 【Amaple教程】5. 插件
  • 【附node操作实例】redis简明入门系列—字符串类型
  • angular2开源库收集
  • Magento 1.x 中文订单打印乱码
  • Meteor的表单提交:Form
  • SQLServer之索引简介
  • swift基础之_对象 实例方法 对象方法。
  • 从零开始的无人驾驶 1
  • 从零开始学习部署
  • 给Prometheus造假数据的方法
  • 好的网址,关于.net 4.0 ,vs 2010
  • 七牛云假注销小指南
  • 容器服务kubernetes弹性伸缩高级用法
  • 树莓派 - 使用须知
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 详解移动APP与web APP的区别
  • 一些css基础学习笔记
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​520就是要宠粉,你的心头书我买单
  • ‌移动管家手机智能控制汽车系统
  • #pragma预处理命令
  • (10)STL算法之搜索(二) 二分查找
  • (2)Java 简介
  • (LeetCode 49)Anagrams
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (rabbitmq的高级特性)消息可靠性
  • (函数)颠倒字符串顺序(C语言)
  • (三)mysql_MYSQL(三)
  • (十五)使用Nexus创建Maven私服
  • (一)模式识别——基于SVM的道路分割实验(附资源)
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript
  • .NET Core跨平台微服务学习资源
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .net mvc部分视图
  • .net 受管制代码