Windows FFMPEG开发环境配置

1.去FFMPEG网站上下载Dev版本的库,里面有我们需要的头文件和lib文件,然后下载Shared版本的库,里面有我们需要的dll文件

http://ffmpeg.zeranoe.com/builds/

记得区分32位和64位的库,这里碰到一个大坑,就是我下载的是64位的库,但是创建工程的时候选的是32位的工程,导致链接的时候一直报

无法解析的外部符号 _av_register_all。。。(这个因为以前在Linux上使用的都是自己编译出来的库,所以没注意这个坑)

最后通过这个链接解决的

https://stackoverflow.com/questions/20672777/linker-error-using-ffmpeg-with-visual-studio-2013-express

 

2.把Dev库里解压出来的东西拷贝到工程中,Shared库中解压出来的东西拷贝到生成的bin文件目录(如release)

复制代码

G:\source\FFmpegDemo\FFmpegDemo\ffmpeg>
├─inc
│  ├─libavcodec
│  ├─libavdevice
│  ├─libavfilter
│  ├─libavformat
│  ├─libavutil
│  ├─libpostproc
│  ├─libswresample
│  └─libswscale
└─libsavcodec.libavdevice.libavfilter.libavformat.libavutil.libpostproc.libswresample.libswscale.lib

复制代码

3.右击工程“属性”,“C/C++”——>“附加包含目录”——>加入我们添加进来的头文件的路径

4.在源码中链接lib文件

#pragma comment(lib,"ffmpeg\\libs\\avutil.lib")
#pragma comment(lib,"ffmpeg\\libs\\avformat.lib")
#pragma comment(lib,"ffmpeg\\libs\\avcodec.lib")
#pragma comment(lib,"ffmpeg\\libs\\swscale.lib")

源码如下:

复制代码

//main.cpp
#include <stdio.h>
#include <stdlib.h>#pragma comment(lib,"ffmpeg\\libs\\avutil.lib")
#pragma comment(lib,"ffmpeg\\libs\\avformat.lib")
#pragma comment(lib,"ffmpeg\\libs\\avcodec.lib")
#pragma comment(lib,"ffmpeg\\libs\\swscale.lib")extern "C" 
{//编码
#include "libavcodec/avcodec.h"
//封装格式处理
#include "libavformat/avformat.h"
//像素处理
#include "libswscale/swscale.h"
};int main(int argc, char* argv[])
{//获取输入输出文件名const char *input = "test.mp4";const char *output = "test.yuv";//1.注册所有组件av_register_all();//封装格式上下文,统领全局的结构体,保存了视频文件封装格式的相关信息AVFormatContext *pFormatCtx = avformat_alloc_context();//2.打开输入视频文件if (avformat_open_input(&pFormatCtx, input, NULL, NULL) != 0){printf("%s", "无法打开输入视频文件");return -1;}//3.获取视频文件信息if (avformat_find_stream_info(pFormatCtx, NULL) < 0){printf("%s", "无法获取视频文件信息");return -1;}//获取视频流的索引位置//遍历所有类型的流(音频流、视频流、字幕流),找到视频流int v_stream_idx = -1;int i = 0;//number of streamsfor (; i < pFormatCtx->nb_streams; i++){//流的类型if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO){v_stream_idx = i;break;}}if (v_stream_idx == -1){printf("%s", "找不到视频流\n");return -1;}//只有知道视频的编码方式,才能够根据编码方式去找到解码器//获取视频流中的编解码上下文AVCodecContext *pCodecCtx = pFormatCtx->streams[v_stream_idx]->codec;//4.根据编解码上下文中的编码id查找对应的解码AVCodec *pCodec = avcodec_find_decoder(pCodecCtx->codec_id);if (pCodec == NULL){printf("%s", "找不到解码器\n");return -1;}//5.打开解码器if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0){printf("%s", "解码器无法打开\n");return -1;}//输出视频信息printf("视频的文件格式:%s", pFormatCtx->iformat->name);printf("视频时长:%d", (pFormatCtx->duration) / 1000000);printf("视频的宽高:%d,%d", pCodecCtx->width, pCodecCtx->height);printf("解码器的名称:%s", pCodec->name);//准备读取//AVPacket用于存储一帧一帧的压缩数据(H264)//缓冲区,开辟空间AVPacket *packet = (AVPacket*)av_malloc(sizeof(AVPacket));//AVFrame用于存储解码后的像素数据(YUV)//内存分配AVFrame *pFrame = av_frame_alloc();//YUV420AVFrame *pFrameYUV = av_frame_alloc();//只有指定了AVFrame的像素格式、画面大小才能真正分配内存//缓冲区分配内存uint8_t *out_buffer = (uint8_t *)av_malloc(avpicture_get_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height));//初始化缓冲区avpicture_fill((AVPicture *)pFrameYUV, out_buffer, AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);//用于转码(缩放)的参数,转之前的宽高,转之后的宽高,格式等struct SwsContext *sws_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt,pCodecCtx->width, pCodecCtx->height, AV_PIX_FMT_YUV420P,SWS_BICUBIC, NULL, NULL, NULL);int got_picture, ret;FILE *fp_yuv = fopen(output, "wb+");int frame_count = 0;//6.一帧一帧的读取压缩数据while (av_read_frame(pFormatCtx, packet) >= 0){//只要视频压缩数据(根据流的索引位置判断)if (packet->stream_index == v_stream_idx){//7.解码一帧视频压缩数据,得到视频像素数据ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, packet);if (ret < 0){printf("%s", "解码错误");return -1;}//为0说明解码完成,非0正在解码if (got_picture){//AVFrame转为像素格式YUV420,宽高//2 6输入、输出数据//3 7输入、输出画面一行的数据的大小 AVFrame 转换是一行一行转换的//4 输入数据第一列要转码的位置 从0开始//5 输入画面的高度sws_scale(sws_ctx, pFrame->data, pFrame->linesize, 0, pCodecCtx->height,pFrameYUV->data, pFrameYUV->linesize);//输出到YUV文件//AVFrame像素帧写入文件//data解码后的图像像素数据(音频采样数据)//Y 亮度 UV 色度(压缩了) 人对亮度更加敏感//U V 个数是Y的1/4int y_size = pCodecCtx->width * pCodecCtx->height;fwrite(pFrameYUV->data[0], 1, y_size, fp_yuv);fwrite(pFrameYUV->data[1], 1, y_size / 4, fp_yuv);fwrite(pFrameYUV->data[2], 1, y_size / 4, fp_yuv);frame_count++;printf("解码第%d帧\n", frame_count);}}//释放资源av_free_packet(packet);}fclose(fp_yuv);av_frame_free(&pFrame);avcodec_close(pCodecCtx);avformat_free_context(pFormatCtx);return 0;
}

