FFmpeg 学习之 定时器解码两路视频并进行对比<2>

前面写过一篇关于视频对比的文章,后来又做了一些修缮,用代码实现了一遍。

//定时器,解码
void Cvideo4Dlg::OnTimer(UINT nIDEvent)
{
	//输出视频解码
	WaitForSingleObject(AfxBeginThread(Decode_out_Thread, this), INFINITE);
	//输入视频解码
	WaitForSingleObject(AfxBeginThread(Decode_in_Thread, this), INFINITE);
	//当前帧开始检测
	if(frame_test_over)
	{
		//备份被检测帧必要参数
		if(current_frame_number != pCodecCtx_out->frame_number)
		{
			//为FALSE时,表示线程执行中,暂不开启新线程
			frame_test_over = FALSE;
			Sleep(5);
			current_frame_number = pCodecCtx_out->frame_number;
			CString frame_number_str_in;
			CString frame_number_str_out;
			frame_number_str_in.Format("src_%d.jpg", current_frame_number);
			cvSaveImage(frame_number_str_in, Image_in);
			frame_number_str_out.Format("dst_%d.jpg", current_frame_number);
			cvSaveImage(frame_number_str_out, Image_out);
			//开启检测线程
			WaitForSingleObject(AfxBeginThread(Compare_Thread, this), INFINITE);
		}
		//帧号不再变化,则认为解码结束
		else if(current_frame_number && (!encoder_over))
		{
			//为FALSE时,表示线程执行中,暂不开启新线程
			frame_test_over = FALSE;
			encoder_over = 1;
			//开启检测线程
			WaitForSingleObject(AfxBeginThread(Compare_Thread, this), INFINITE);
			KillTimer(1);
			//system_clear();
			GetDlgItem(IDC_BTN_CHECK)->EnableWindow(TRUE);
		}
	}
}
current_frame_number 为当前被测帧号,当检测线程开启的时候,传送过去,因为frame_number在线程开启的时候,,未必等于保存的图像的帧号。
frame_test_over 线程运行标志。为FALSE 时表示线程正在运行,不会开启新的检测线程。待检测线程结束后,该标志位会复位。<pre name="code" class="cpp">

利用 MediaInfo 读取视频帧数,当frame_number == 总帧数时,可认为解码结束,encoder_over 复位。执行统计线程。
<pre name="code" class="cpp">

//输入视频解码线程
UINT Decode_in_Thread(LPVOID lpParam)
{
	Cvideo4Dlg * dlg = (Cvideo4Dlg *)lpParam;

	if((dlg->pCodecCtx_in->frame_number) <= (dlg->pCodecCtx_out->frame_number))
	{
          。。。
        }
}
//输出视频解码线程
UINT Decode_out_Thread(LPVOID lpParam)
{
	Cvideo4Dlg * dlg = (Cvideo4Dlg *)lpParam;

	if(av_read_frame(dlg->pFormatCtx_out, dlg->packet_out)>=0)
	{
          。。。
        }
}

接收端解码成功之后,视频源再解码,确保同步。

时间: 2024-10-05 21:31:03

FFmpeg 学习之 定时器解码两路视频并进行对比<2>的相关文章

FFmpeg 学习之 定时器解码两路视频并进行对比

两路视频跳帧的一些想法: 关于多路视频,如果不涉及对比的话,多线程是最佳选择,来一路视频的话,直接开一个线程去显示处理,非常有效,方便. 但如果说要求两路视频的图像的相似度,那么便牵扯到解码同步问题,如果说一路是本地视频文件,一路是网络视频流,那么很可能由于其帧型的不同,导致解码效率不同,相同序号的帧出现在两个时刻.感觉对比的话,应该是在线程里,当然,鉴于计算量比较大,比较的时候可以再开线程,此为后话. 再说同步的问题,可设置标志位,标定帧号.由于解码本地视频丢帧率较小,且由于帧型而导致解码效率

FFmpeg学习2:解码数据结构及函数总结

在上一篇文章中,对FFmpeg的视频解码过程做了一个总结.由于才接触FFmpeg,还是挺陌生的,这里就解码过程再做一个总结.本文的总结分为以下两个部分: 数据读取,主要关注在解码过程中所用到的FFmpeg中的结构体. 解码过程中所调用的函数 在学习的过程主要参考的是dranger tutorial,所以跟着教程在本文的最后使用SDL2.0将解码后的数据输出到屏幕上. 数据的读取 一个多媒体文件包含有多个流(视频流 video stream,音频流 audio stream,字幕等):流是一种抽象

