一种视频播放方法及电子设备与流程

文档序号:15821432发布日期:2018-11-02 23:08阅读:187来源:国知局
一种视频播放方法及电子设备与流程

本公开涉及一种视频播放方法及电子设备,用于从视频中任意一时间点开始播放。

背景技术

用户在观看视频时,可能不会地对视频进行从头播放,而是对视频进行点播,例如,用户拖拽播放界面中的时间轴,以在特定的时间点进行播放。然而,目前在对视频进行点播(例如在web页面、ios移动端、安卓移动端进行点播)时,会出现这种情况:如果将视频定位到第5秒中的时候,定位结束后,视频从第0秒的时间开始播放;当定位到第9秒的时候,视频仍然从第0秒开始播放;当定位到第10秒的时候,视频则正常从第10秒开始播放;而当定位到19秒时,仍然从第10秒开始播放,从而会产生一种播放进度回退的现象(用户点击到具体时间点时,播发进度条定位到该点,播放器内部完成时间定位,开始播放时的时间点却小于用户点击的时间点,播放器进度条再次定位到开始播放的位置,从而出现进度条回退的现象)。

出现上述情况的原因是,对视频(例如,h264视频)进行时间定位时,播放器内部都会将该视频定位到与指定的定位时间最近的一个关键帧图像上。假设用户进行时间定位时的时间是seektime(以毫秒为单位),播放器内部完成时间定位后,所解码出来的第一帧图像的时间是firstvideotime(以毫秒为单位)。当播放器内部进行时间定位时,如果该seektime时间所对应的h264图像帧,正好是一个关键帧,那么定位完成后,firstvideotime是等于seektime的,那么定位完成后开始播放的时间与用户指定的时间是吻合的。而当seektime时间所对应的h264图像帧,不是一个关键帧时,播放器会向前(小于seektime方向)找到一个与seektime最近的关键帧,假设该关键帧的时间戳为keyframetime,这样解码出来的第一帧视频时间firstvideotime必定等于keyframetime,但是小于seektime。二者之间的差值seektime–keyframetime越大,视频播放进度条回退的现象就越明显。



技术实现要素:

本公开鉴于上述问题,提供一种视频播放方法及电子设备,能够精准地进行视频点播,即在时间上准确地从视频中任意一时间点开始播放。

本公开的一个方面提供了一种视频播放方法,用于从视频中任意一时间点开始播放,方法包括:获取播放所述视频的时间点;对所述视频中的视频数据包进行解码,判断解码后的视频数据所对应的时间戳是否大于等于所述时间点,若是,则将该视频数据加入到视频队列中;对所述视频中的音频数据包进行解码,判断解码后的音频数据所对应的时间戳是否大于等于所述时间点,若是,则将该音频数据加入到音频队列中;按照时间顺序对所述视频队列和音频队列中的数据进行同步播放。

可选地,方法还包括:对时间戳小于所述时间点的视频数据和音频数据进行删除。

可选地,获取播放所述视频的时间点之后,还包括:获取所述视频中的数据包;判断所述数据包为视频数据包或音频数据包;若所述数据包为视频数据包,则将该视频数据包加入到视频数据包队列中,若所述数据包为音频数据包,则将该音频数据包加入到音频数据包队列中。

可选地,对所述视频中的视频数据包进行解码,包括:获取所述视频数据包队列中的第一个视频数据包;将该视频数据包从所述视频数据包队列中移除;对获取的视频数据包进行解码。

可选地,对所述视频中的音频数据包进行解码,包括:获取所述音频数据包队列中的第一个音频数据包;将该音频数据包从所述音频数据包队列中移除;对获取的音频数据包进行解码。

本公开另一方面提供了一种电子设备,包括:显示器,用于显示播放的视频;处理器;存储器,其存储有计算机可执行程序,该程序在被所述处理器执行时,使得所述处理器执行:获取播放所述视频的时间点;对所述视频中的视频数据包进行解码,判断解码后的视频数据所对应的时间戳是否大于等于所述时间点,若是,则将该视频数据加入到视频队列中;对所述视频中的音频数据包进行解码,判断解码后的音频数据所对应的时间戳是否大于等于所述时间点,若是,则将该音频数据加入到音频队列中;按照时间顺序对所述视频队列和音频队列中的数据进行同步播放。

可选地,处理器还执行:对时间戳小于所述时间点的视频数据和音频数据进行删除。

可选地,所述处理器执行获取播放所述视频的时间点之后,还执行:获取所述视频中的数据包;判断所述数据包为视频数据包或音频数据包;若所述数据包为视频数据包,则将该视频数据包加入到视频数据包队列中,若所述数据包为音频数据包,则将该音频数据包加入到音频数据包队列中。

