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

两路视频跳帧的一些想法:

关于多路视频,如果不涉及对比的话,多线程是最佳选择,来一路视频的话,直接开一个线程去显示处理,非常有效,方便。

但如果说要求两路视频的图像的相似度,那么便牵扯到解码同步问题,如果说一路是本地视频文件,一路是网络视频流,那么很可能由于其帧型的不同,导致解码效率不同,相同序号的帧出现在两个时刻。感觉对比的话,应该是在线程里,当然,鉴于计算量比较大,比较的时候可以再开线程,此为后话。

再说同步的问题,可设置标志位,标定帧号。由于解码本地视频丢帧率较小,且由于帧型而导致解码效率要比网络视频的解码效率要高,故可以将同步开关设置在本地视频解码中。例如帧号,本地视频设置为N1,网络视频设置为N2,两路同时解码,N1 与 N2 自加。后续在N1 < N2 的情况下,N1 解码,也即本地视频解码。这样做有一个前提条件,就是网络视频不丢帧,且解码不丢帧,否则本地视频的解码进度将逐渐滞后于网络视频的解码。

考虑到丢帧的情况,解释说现在要考虑的是:

1、只要是进行了解码,不管成功与否,N2自加,N1解码自加

2、N2 解码成功,即网络视频端解码成功,N2自加,N1的话自加,可能导致N1的进度进度小于N2,即网络视频播放进度在本地视频之前。

综上,不管网络端是否解码成功,本地接口都必须进行解码,两路视频帧号自加运算。

视频解码,本人一直喜欢用定时器,下面谈一些关于定时器在多路视频解码方面的想法:

首先设置三个定时器 T3,前两个做解码用,T1解码本地视频,T2解码网络视频,T3做计算对比。

同多线程解码一样,以本地视频解码为同步控制点,网络端解码,不管成功与否,本地视频在进行解码,两者的帧号均自加。

也就是说只有在 N1<N2 的情况下,本地视频才进行解码。这样便可保持;两路视频解码同步。

再谈对比与运算,这是一个比较麻烦的事情。

如果10帧做一回检测,那么将出现以下两种状况:

1、在两路视频均第20帧解码成功的时候,第10帧已经处理完成。那么这个很简单,无须理会。

2、在两路视频均第20帧解码成功的时候,第10帧没有处理完成,那么情况就复杂了。

如果说只考虑运算数据,那么直接在线程里开辟图片空间,复制图片到临时内存,完成之后释放,结果记录在硬盘文件,这个也简单。

如果说运算数据需要在其他框架里面显示,那么就稍微有点复杂。

思路大概是:开线程,传 this 参数,计算结果显示。

现在来考虑它图片内存的问题:

1、如果运算的时候用到的是原始图片的内存,肯定是不行的,它在逐帧变化之中。

2、在10帧时,开辟内存空间,复制图片,若处理时延在10帧的解码时间之内,简单,直接预算显示。

3、处理时延在10帧解码时延之外,考虑图片空间组,循环赋值到图片空间,数量依据对比处理时延与解码时间而定,这个确实不大好把握。

3、动态分配。需要复制图片空间的时候,开辟内存,然后交给线程去处理,考虑线程同步通信,处理时锁定该资源即可,估计会对效率产生一定影响。

时间: 2024-08-29 21:00:45

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

FFmpeg 学习之 定时器解码两路视频并进行对比&lt;2&gt;

前面写过一篇关于视频对比的文章,后来又做了一些修缮,用代码实现了一遍. //定时器,解码 void Cvideo4Dlg::OnTimer(UINT nIDEvent) { //输出视频解码 WaitForSingleObject(AfxBeginThread(Decode_out_Thread, this), INFINITE); //输入视频解码 WaitForSingleObject(AfxBeginThread(Decode_in_Thread, this), INFINITE); //

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难度比较