视频拍摄方法及装置的制造方法

文档序号:9251147阅读:619来源:国知局
视频拍摄方法及装置的制造方法
【技术领域】
[0001]本发明实施例涉及多媒体处理领域,特别涉及一种视频拍摄方法及装置。
【背景技术】
[0002]短视频分享是目前在诸如智能手机、平板电脑和多媒体播放器等移动终端上非常流行的一种功能。用户可以通过智能手机拍摄简短的几秒视频来分享给好友,使得短视频能够像微博一样来传播信息。
[0003]在采用Android系统的移动终端上,短视频分享App (Applicat1n,应用程序)可以调用系统内置的相关函数接口来拍摄短视频。例如,短视频分享App调用系统内置的PreviewCallback接口,该PreviewCallback接口在摄像头每次拍摄到一巾贞预览图像时,自动调用onPreviewFrame回调函数向短视频分享App返回当前图像巾贞数据。短视频分享App将每帧图像帧数据缓存在Java层,然后按顺序将每帧图像帧数据编码为短视频。
[0004]在实现本发明实施例的过程中,发明人发现【背景技术】至少存在以下问题:Andorid系统中属于Java层的每个应用仅能够使用有限的几十MB内存,而上述图像帧数据被缓存在Java层时,由于图像帧数据的数据量较大,会频繁触发Java层在内存不足时的垃圾回收(gc)机制,甚至发生内存溢出(oom, Out Of Memory)。

【发明内容】