可选地,所述处理器对所述视频中的视频数据包进行解码,包括:获取所述视频数据包队列中的第一个视频数据包;将该视频数据包从所述视频数据包队列中移除;对获取的视频数据包进行解码。

可选地,所述处理器对所述视频中的音频数据包进行解码,包括:获取所述音频数据包队列中的第一个音频数据包;将该音频数据包从所述音频数据包队列中移除;对获取的音频数据包进行解码。

附图说明

为了更完整地理解本公开及其优势,现在将参考结合附图的以下描述,其中:

图1示意性示出了本公开实施例提供的视频播放方法流程图。

图2示意性示出了根据本公开的电子设备的框图。

具体实施方式

根据结合附图对本公开示例性实施例的以下详细描述,本公开的其它方面、优势和突出特征对于本领域技术人员将变得显而易见。

在本公开中,术语“包括”和“含有”及其派生词意为包括而非限制;术语“或”是包含性的,意为和/或。

在本说明书中,下述用于描述本公开原理的各种实施例只是说明,不应该以任何方式解释为限制公开的范围。参照附图的下述描述用于帮助全面理解由权利要求及其等同物限定的本公开的示例性实施例。下述描述包括多种具体细节来帮助理解,但这些细节应认为仅仅是示例性的。因此,本领域普通技术人员应认识到,在不背离本公开的范围和精神的情况下,可以对本文中描述的实施例进行多种改变和修改。此外,为了清楚和简洁起见,省略了公知功能和结构的描述。此外,贯穿附图,相同参考数字用于相似功能和操作。

图1示意性示出了本公开实施例提供的视频播放方法流程图。

如图1所述,视频播放方法包括如下操作:

s1,获取播放视频的时间点。

在上述步骤中,时间点的选择可以来自用户操作,例如,用户在观看视频时,手动拖拽视频界面中的时间轴,以欲从用户想要的时间点进行播放视频。具体从系统内部的获取方式来看,系统一般具有音视频解码模块,例如在pc客户端中一般具有mediadecoder模块作为音视频解码模块。其中,mediadecoder模块中包括有一个seek方法,当用户点击播放器播放进度条进行时间定位时,会调用到该seek方法,该方法接收一个以毫秒事件为单位的时间值,标记为seektime,然后调用av_seek_frame函数,对该视频进行时间定位。其中,av_seek_frame函数所需要的时间单位是微秒时间,所以需要将seektime乘以1000传递到该函数的相应参数中,并将最后一个参数设置为avseek_flag_backward。av_seek_frame函数返回后,判断其返回值是否等于0,如果等于0,则认为时间点获取成功,否则,本次时间点获取失败。

s2,初始化视频解码器和音频解码器。

在上述操作中,需要将当前的视频解码器以及音频解码器中的数据恢复到初始状态,本公开中以m_videocodec变量代表视频解码器,其类型为avcodeccontext结构,以m_audiocodec变量代表音频解码器,其类型同样为avcodeccontext。在初始化过程中,调用avcodec_flush_buffers函数,将m_videocodec传入到该函数参数中,从而重置视频解码器;调用avcodec_flush_buffers函数,将m_audiocodec传入到该函数参数中,从而重置音频解码器。

s3,建立视频数据包队列和音频数据包队列。

在上述操作中,系统中的数据分离器线程demuxerthread循环调用av_read_frame函数,以获取视频中未解码的数据包avpacket;接着,判断所述数据包为视频数据包或音频数据包;若所述数据包为视频数据包,则将该视频数据包加入到视频数据包队列m_videopacketlist中,若所述数据包为音频数据包,则将该音频数据包加入到音频数据包队列m_audiopacketlist中。

s4,对视频中的视频数据包进行解码,判断解码后的视频数据所对应的时间戳是否大于等于所述时间点,若是,则将该视频数据加入到视频队列中。

在上述操作中,系统中的视频解码线程videodecodethread循环对视频数据包队列m_videopacketlist中的视频包avpacket进行解码。具体地,videodecodethread判断视频数据包队列m_videopacketlist是否为空,若是,则不做任何操作,否则,从视频数据包队列m_videopacketlist中获取第一个视频包,并将该视频包从视频数据包队列m_videopacketlist中移除;接着,videodecodethread调用系统中的avcodec_decode_video2函数对上述视频包avpacket进行解码。

