一种使用FFMPEG接口录制直播网站视频的方法及装置与流程

文档序号:12498995阅读:673来源:国知局
一种使用FFMPEG接口录制直播网站视频的方法及装置与流程

本发明涉及通讯技术领域,尤其涉及一种使用FFMPEG接口录制直播网站视频的方法及装置。



背景技术:

目前的直播网站都是使用的rtmp或http协议传递h264编码视频流,FFMPEG提供的exe是可以直接下载这些直播网站的音视频文件的。

然而,发明人员通过研究发现,这种FFMPEG提供的exe是直接下载这些直播网站的音视频文件至少存在如下问题:在视频录制的过程中,视频开始的部分容易出现花屏。

可见,现有技术中的直播网站进行视频录制时,存在视频开始的部分容易出现花屏的技术问题。



技术实现要素:

本发明实施例提供了一种使用FFMPEG接口录制直播网站视频的方法及装置,用以解决现有技术中的直播网站进行视频录制时,存在的视频开始的部分容易出现花屏的技术问题。

第一方面,本发明提供了一种使用FFMPEG接口录制直播网站视频的方法,所述方法包括:

获得所述直播间的流地址;其中,所述流地址包括视频流地址;

根据所述流地址获得所述直播间直播过程中的流信息,其中所述流信息中包括N个帧,N为正整数;

根据所述流信息创建本地FLV文件;

根据所述N个帧,获得第一帧;

判断所述第一帧是否为视频关键帧;

当所述第一视频帧为视频关键帧时,将所述第一视频帧确定为录制开始点;

将第一视频帧之后的M个视频帧进行数据处理,并写入所述本地FLV文件中,其中M小于N,且M为正整数。

可选的,所述根据所述流信息创建本地FLV文件,还包括:创建FLV文件的文件头;所述将第一视频帧之后的M个视频帧进行数据处理,并写入所述本地FLV文件中,还包括:将所述第一视频帧进行数据处理后,从所述文件头处开始写入所述经处理的所述第一视频帧。

可选的,所述根据所述流地址获得所述直播间直播过程中的流信息,还包括:通过av_read_frame函数获得所述流信息,且所述流信息为AVPacket结构;其中,所述方法还包括:判断所述av_read_frame的返回值是否等于AVERROR;当所述av_read_frame的返回值等于AVERROR时,才结束录制。

可选的,所述判断所述第一帧是否为视频关键帧,还包括:判断所述第一帧是否为IDR帧;如是,则判断所述第一帧为视频关键帧。

可选的,所述将所述第一视频帧确定为录制开始点时,所述方法还包括:获得所述第一视频帧的第一时间戳;所述将第一视频帧之后的M个视频帧进行数据处理,还包括:获得所述M个视频帧中的第二视频帧的第二时间戳;根据所述第一时间戳和所述第二时间戳获得第三时间戳;将所述第二视频帧的第二时间戳更改为所述第三时间戳后,写入所述本地FLV文件中。

可选的,在所述判断所述第一帧是否为视频关键帧之前,还包括:获得所述第一帧的数据类型;当所述第一帧是视频帧时,则判断所述第一帧是否为视频关键帧;当所述第一帧是音频帧时,则忽略所述第一帧。

第二方面,本发明提供了一种使用FFMPEG接口录制直播网站视频的装置,所述装置包括:

第一获得单元,所述第一获得单元用于获得所述直播间的流地址;其中,所述流地址包括视频流地址;

第二获得单元,所述第二获得单元用于根据所述视频流地址获得所述直播间直播过程中的流信息,其中所述流信息中包括N个帧,N为正整数;

第一创建单元,所述第一创建单元用于根据所述流信息创建本地FLV文件;

第三获得单元,所述第三获得单元用于根据所述N个帧,获得第一帧;

第一判断单元,所述第一判断单元用于判断所述第一帧是否为视频关键帧;

第一确定单元,所述第一确定单元用于当所述第一视频帧为视频关键帧时,将所述第一视频帧确定为录制开始点;

第一写入单元,所述第一写入单元用于将第一视频帧之后的M个视频帧进行数据处理,并写入所述本地FLV文件中,其中M小于N,且M为正整数。

可选的,所述装置还包括:第二创建单元,所述第二创建单元用于创建FLV文件的文件头;第二写入单元,所述第二写入单元用于所述将第一视频帧之后的M个视频帧进行数据处理,并写入所述本地FLV文件中,还包括:第三写入单元,所述第三写入单元用于将所述第一视频帧进行数据处理后,从所述文件头处开始写入所述经处理的所述第一视频帧。