ffmpeg学习——播放器解码流程 (转前编辑)

播放器解码流程 1.Demux解复用:媒体文件中音视频数据是压缩在一起的,单压缩算法不同,所以解码前需先将音视频数据解绑,解复用即将音视频数据分开 2.解码,FFmpeg中解码流程对应的API函数 Ffmpeg中Demux这一步是通过 avformat_open_input()    :读出文件的头部信息,并做demux,之后可以读取媒体文件中的音频和视频流 av_read_frame()     :从音频和视频流中读取出基本数据流packet avcodec_decode_video2():读

ffmpeg学习4--ffmpeg类的简单封装,包含解码和定时录像功能

ffmpeg学习4--ffmpeg类的简单封装,包含解码和定时录像功能 参考网上的资料,简单封装了一下ffmpeg,这里记录一下,其它传感器编码及项目中用到的已经抽离,这里只包含解码和录像部分.这只是个玩具级别的测试.完整测试代码下载:代码下载 ffmpegDeCode.h #pragma once #include "stdafx.h" #include<iostream> using namespace std; extern char *VideoPath; exte

FMC子卡模块学习资料:FMC150-两路250Msps AD、两路500Msps DA FMC子卡模块150

FMC150-两路250Msps AD.两路500Msps DA FMC子卡模块 一.板卡概述 ADC采用TI的ADS62P49,2通道250M,14bit,共1片: DAC采用ADI的AD9122,2通道,16bit,可达1.2G,共1片: 时钟采用AD9516,支持板上时钟和外接时钟: 共6个SSMB接口,1个FMC/LPC接口 ADS62P49 特性 大输出采样速率:250MSPS 与 ADS62P49 引脚兼容 可变输出分辨率 具有 14 位输出的高分辨率猝发模式:低 IF 时为 73d

FFmpeg学习5:多线程播放视音频

在前面的学习中,视频和音频的播放是分开进行的.这主要是为了学习的方便,经过一段时间的学习,对FFmpeg的也有了一定的了解,本文就介绍了如何使用多线程同时播放音频和视频(未实现同步),并对前面的学习的代码进行了重构,便于后面的扩展.本文主要有以下几个方面的内容: 多线程播放视音频的整体流程 多线程队列 音频播放 视频播放 总结以及后续的计划 1. 整体流程 FFmpeg和SDL的初始化过程这里不再赘述.整个流程如下: 对于一个打开的视频文件(也就是取得其AVFormatContext),创建一个

FFMPEG视音频编解码零基础学习方法-b

感谢大神分享,虽然现在还看不懂,留着大家一起看啦 PS:有不少人不清楚“FFmpeg”应该怎么读.它读作“ef ef em peg” 0. 背景知识 本章主要介绍一下FFMPEG都用在了哪里(在这里仅列几个我所知的,其实远比这个多).说白了就是为了说明:FFMPEG是非常重要的. 使用FFMPEG作为内核视频播放器: Mplayer,ffplay,射手播放器,暴风影音,KMPlayer,QQ影音... 使用FFMPEG作为内核的Directshow Filter: ffdshow,lav fil

FFMPEG视音频编解码零基础学习方法

在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者.在和大家探讨的过程中,我忽然发现了一个问题:在“大神”和初学者之间好像有一个不可逾越的鸿沟.“大神”们水平高超,探讨着深奥的问题:而初学者们还停留在入门阶段.究竟是什么原因造成的这种“两极分化”呢?最后,我发现了问题的关键:FFMPEG难度比较大,却没有一个循序渐进,由简单到复杂的教程.现在网上的有关FFMPEG的教程多半难度比较大,不太适合刚接

[总结]FFMPEG视音频编解码零基础学习方法

转至 http://my.oschina.net/leixiaohua1020/blog/302174 在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者.在和大家探讨的过程中,我忽然发现了一个问题:在“大神”和初学者之间好像有一个不可逾越的鸿沟.“大神”们水平高超,探讨着深奥的问题:而初学者们还停留在入门阶段.究竟是什么原因造成的这种“两极分化”呢?最后,我发现了问题的关键:FFMPEG难度比较