ffmpeg实现视频倒播(基于opencv方法)

前一段时间用opencv实现了视频倒播,闲着没事跑去看了看opencv里的代码实现,发现里边也是用ffmpeg实现的,里边有单独的三个头文件直接考出来,基本上不需要修改,直接调用里边的一个struct,里边有函数直接调用就行了

那三个头文件分别是cap_ffmpeg_api.hpp,ffmpeg_codecs.hpp,cap_ffmpeg_impl.hpp

别人开源的东西,研究一下还是对自己有很多帮助的,写的挺巧妙的,不过相对于大一点的视频文件就会很慢了,每次都会seek半天去读上一帧

加QQ群一起交流学习音视频开发:476513431

//图片缩放函数

IplImage* MyRisezeImage(IplImage* pRgbImg, double dScale)
{
	IplImage* pDesImage;
	int nWidth = pRgbImg->width*dScale;
	int nHeight = pRgbImg->height*dScale;
	pDesImage = cvCreateImage(CvSize(nWidth, nHeight), pRgbImg->depth, pRgbImg->nChannels);
	cvResize(pRgbImg, pDesImage, CV_INTER_AREA);
	cvReleaseImage(&pRgbImg);
	return pDesImage;
}

//main函数

#include "ffmpegvideoseek.hpp"

int main(int argc, char* argv[])
{
	CvCapture_FFMPEG peg;
	peg.init();
	peg.open("E:\\mycode\\LiveCompile\\x64\\Release\\Titanic.mkv");
	//peg.open("D:\\迅雷下载\\ymz.mkv");
	unsigned char* rgb;
	int nStep = 0;
	int nWidth = 0;
	int nHeight = 0;
	int nCm = 0;
	int i = 0;
	int64_t nCount = peg.get_total_frames();
	while (1)
	{
		peg.seek(nCount--);
		peg.grabFrame();
		peg.retrieveFrame(0, &rgb, &nStep, &nWidth, &nHeight, &nCm);
		if (nStep == 0)
		{
			cout << "is null " << i++ << endl;
			continue;
		}
		IplImage *pRgbImg = cvCreateImage(cvSize(nWidth, nHeight), 8, nCm);
		memcpy(pRgbImg->imageData, rgb, nWidth * nCm* nHeight);
		IplImage *pImg = MyRisezeImage(pRgbImg, 0.4);
		cvShowImage("hello", pImg);
		//Mat Img = cvarrToMat(pImg, true);
		//DetectFace(Img);
		waitKey(1000/40);
		cvReleaseImage(&pImg);
	}
	return 0;
}

源码路径:如果编译不过直接删除除了上面的几个文件和main函数文件的其他源文件即可

https://download.csdn.net/download/chnim/10674479

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

telllong

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值