可选的,所述装置还包括:第四获得单元,所述第四获得单元用于通过av_read_frame函数获得所述流信息,且所述流信息为AVPacket结构;第二判断单元,所述第二判断单元用于判断所述av_read_frame的返回值是否等于AVERROR;第一结束单元,所述第一结束单元用于当所述av_read_frame的返回值等于AVERROR时,才结束录制。

可选的,所述装置还包括:第三判断单元,所述第三判断单元用于判断所述第一帧是否为IDR帧;第四判断单元,所述第四判断单元用于如是,则判断所述第一帧为视频关键帧。

可选的,所述装置还包括::第五获得单元,所述第五获得单元用于获得所述第一视频帧的第一时间戳;第六获得单元,所述第六获得单元用于获得所述M个视频帧中的第二视频帧的第二时间戳;第七获得单元,所述第七获得单元用于根据所述第一时间戳和所述第二时间戳获得第三时间戳;第四写入单元,所述第四写入单元用于将所述第二视频帧的第二时间戳更改为所述第三时间戳后,写入所述本地FLV文件中。

本发明实施例中的上述一个或多个技术方案,至少具有如下一种或多种技术效果:

在本发明实施例提供的方法及装置,在对直播网站的视频进行录制时,通过依据直播间直播过程中的流信息中N个帧,获得第一帧,并判断所述第一帧是否为视频关键帧,如果所述第一视频帧判断为视频关键帧时,则将所述第一视频帧确定为录制开始点,以此使得所录制的视频在播放的时候不会出现花屏的现象。可见,本发明实施例解决了现有技术中的直播网站进行视频录制时,存在的视频开始的部分容易出现花屏的技术问题。

上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例的使用FFMPEG接口录制直播网站视频的方法流程图;以及

图2为本发明实施例中将第一视频帧之后的M个视频帧进行数据处理的方法示意图;以及

图3为本发明实施例中使用FFMPEG接口录制直播网站视频的装置示意图。

具体实施方式

本发明实施例提供了一种使用FFMPEG接口录制直播网站视频的方法及装置,解决了现有技术中的直播网站进行视频录制时,存在的视频开始的部分极易花屏的技术问题。

本发明实施例中的技术方案,总体思路如下:

在对直播网站进行视频录制时,首先获得所述直播间的流地址;其中,所述流地址包括视频流地址;根据所述流地址获得所述直播间直播过程中的流信息,其中所述流信息中包括N个帧,N为正整数;根据所述流信息创建本地FLV文件;根据所述N个帧,获得第一帧;判断所述第一帧是否为视频关键帧;当所述第一视频帧为视频关键帧时,将所述第一视频帧确定为录制开始点;将第一视频帧之后的M个视频帧进行数据处理,并写入所述本地FLV文件中,其中M小于N,且M为正整数。

上述方法通过依据直播间直播过程中的流信息中N个帧,获得第一帧,并判断所述第一帧是否为视频关键帧,如果所述第一视频帧判断为视频关键帧时,则将所述第一视频帧确定为录制开始点,以此使得所录制的视频在播放的时候不会出现花屏的现象。

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

实施例一

本实施例提供的一种使用FFMPEG接口录制直播网站视频的方法,请参阅图1,所述方法包括:

步骤S110,获得所述直播间的流地址;其中,所述流地址包括视频流地址;

步骤S120,根据所述流地址获得所述直播间直播过程中的流信息,其中所述流信息中包括N个帧,N为正整数;

步骤S130,根据所述流信息创建本地FLV文件;

步骤S140,根据所述N个帧,获得第一帧;

步骤S150,判断所述第一帧是否为视频关键帧;

步骤S160,当所述第一视频帧为视频关键帧时,将所述第一视频帧确定为录制开始点;

步骤S170,将第一视频帧之后的M个视频帧进行数据处理,并写入所述本地FLV文件中,其中M小于N,且M为正整数。

具体来讲,现有技术中直播网站都是使用的rtmp或http协议传递h264编码视频流,FFMPEG提供的exe是可以直接下载这些直播网站的音视频文件的。但是,经发明人研究发现,这种方式至少存在视频开始的部分容易出现花屏。基于此,本发明实施例提供的方法用于解决在视频开始的部分容易出现花屏的技术问题。