上述解码成功后,可以获得一个avframe的结构,该结构代表解码后的一个视频帧,并且该结构中的best_effort_time字段代表该视频帧的时间戳,将其转换为毫秒单位后,比较其是否大于等于时间点seektime,如果是则将其保存到视频队列m_decodedvideoframe中。率先说明的是,后续的视频显示均是从视频队列m_decodedvideoframe中获取一个avframe进行显示。

s5,对视频中的音频数据包进行解码,判断解码后的音频数据所对应的时间戳是否大于等于所述时间点,若是,则将该音频数据加入到音频队列中。

在上述操作中,系统中的音频解码线程audiodecodethread循环对音频数据包队列m_audiopacketlist中的音频包avpacket进行解码。具体地,音频解码线程audiodecodethread判断音频数据包队列m_audiopacketlist是否为空,若是,则不做任何操作,否则,从音频数据包队列m_audiopacketlist中获取第一个视频包,并将该音频包从音频数据包队列m_audiopacketlist中移除;接着,audiodecodethread调用系统中的avcodec_decode_audio4函数对上述音频包avpacket进行解码。

上述解码成功后,可以获得一个avframe的结构,该结构代表解码后的一个音频播放数据,并且该结构中的best_effort_time字段代表该视频帧的时间戳,将其转换为毫秒单位后,比较其是否大于等于时间点seektime,如果是则将其保存到音频队列m_decodedaudioframe中。率先说明的是,后续的音频播放均是从音频队列m_decodedaudioframe中获取一个avframe进行播放。

需要着重说明的是,在上述操作s4和s5中,对于解码出的视频数据或音频数据,若其对应的时间戳小于时间点seektime,则删除该视频数据或音频数据,即对该些数据进行丢弃,以释放内存。

s6,按照时间顺序对视频队列和音频队列中的数据进行同步播放。

在上述步骤中,可以想到的是解码出的视频数据和音频数据在时间上是一一对应的,所以在播放时,在同一时间同步地播放对应的视频数据和音频数据,以达到声音和画面同步的效果。

综上所述,本公开实施例的视频播放方法,首先获取指定的需要播放的时间点seektime,然后分别对视频和音频进行解码,当解码后的视频时间videotime或音频时间audiotime小于时间点seektime时,将这些视频或音频全部丢弃,直到所解码的视频时间videotime和音频时间audiotime大于等于seektime时,才开始播放。这样使得在指定的时间点seektime及之后的时间点的视频和音频都能够得到解码,并能准确地在指定的时间点seektime进行播放,解决了现有技术中进行时间定位时,因为关键帧小于定位时间太多,而出现的播放进度条回退的问题。

图2示意性示出了根据本公开的电子设备的框图。

如图2所示,电子设备200包括处理器210、计算机可读存储介质220及显示器230。该电子设备200可以执行上面参考图1描述的方法,以精准地进行视频点播。

具体地,处理器210例如可以包括通用微处理器、指令集处理器和/或相关芯片组和/或专用微处理器(例如,专用集成电路(asic)),等等。处理器210还可以包括用于缓存用途的板载存储器。处理器310可以是用于执行参考图1描述的根据本公开实施例的方法流程的不同动作的单一处理单元或者是多个处理单元。

计算机可读存储介质220,例如可以是能够包含、存储、传送、传播或传输指令的任意介质。例如,可读存储介质可以包括但不限于电、磁、光、电磁、红外或半导体系统、装置、器件或传播介质。可读存储介质的具体示例包括:磁存储装置,如磁带或硬盘(hdd);光存储装置,如光盘(cd-rom);存储器,如随机存取存储器(ram)或闪存;和/或有线/无线通信链路。

计算机可读存储介质220可以包括计算机程序221,该计算机程序221可以包括代码/计算机可执行指令,其在由处理器210执行时使得处理器310执行例如上面结合图1所描述的方法流程及其任何变形。

计算机程序221可被配置为具有例如包括计算机程序模块的计算机程序代码。例如,在示例实施例中,计算机程序221中的代码可以包括一个或多个程序模块,例如包括221a、模块221b、……。应当注意,模块的划分方式和个数并不是固定的,本领域技术人员可以根据实际情况使用合适的程序模块或程序模块组合,当这些程序模块组合被处理器210执行时,使得处理器210可以执行例如上面结合图1所描述的方法流程及其任何变形。

尽管已经参照本公开的特定示例性实施例示出并描述了本公开,但是本领域技术人员应该理解,在不背离所附权利要求及其等同物限定的本公开的精神和范围的情况下,可以对本公开进行形式和细节上的多种改变。因此,本公开的范围不应该限于上述实施例,而是应该不仅由所附权利要求来进行确定,还由所附权利要求的等同物来进行限定。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1