[0005]为了解决图像数据被缓存在Java层时,会频繁触发垃圾回收机制和发生内存溢出现象的问题,本发明实施例提供了一种视频拍摄方法及装置。所述技术方案如下:
[0006]第一方面,提供了一种视频拍摄方法,所述方法包括:
[0007]获取拍摄到的视频数据;
[0008]将所述视频数据缓存到内存分配不受限制的native层;
[0009]根据所述native层中缓存的所述视频数据编码得到视频文件。
[0010]第二方面,提供了一种视频拍摄装置,所述装置包括:
[0011]数据采集模块,用于获取拍摄到的视频数据;
[0012]数据缓存模块,用于将所述视频数据缓存到内存分配不受限制的native层;
[0013]数据编码模块,用于根据所述native层中缓存的所述视频数据编码得到视频文件。
[0014]本发明实施例提供的技术方案带来的有益效果是:
[0015]通过获取拍摄到的视频数据,将视频数据缓存到内存分配不受限制的native层,根据native层中缓存的视频数据编码得到视频文件;解决了图像数据被缓存在Java层时,会频繁触发垃圾回收机制和发生内存溢出现象的问题;达到了不需要触发垃圾回收机制,也不会发生内存溢出现象的效果。
【附图说明】
[0016]为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0017]图1是本发明一个实施例提供的视频拍摄方法的方法流程图;
[0018]图2是本发明另一实施例提供的视频拍摄方法的方法流程图;
[0019]图3是本发明另一实施例提供的视频拍摄方法的方法流程图
[0020]图4是本发明一个实施例提供的视频拍摄装置的结构示意图;
[0021]图5是本发明另一实施例提供的视频拍摄装置的结构示意图;
[0022]图6是本发明一个实施例提供的电子设备的结构示意图。
【具体实施方式】
[0023]为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
[0024]请参考图1,其示出了本发明一个实施例提供的视频拍摄方法的方法流程图。该视频拍摄方法应用于电子设备中,特别是采用Android系统的电子设备,该视频拍摄方法包括:
[0025]步骤102,获取拍摄到的视频数据;
[0026]步骤104,将视频数据缓存到内存分配不受限制的native层;
[0027]步骤106,根据native层中缓存的视频数据编码得到视频文件。
[0028]综上所述,本实施例提供的视频拍摄方法,通过获取拍摄到的视频数据,将视频数据缓存到内存分配不受限制的native层,根据native层中缓存的视频数据编码得到视频文件;解决了图像数据被缓存在Java层时,会频繁触发垃圾回收机制和发生内存溢出现象的问题;达到了不需要触发垃圾回收机制,也不会发生内存溢出现象的效果。
[0029]请参考图2,其示出了本发明另一实施例提供的视频拍摄方法的方法流程图,该视频拍摄方法应用于电子设备中,特别是采用Android系统的电子设备,该视频拍摄方法包括:
[0030]步骤201,获取拍摄到的视频数据;
[0031]电子设备在接收到用户触发的开始信号后,获取拍摄到的视频数据。视频数据通常包括图像帧(frame)数据和音频帧(sample)数据。若拍摄无声视频,则视频数据可以只包括图像帧数据,但本文中主要以视频数据同时包括图像帧数据和音频帧数据来举例说明。
[0032]电子设备获取图像帧数据的过程包括:电子设备调用Andorid系统提供的PreviewCallback接口,该PreviewCallback接口在摄像头每次拍摄到一巾贞图像巾贞数据时,自动调用onPreviewFrame回调函数返回当前图像巾贞数据。
[0033]电子设备获取音频帧数据的过程包括:电子设备调用Andorid系统提供的Aud1Record接口,该Aud1Record接口在麦克风每次采集到音频巾贞数据时,自动调用onPre1dicNotificat1n回调函数返回当前音频巾贞数据。
[0034]另外,电子设备在接收到开始信号后,也即本次录制开始时,电子设备还新建一个与本次拍摄时间段对应的视频文件(此时为空文件),并调用FFmpeg (开源免费跨平台的音视频流方案)写该视频文件的文件头。
[0035]步骤202,将视频数据缓存到内存分配不受限制的native层;
[0036]电子设备在获取到图像帧数据时,将该图像帧数据缓存到内存分配不受限制的native层,native层是C代码运行的层,理论上可以使用电子设备所支持的全部可用物理内存,而不受限制。同理,电子设备在获取到音频帧数据时,将该音频帧数据也缓存到内存分配不受限制的native层。本步骤可以包括:
[0037]1、电子设备将视频数据的帧数据缓存在native层,该视频数据包括图像帧数据和音频帧数据中的前一种或者全部两种;
[0038]电子设备获取到一帧图像帧数据或者音频帧数据时,一方面将图像帧数据或音频帧数据的真实帧数据存储在native层中,另一方面将图像帧数据或音频帧数据的相关信息插入到预先在Java层创建的队列中。
[0039]2、电子设备将视频数据的相关信息缓存在预先创建在Java层的队列中,该相关信息包括各帧数据在native层中的存储位置和各帧数据所对应的时间。
[0040]图像帧数据或音频帧数据的相关信息可以不限于在native层中的存储位置和时间,本实施例仅以一帧数据的相关信息包括该帧数据在native层中的存储位置和该帧数据所对应的时间来举例说明。其中,该帧数据在native层中的存储位置可以用一个指针表示,该指针指向该巾贞数据在native层中的内存空间。
[0041]需要说明的是,图像帧数据的相关信息可以单独缓存在一个队列中,音频帧数据的相关信息可以单独缓存在另一个队列中。
[0042]步骤203,启动一个异步线程;
[0043]在本实施例中,除了用于缓存图像帧数据和音频帧数据的线程,电子设备还单独启动一个异步线程来完成视频编码。
[0044]步骤204,通过异步线程根据native层中缓存的视频数据编码得到视频文件。
[0045]电子设备通过异步线程根据native层中缓存的视频数据编码得到视频文件。也即,该异步线程不断从上述队列中读取native层中缓存的图像帧数据和音频帧数据,将读取到的图像帧数据和音频帧数据调用FFmpeg编码至上述步骤201中创建的视频文件中。
[0046]本实施例中以视频数据只包括同一时间段拍摄得到的视频数据为例,则电子设备根据队列中缓存的各帧数据各自在native层中的存储位置和各帧数据所对应的时间,从native层中读取各帧数据并顺序编码至同一个视频文件。
[0047]综上所述,本实施例提供的视频拍摄方法,通过获取拍摄到的视频数据,将视频数据缓存到内存分配不受限制的native层,根据native层中缓存的视频数据编码得到视频文件;解决了图像数据被缓存在Java层时,会频繁触发垃圾回收机制和发生内存溢出现象的问题;达到了不需要触发垃圾回收机制,也不会发生内存溢出现象的效果。
[0048]另一方面,【背景技术】中将图像帧数据缓存到Java层的线程和进行视频编码的线程通常为同一线程,如果onPreviewFrame回调函数被阻塞,则会导致编码得到的视频文件的帧速降低。而本实施例的视频拍摄方法,通过异步线程来单独进行视频编码,所以不会发生阻塞现象,从而可以提高编码得到的视频文件的帧速。
[0049]由于用户在拍摄视频时,还可能会使用断点拍摄。如,用户要拍摄6秒时长的短视频,那么用户的手指触摸电子设备上显示的录制按钮时,开始录制视频;用户的手指离开电子设备上显示的录制按钮时,暂停录制视频;当用户的手指再次触摸电子设备上显示的录制按钮时,又继续录制视频,直至录满6秒时长的短视频。为了实现该断点拍摄,提供了如下实施例:
[0050]请参考图3
当前第1页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1