在本申请实施例中,为了对本申请所公开的技术方案进行详细的介绍,以达到清楚、明白的目的,特针对所涉及的名词解释如下:

FFMPEG,是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据用户选择的组件)。FFMPEG提供了录制、转换以及流化音视频的完整解决方案。FFMPEG包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,FFMPEG里面里很多代码都是从头开发的。在本发明实施例中即是基于FFMPEG进行视频流的获取,以及音视频文件的写入。

H.264,是国际标准化组织(ISO)和国际电信联盟(ITU)共同提出的继MPEG4之后的新一代数字视频压缩格式。H.264是ITU-T以H.26x系列为名称命名的视频编解码技术标准之一。H.264是ITU-T的VCEG(视频编码专家组)和ISO/IEC的MPEG(活动图像编码专家组)的联合视频组(JVT:joint video team)开发的一个数字视频编码标准。H.264最大的优势是具有很高的数据压缩比率,H.264在具有高压缩比的同时还拥有高质量流畅的图像,正因为如此,经过H.264压缩的视频数据,在网络传输过程中所需要的带宽更少,也更加经济。在本发明实施例中即是基于到对h264的格式解析。

FLV,是Flash Video的首字母缩写,Flash Video流媒体格式是随着Flash MX的推出而发展而来的一种新兴的视频格式。FLV是被众多新一代视频分享网站所采用,是目前增长最快、最为广泛的视频传播格式。

RTMP,是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种。RTMP是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。RTMP协议(Real Time Messaging Protocol)是被Flash用于对象,视频,音频的传输。这个协议建立在TCP协议或者轮询HTTP协议之上。RTMP协议可以理解为是一个用来装数据包的容器,这些数据既可以是AMF格式的数据,也可以是FLV中的视/音频数据。

下面,结合图1对本申请提供的使用FFMPEG接口录制直播网站视频的方法进行详细介绍:

首先,执行步骤S110,获得所述直播间的流地址;其中,所述流地址包括视频流地址;

具体而言,在对直播网站上正在开播的直播间视频进行录制时,首先需要获取对应直播间的流地址,而对于流地址的获取方式可以是多种多样的,本发明实施例并不局限,比如可以是通过向网站服务器提供房间号查询获取,也可以是通过输入直播间的直播名称查询获取。

接下来,执行步骤S120,根据所述流地址获得所述直播间直播过程中的流信息,其中所述流信息中包括N个帧,N为正整数;

具体而言,对于直播间直播过程中的流信息的获得,可以是使用av_read_frame函数,从avformat_open_input函数打开的AVFormatContext结构上下文中获取的音视频流,且该音视频数据为AVPacket结构。

在这里,avformat_open_input函数是用来打开一个输入文件或者音视频流,返回AVFormatContext结构的上下文,在本申请中是用来打开直播网站的实时音视频流。AVFormatContext结构是用来表示一个输入或者输出文件的上下文,AVFormatContext是FFMPEG格式转换过程中实现输入和输出功能、保存相关数据的主要结构。AVPacket是存储压缩编码数据相关信息的结构体,AVPacket一般是一帧完整的音视频编解码数据,对于H.264来说,1个AVPacket的data通常对应一个NAL。av_read_frame函数是用来从输入文件即AVFormatContext结构的上下文中获取音视频流数据,获取的音视频数据,一般是编码过的,因为h264高压缩比少带宽以及广泛性,目前直播网站一般都是使用的h264的视频编码,从数据流读出的数据是保存在AVPacket结构里的。

需要说明的是,在根据所述流地址获得所述直播间直播过程中的流信息的过程中,为了避免视频文件被轻易打断,造成断流比较频繁以至于常常遗失掉精彩的瞬间画面的技术问题,优选的,本发明实施例还包括:判断所述av_read_frame的返回值是否等于AVERROR;当所述av_read_frame的返回值等于AVERROR时,才结束录制。也即,对av_read_frame的返回值只有在等于AVERROR(EAGAIN)的时候,才结束录制。这种容错处理不会导致本发明实施例所提供的方法在视频录制的过程中被频繁打断,而错过一些重要的时刻,实现所录制的视频具有连续顺畅的特点。

当然,在执行步骤S120之前,或者之后,或者同时,可以执行步骤S130,根据所述流信息创建本地FLV文件;