复制代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432286.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ant命令行操作

Ant命令行操作 Ant构建文件可以将项目编译&#xff0c;打包&#xff0c;測试&#xff0c;它是Apache软件基金会jakarta文件夹中的一个子项目&#xff0c;具有跨平台性&#xff0c;操作简单&#xff0c;并且非常easy上手。 关于Ant执行&#xff0c;能够在项目中找到build.xml直接…

如何用用计算机名访问共享打印机,局域网怎么连接共享打印机共享

在局域网内各个版本系统共存的时候&#xff0c;win7版本的计算机连接共享打印机的时候就无法调度网络资源&#xff0c;导致无法添加和使用共享打印机&#xff0c;给办公带来不便下面是小编为大家整理的关于&#xff0c;一起来看看吧!共享打印机之前的准备&#xff1a;1、确保跟…

FFmpeg - C++中使用ffmpeg库

ffmpeg库的接口都是c函数&#xff0c;其头文件也没有extern "C"的声明&#xff0c;所以在cpp文件里调用ffmpeg函数要注意了。 一般来说&#xff0c;一个用C写成的库如果想被C/C同时可以使用&#xff0c;那在头文件应该加上 #ifdef __cplusplus extern "C" …

LeetCode-Spiral Matrix-螺旋矩阵

https://oj.leetcode.com/problems/spiral-matrix/ 题目没难度&#xff0c;就是循环把每一层的螺旋打印出来即可。需要注意每次螺旋大小缩小2&#xff0c;计算相应的位置并考虑左边界等于右边界的情况。 class Solution { public:int n,m;int cn,cm;vector <int> tot;vec…

在vlan2用计算机名访问,计算机是如何访问一个网页的?vlan间如何实现通信?

昨天我们发布了关于一文讲弄懂什么是vlan、三层交换机、网关、子网掩码&#xff0c;有很多朋友问到关于网络通信的原理&#xff0c;今天我们这一篇文章&#xff0c;算是对昨天文章进行一个补充。首先我们要访问互联网&#xff0c;必须自己电脑上面有ip地址、子网掩码、网关、dn…

可变參数

C中传递參数时&#xff0c;有时候不确定參数的数量&#xff0c;这时候能够使用可变參数。例如以下&#xff1a; 1、std::initializer_list C11标准&#xff0c;使用方法类似vector&#xff0c;參数类型需同样。使用方法例如以下&#xff1a; #include <initializer_list>…

使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码

ffmpeg开源库&#xff0c;实现将bmp格式的图片编码成x264文件&#xff0c;并将编码好的H264文件解码保存为BMP文件。 实现将视频文件yuv格式保存的图片格式的测试&#xff0c;图像格式png,jpg, gif等等测试均OK 自己根据博客的代码&#xff0c;vs2010搭建的测试环境。资源下载…