其中,在该步骤S130中具体可以通过avformat_open_input函数根据步骤S110获得的直播间流地址打开直播间流,并通过AVFormatContext结构的对象保存直播间的流信息,利用输入文件的流信息使用avformat_alloc_output_context2函数创建本地flv文件,并使用avformat_write_header函数写入flv文件的文件头。

在这里,avformat_alloc_output_context2函数是用来创建一个输出文件,得到该输出文件的AVFormatContext结构的上下文,在本发明实施例中输出文件为本地flv录制文件。avformat_write_header函数是用来往输出文件写入该音视频流的头信息,包含音视频编解码信息,以及文件大小等。

然后,执行步骤S140,根据所述N个帧,获得第一帧;

以及,执行步骤S150,判断所述第一帧是否为视频关键帧;

具体而言,本申请实施例是针对直播网站的视频信息进行录制,所要解决的技术问题也是解决在视频录制过程中,视频开始的部分极易花屏的技术问题。因此,在流信息中所包括的N个帧中,首先要确认基于所述N个帧,所获得第一帧是否是视频帧,如果是视频帧,则继续下一步骤。如果不是(如是音频帧),则直接忽略(这里的忽略也即pass掉的意思),并重新继续获取上述的流信息。

这里,对于判断基于所述N个帧,所获得第一帧是否是视频帧,可以是通过如下方法判断。即,在解析流信息的时候,先获取视频音频的stream的id,然后在读帧的时候,使用帧的stream id进行比较进行判断。

紧接着,在判断完第一帧是视频帧之后,在继续执行步骤S150,也即判断所述第一帧是否为视频关键帧。可以包括如下步骤:判断所述第一帧是否为IDR帧;如是,则判断所述第一帧为视频关键帧。

具体而言,可以基于当前的流信息的视频压缩格式是h264,从h264视频帧获取nalu类型值,nalu&0x1f为5则表示该帧即为IDR帧,也即视频关键帧。而当判断所述第一帧不是视频关键帧时,则放弃该第一视频帧,并重新继续获取上述的流信息。

如果判断所述第一帧是视频关键帧时,则继续执行步骤S160,当所述第一视频帧为视频关键帧时,将所述第一视频帧确定为录制开始点;也正因如此,使得通过本发明实施例在直播网上中进行视频录制时,能够确定录制文件的第一帧视频帧是关键帧,这就使得本地录制的视频文件在开始播放的时候不会出现花屏的现象。

再然后,执行步骤S170,将第一视频帧之后的M个视频帧进行数据处理,并写入所述本地FLV文件中,其中M小于N,且M为正整数。

需要强调的是,在将所述第一视频帧确定为录制开始点时,还包括获得所述第一视频帧的第一时间戳;而所述步骤S170,请参阅图2,也还包括如下子步骤:步骤S170a,获得所述M个视频帧中的第二视频帧的第二时间戳;步骤S170b,根据所述第一时间戳和所述第二时间戳获得第三时间戳;步骤S170c,将所述第二视频帧的第二时间戳更改为所述第三时间戳后,写入所述本地FLV文件中。

具体而言,在将所述第一视频帧确定为录制开始点时,为了能让录制文件的开始时间从0开始,此时可获得该第一视频帧的第一时间戳并保存,如记录该第一时间戳为begin_record_pts,该第一时间戳作为录制文件的开始时刻。进一步地,将M个视频帧中的第二视频帧AVPacket结构对象的第二时间戳减去第一时间戳begin_record_pts值,并将所述第二视频帧的第二时间戳更改为所述第三时间戳。然后通过av_interleaved_write_frame函数,把处理过的第二视频帧写入所述本地FLV文件中。

值得注意的是,由于在步骤S170中由于通过av_interleaved_write_frame函数,把处理过的第二视频帧直接写入预先创建的AVFormatContext结构上下文,这就使得在本发明实施例中不需要对视频进行重新编解码,继而对cpu、内存消耗极低,具有性能高的特点。

最后,通过av_write_trailer函数,写入文件结尾例如文件长度等信息,关闭文件,销毁相关资源。

在这里,av_interleaved_write_frame函数是用来往输出文件写音视频流数据,且av_interleaved_write_frame函数写入的数据的结构为AVPacket。av_write_trailer函数是用来往输出文件写音视频流的结尾信息,文件的大小等信息一般是在结尾的时候才能决定的。

基于同一发明构思,本发明实施例还提供了实施例一中方法对应的装置,见实施例二。

实施例二

本实施例提供了一种使用FFMPEG接口录制直播网站视频的装置,请参考图3,所述装置备包括:

第一获得单元110,被配置为获得所述直播间的流地址;

第二获得单元120,被配置为根据所述流地址获得所述直播间直播过程中的流信息,其中所述流信息中包括N个帧,N为正整数;

第一创建单元130,被配置为根据所述流信息创建本地FLV文件;

第三获得单元140,被配置为根据所述N个帧,获得第一帧;

第一判断单元150,被配置为判断所述第一帧是否为视频关键帧;

第一确定单元160,被配置为当所述第一视频帧为视频关键帧时,将所述第一视频帧确定为录制开始点;

第一写入单元170,被配置为将第一视频帧之后的M个视频帧进行数据处理,并写入所述本地FLV文件中,其中M小于N,且M为正整数。

在本申请实施例中,所述装置还包括:

第二创建单元,所述第二创建单元用于创建FLV文件的文件头;

第二写入单元,所述第二写入单元用于所述将第一视频帧之后的M个视频帧进行数据处理,并写入所述本地FLV文件中,还包括:

第三写入单元,所述第三写入单元用于将所述第一视频帧进行数据处理后,从所述文件头处开始写入所述经处理的所述第一视频帧。

在本申请实施例中,所述装置还包括:

第四获得单元,所述第四获得单元用于通过av_read_frame函数获得所述流信息,且所述流信息为AVPacket结构;

第二判断单元,所述第二判断单元用于判断所述av_read_frame的返回值是否等于AVERROR;

第一结束单元,所述第一结束单元用于当所述av_read_frame的返回值等于AVERROR时,才结束录制。

在本申请实施例中,所述装置还包括:

第三判断单元,所述第三判断单元用于判断所述第一帧是否为IDR帧;

第四判断单元,所述第四判断单元用于如是,则判断所述第一帧为视频关键帧。

在本申请实施例中,所述装置还包括:

第五获得单元,所述第五获得单元用于获得所述第一视频帧的第一时间戳;

第六获得单元,所述第六获得单元用于获得所述M个视频帧中的第二视频帧的第二时间戳;

第七获得单元,所述第七获得单元用于根据所述第一时间戳和所述第二时间戳获得第三时间戳;

第四写入单元,所述第四写入单元用于将所述第二视频帧的第二时间戳更改为所述第三时间戳后,写入所述本地FLV文件中。

由于本发明实施例二所介绍的使用FFMPEG接口录制直播网站视频的装置,为实施本发明实施例一的使用FFMPEG接口录制直播网站视频的方法所采用的装置,故而基于本发明实施例一所介绍的方法,本领域所属人员能够了解该装置的具体结构及变形,故而在此不再赘述。凡是本发明实施例一的方法所采用的装置都属于本发明所欲保护的范围。

本申请实施例中提供的技术方案,至少具有如下技术效果或优点:

一方面,通过依据直播间直播过程中的流信息中N个帧,获得第一帧,并判断所述第一帧是否为视频关键帧,如果所述第一视频帧判断为视频关键帧时,则将所述第一视频帧确定为录制开始点,以此使得所录制的视频在播放的时候不会出现花屏的现象。

又一方面,在根据所述流地址获得所述直播间直播过程中的流信息的过程中,为了避免视频文件被轻易打断,造成断流比较频繁以至于常常遗失掉精彩的瞬间画面的技术问题,本发明实施例还包括:判断所述av_read_frame的返回值是否等于AVERROR;当所述av_read_frame的返回值等于AVERROR时,才结束录制。也即,对av_read_frame的返回值只有在等于AVERROR(EAGAIN)的时候,才结束录制。这种容错处理不会导致本发明实施例所提供的方法在视频录制的过程中被频繁打断,而错过一些重要的时刻,实现所录制的视频具有连续顺畅的特点。

再一方面,由于通过av_interleaved_write_frame函数,把处理过的第二视频帧直接写入预先创建的AVFormatContext结构上下文,这就使得在本发明实施例中不需要对视频进行重新编解码,继而对cpu、内存消耗极低,具有性能高的特点。

本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。

显然,本领域的技术人员可以对本发明实施例进行各种改动和变型而不脱离本发明实施例的精神和范围。这样,倘若本发明实施例的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

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