川职院单招计算机考什么专业,四川单招考什么科目

2021年高职单招升学一对一咨询小艺老师:18290437291(微信)四川单招考什么科目2019年四川单招考试科目是什么&#xff0c;四川单招考试大概在几月份&#xff1f;四川单招考试都考什么内容&#xff0c;考试会不会很难&#xff1f;不同高校四川单招时间是不同的&#xff0c;一般都…

sqlserver检索函数、存储过程、视图 中的关键字

select a.name,a.[type],b.[definition] from sys.all_objects a,sys.sql_modules b where a.is_ms_shipped0 and a.object_id b.object_id--and a.[type] V and [definition] like %检索内容%order by a.name转载于:https://www.cnblogs.com/zspbolg/p/4012695.html

OpenGL 库 简介

OpenGL 库 简介 OpenGL库函数的命名方式为&#xff1a;<库前缀><根命令><可选的参数个数><可选的参数类型>。 库前缀有gl、glu、aux、glut、wgl、glx、agl等等&#xff0c;表示该函数属于OpenGL哪个库。参数的类型&#xff1a;I代表int型&#xff0c;…

figcaption html5,HTML5 figcaption 标签

实例html>html(html.cn)The Pulpit Rock is a massive cliff 604 metres (1982 feet) above Lysefjorden, opposite the Kjerag plateau, in Forsand, Ryfylke, Norway. The top of the cliff is approximately 25 by 25 metres (82 by 82 feet) square and almost flat, an…

svn代码版本管理总结

在本篇文章中, 我将会详细说明我是如何应用SVN trunk(树干)、branches(分支)和tags(标记)。这种方法同样被称为“branch always”&#xff0c;两者非常接近。可能我所介绍的并不是最好的方法&#xff0c;但是它会给新手一些解释说明&#xff0c;告诉他们trunk、branches和tags是…

C++11中enum class的使用

枚举类型(enumeration)使我们可以将一组整型常量组织在一起。和类一样&#xff0c;每个枚举类型定义了一种新的类型。枚举属于字面值常量类型。 C包含两种枚举&#xff1a;限定作用域的和不限定作用域的。这里主要介绍限定作用域的。不限定作用域的使用可以参考&#xff1a; h…

亿T算力量子计算机,终于,中国实现“量子计算优越性”,算力比最快超算快一百万亿倍...

就在今天12月4日&#xff0c;一篇由中国科学技术大学潘建伟、陆朝阳等组成的量子计算研究团队&#xff0c;发表在国际顶级科技学术期刊《Science》上的研究成果《使用光子的量子计算优势》&#xff0c;正式宣告中国终于实现了“量子计算优越性”。采用论文中所述量子技术构建的…

查找场景中的actor

UWorld* world GetWorld();for (TActorIterator<AMyActor> It(world, AMyActor::StaticClass()); It; It){AMyActor* actor *It;if (actor ! NULL){}}

Exception from HRESULT: 0x800A03EC

Exception from HRESULT: 0x800A03EC 分类&#xff1a; asp.net 2013-03-04 18:16 1191人阅读 评论(0) 收藏 举报 Exception from HRESULT: 0x800A03EC 在读取Excel文件时&#xff0c;出现这样的一个异常&#xff0c;搞很长时间&#xff0c;最后发现犯了一个愚蠢的低级错误&am…

学校计算机教室安全预案,小学校园微机室安全事故应急疏散预案

小学校园微机室安全事故应急疏散预案提要:若室内因线路故障或其它不可预知因素发生火灾时,应立即疏散学生并关闭电源,用灭火器及其它有效方法进行灭火更多文章来源自 房 地产e网小学校园微机室安全事故应急疏散预案微机室是对学生进行信息技术教学的课堂,是现代课堂教学的一个重…

uva11361数位dp

挺裸的 &#xff0c;只要注意到当k超过9*10 就直接输出0就可以了。 #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib…

TArray

1. 遍历 for&#xff08;auto i : MyTArray){i-> or *i} 2 找到最大值的索引 int32 IndexOfMax(TArray<float> Array) {int32 HighestIndex 0;for (int32 Counter 0; Counter < Array.Num(); Counter){if (Counter > 0){if ([]() { return (Array[Coun…

小学数学加减法测试软件,儿童数学加法运算火箭(测试版)

儿童数字加法运算火箭是一部益智早教、启蒙幼儿学习基础算术的免费学习机&#xff0c;它可以更好的启发刚入门学习数数的宝宝&#xff0c;开拓小孩的计算思维&#xff0c;锻炼幼儿对数字的敏感性&#xff0c;让幼小的小朋友们也可以拥有超快口算、速算、心算一样的能力&#xf…