CN104394415B - 一种视频大数据分布式解码的方法 - Google Patents
一种视频大数据分布式解码的方法 Download PDFInfo
- Publication number
- CN104394415B CN104394415B CN201410748160.4A CN201410748160A CN104394415B CN 104394415 B CN104394415 B CN 104394415B CN 201410748160 A CN201410748160 A CN 201410748160A CN 104394415 B CN104394415 B CN 104394415B
- Authority
- CN
- China
- Prior art keywords
- video
- frame
- key
- video file
- objects
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Compression Or Coding Systems Of Tv Signals (AREA)
Abstract
本发明公开了一种视频大数据分布式解码的方法,即基于Spark计算框架以及HDFS的视频大数据分布式解码方法,属于计算机领域。该方法主要包括如下步骤,步骤a:将海量视频文件直接上传至HDFS中进行存储;步骤b:自定义Spark的分片模型,该分片包含视频文件的头信息以及完整的视频关键帧边界;步骤c:构造Spark的分布式数据集HadoopRDD,自定义读取分片数据的方式;步骤d:在HadoopRDD的RDD转化中完成分布式解码;步骤e:在HadoopRDD的RDD动作中对解码后视频图像文件进行保存,用于后续的智能视频分析。
Description
技术领域
本发明涉及一种计算机视频处理领域,特别是一种视频大数据分布式解码的方法。
背景技术
目前视频分析已然在学术以及现实生活中的一个热门领域,原因在于视频数据包含了大量的有价值的信息,但是视频文件具有容量大,无法直接对其进行分析处理,需要对视频文件进行解码,获得原始的视频图像帧后,再对图像帧进行分析,这必然涉及到传输、存储以及解码等工作。
发明内容
发明目的:本发明提出了一种基于Spark计算框架以及HDFS的视频大数据分布式解码的方法,解决了现有的海量视频分布式解码方法中存在的不足,有效提高了解码效率,并且解码准确率达到接近100%。
为了解决上述技术问题,本发明公开了一种基于Spark计算框架以及HDFS的视频大数据分布式解码方法,包括如下步骤:
步骤a:将海量(PB级以上)视频文件直接上传至HDFS中进行存储;
步骤b:定义Spark计算框架的分片模型(InputSplit),该分片包含视频文件的头信息以及完整的视频关键帧边界;
步骤c:构造Spark的分布式数据集HadoopRDD,定义读取分片数据的方式;
步骤d:在分布式数据集HadoopRDD的transformation(RDD转化)中完成分布式解码;
步骤e:在HadoopRDD的action(RDD动作阶段)中对解码后视频图像文件进行保存,用于后续的智能视频分析。
本发明分布式计算是基于Spark,分布式存储是基于HDFS(HadoopDistributedFile System,Hadoop分布式文件***)。
所述步骤b中,根据Spark提供的API实现java类InputSplit的子类,该子类不仅包含数据块在视频文件的起始位置、结束位置、主机信息,还包含视频文件头信息的结束位置以及主机信息。自定义java类InputFormat类的子类,实现该子类的java类getSplits方法,修改HDFS数据块(block)的分割方法,以视频图像帧作为分割边界,即对于每个分割(Split),需判断该分割是否能够得到可解码的帧,从而解决了HDFS现有分割方法(按字节)导致的视频图像帧***进而无法解码的问题。
所述步骤c中,自定义java类RecordReader的子类,该子类的作用是自定义读取分片数据的方式,并结合步骤b中自定义的InputFormat构造Spark的分布式数据集HadoopRDD。
所述步骤d中,实现HadoopRDD的map转化,对每一个map输入,根据视频解码所需的头信息,以及FFmpeg解码库实现对海量视频的分布式解码,并按照<帧的播放时间,视频帧图像文件>格式输出。实现HadoopRDD的reduce转化,对所有HadoopRDD的map转化的输出结果按key(键)进行排序。
所述步骤e中,实现HadoopRDD的action动作,最后结果保存在指定路径下的SequenceFile(HDFS提供的一种二进制存储文件)中,这些信息能够用于动态监测、前后景监测、图像识别等智能视频分析。
相对于现有技术,本发明具有如下有益效果:
1.本发明将海量视频文件直接存储在HDFS中,不需要事先对视频大数据按分布式文件***的数据块进行分割,方便了海量视频的存储。
2.本发明自定义Spark的数据分片模型ImageInputSplit,继承抽象类InputSplit,该类不仅包含数据块在视频文件的起始位置、结束位置、主机信息,还包含视频文件头信息的结束位置以及主机信息。
3.本发明自定义InputFormat的子类,实现该子类的getSplits方法,修改HDFS数据块(block)的分割方法,以视频图像帧作为分割边界,解决了帧***导致视频图像帧缺失的问题。并且自定义分片(ImageInputSplit)数据的读取方式,即自定义RecordReader类,实现InputFormat的createRecordReader方法。从而保证了ImageInputSplit包含完整的视频关键帧边界,解决了传统分布式解码存在的帧***问题。
4.本发明根据以上所述构造Spark的分布式数据集HadoopRDD,通过map、reduce等转化完成所有解码工作,最后通过action(动作)保存最终的视频图像文件。
本发明基于Spark和HDFS,将视频解码任务分发到由可以是较低配置的计算机组成的集群环境中执行,既节约了***运行成本,又提高了解码效率,同时解码后的视频图像帧能够直接用于后续的智能视频分析。
本方法在对海量视频文件的解码过程进行创新,不同于传统的基于单机***的方法,本方法是面向海量视频文件的解码方法,同时也不同基于MR(Hadoop的分布式计算框架Map Reduce)的分布式***,本方法克服了MR的性能瓶颈,特别是MR无法高效处理小文件(小于64M)的缺点。本方法还修改了HDFS(Hadoop Distributed File System,Hadoop分布式文件***)的数据块(block)的分割策略,解决了帧***导致视频图像帧缺失的问题。
附图说明
下面结合附图和具体实施方式对本发明做更进一步的具体说明,本发明的上述和/或其他方面的优点将会变得更加清楚。
图1方法的整体结构图。
图2逻辑分割流程图。
图3逻辑分割示例图。
图4两种方法所用时间对比图。
具体实施方式
本发明公开了一种视频大数据分布式解码的方法,即基于Spark计算框架以及HDFS(HadoopDistributed File System,Hadoop分布式文件***)的视频大数据分布式解码方法,属于计算机领域。该方法主要包括如下步骤,步骤a:将海量视频文件直接上传至HDFS中进行存储;步骤b:自定义Spark的分片模型(InputSplit),该分片包含视频文件的头信息以及完整的视频关键帧边界;步骤c:构造Spark的分布式数据集HadoopRDD,自定义读取分片数据的方式;步骤d:在HadoopRDD的transformation(RDD转化)中完成分布式解码;步骤e:在HadoopRDD的action(RDD动作)中对解码后视频图像文件进行保存,用于后续的智能视频分析。
具体而言,如图1所示,本发明提供一种新的视频大数据分布式解码方法,包括如下步骤:
步骤a:将海量视频文件直接上传至HDFS中进行存储;
步骤b:自定义Spark的分片模型(InputSplit),该分片包含视频文件的头信息以及完整的视频关键帧边界:
b1:自定义Spark的分片模型(InputSplit),实现了用户自定义的ImageInputSplit类,该类继承自抽象类InputSplit,自定义构造方法ImageInputSplit(Path file,longblockStart,long blockLength,String[]blockLocations,longheaderStart,long headerLength,String[]headerLocations),file是视频文件对象,blockStart是个数据块(block)的起始位置,blockLength是数据块(block)的长度,blockLocations是数据块所在的主机,headerStart是视频文件头信息的开始位置,headerLength是视频文件头信息的长度,headerLocations是视频文件头信息,headerLocations是视频文件头信息所在的数据。
b2:自定义InputFormat类的子类ImageInputFormat,在其构造方法中初始化HFFmpegFrameGrabber解码器对象,并覆写getSplits方法,该方法作用是使用HFFmpegFrameGrabber对象,获取视频文件的头信息以及关键帧边界,组成新的数据分片,返回ImageInputFormat对象集合。获取关键帧边界的过程如下:将HFFmpegFrameGrabber对象设置为视频文件的起始位置,然后通过HFFmpegFrameGrabber对象获取下一帧图像,判断该帧是否为关键帧,如果是关键帧,把该帧作为新的ImageFramesSplit对象的起始帧,如果不是关键帧,继续往下获取直到是关键帧,然后停止获取,该ImageFramesSplit对象结束,并返回ImageFramesSplit对象。逻辑分割流程如图2所示,逻辑分割如图3所示,图3中,1,3,4是关键帧,其余是非关键帧。视频文件头信息HeaderSplit也是通过HFFmpegFrameGrabber对象对视频文件进行获取。HeaderSplit和ImageFramesSplit组成新的ImageInputSplit对象,加入到ImageInputSplit对象集合中,最后返回该集合;
步骤c:构造Spark的分布式数据集HadoopRDD,自定义读取分片数据的方式:
c1:步骤b2中的ImageInputFormat中,createRecordReader方法返回一个ImageFrameRecordReader对象;
c2:实现自定义的ImageFrameRecordReader类,该类继承RecordReader类。在ImageFrameRecordReader类中,初始化initialize方法通过参数设置注入ImageInputSplit对象,并在方法中创建HFFmpegFrameGrabber解码器对象。在ImageFrameRecordReader类中,nextKeyValue方法首先将ImageInputSplit***为HeaderSplit和ImageFramesSplit,设置当前Key的值为0,对应Value的值为HeaderSplit的二进制数据,接着判断HFFmpegFrameGrabber解码器对象是否超出该ImageFramesSplit对象的结束位置,如果没有超出,继续获取下一图像帧,如果超出,该ImageFramesSplit结束。通过每次迭代执行nextKeyValue方法来判断是否还有可获取的图像帧,直接设置当前的Key和Value,Key为图像帧的播放时间,Value为图像帧的二进制数据,分别在方法getCurrentKey和getCurrentValue中返回对应的值;
步骤d:在HadoopRDD的transformation(RDD转化)中完成分布式解码:
d1:根据Spark提供的API(Application Programming Interface),编写map的函数,该函数的作用是根据map的传入参数key[0]对应的value(视频文件头信息)对所有key[i](i>0)对应的value值(视频图像帧的二进制数据)进行解码。
d2:图像解码后,将视频图像播放时间作为key,视频帧图像文件作为value,以<key,value>形式作为map的输出。
d3:根据Spark提供的API编写reduce的函数,该函数的作用是对步骤b2输出的数据按其key值(视频帧播放时间)进行排序;
步骤e:在HadoopRDD的action(RDD动作)中对解码后视频图像文件进行保存,用于后续的智能视频分析:
e1:根据Spark提供的API,调用HadoopRDD的saveAsSequenceFile方法,将最终数据保存在指定路径下的SequenceFile中。其中文件中的key值是视频帧的播放位置,value值是视频图像文件。
实施例:
本实施例中,Spark与HDFS集群由9台x86的PC机组成,每台PC机CPU为Intel(R)Core(TM)i7-2600 [email protected],内存为4G,硬盘为500G,其中1台作为集群Master,8台作为集群Slave,用于解码的视频文件的大小分别为30M,60M,90M,1G,2G,4G的MP4视频。本实施例将上述不同大小的视频文件分别进行本方法解码、单机解码和Hadoop(MapReduce结合HDFS)分布式解码,并对三种解码方式的解码时间以及准确性做了对比。
本方法解码和单机解码的所用时间对比如图4所示。本方法的解码的时间远远小于单机解码的时间。
设Hadoop分布式解码后的视频记为H,本方法解码后的视频记为S。测试结果如表1:
视频文件大小 | H的帧数 | S的帧数 | 单机的帧数 | S的准确率 |
30M | 2547 | 3254 | 3254 | 100% |
60M | 7789 | 8475 | 8475 | 100% |
90M | 14789 | 14898 | 14898 | 100% |
1G | 143434 | 168790 | 168790 | 100% |
2G | 354789 | 401548 | 401548 | 100% |
4G | 547201 | 568715 | 568715 | 100% |
由此可见,采取了自定义Spark的分片模型,包含了完整的关键帧边界,没有了帧***,极大提高分布式解码的准确性。
本发明提供了一种视频大数据分布式解码的方法,具体实现该技术方案的方法和途径很多,以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。本实施例中未明确的各组成部分均可用现有技术加以实现。
Claims (1)
1.一种视频大数据分布式解码的方法,其特征在于,包括如下步骤:
步骤a:将海量视频文件直接上传至HDFS分布式文件***中进行存储;
步骤b:自定义Spark的分片模型,该分片包含视频文件的头信息以及完整的视频关键帧边界:
b1:自定义Spark的分片模型,实现了用户自定义的ImageInputSplit类,该类继承自抽象类InputSplit,自定义构造方法ImageInputSplit,构造方法ImageInputSplit中file是路径视频文件对象,blockStart是个数据块的起始位置,block Length是数据块的长度,bloc kLocations是数据块所在的主机,headerStart是视频文件头信息的开始位置,headerLength是视频文件头信息的长度,headerLocations是视频文件头信息,headerLocations是视频文件头信息所在的数据;
b2:自定义InputFormat类的子类ImageInputFormat,在其构造方法中初始化HFFmpegFrameGrabber解码器对象,并覆写getSplits方法,该getSplits方法作用是使用HFFmpegFrameGrabber对象,获取视频文件的头信息以及关键帧边界,组成新的数据分片,返回ImageInputFormat对象集合;
获取关键帧边界的过程如下:将HFFmpegFrameGrabber对象设置为视频文件的起始位置,然后通过HFFmpegFrameGrabber对象获取下一帧图像,判断该帧是否为关键帧,如果是关键帧,把该帧作为新的ImageFramesSplit对象的起始帧,如果不是关键帧,继续往下获取直到是关键帧,然后停止获取,该ImageFramesSplit对象结束,并返回ImageFramesSplit对象;
视频文件头信息HeaderSplit通过HFFmpegFrameGrabber对象对视频文件进行获取,视频文件头信息HeaderSplit和ImageFramesSplit对象组成新的ImageInputSplit对象,加入到ImageInputSplit对象集合中,最后返回该集合;
步骤c:构造Spark的分布式数据集HadoopRDD,自定义读取分片数据的方式:
c1:步骤b2中的子类ImageInputFormat中,采用createRecordReader方法返回一个ImageFrameRecordReader对象;
c2:实现自定义的ImageFrameRecordReader类,该类继承RecordReader类;在ImageFrameRecordReader类中,初始化initialize方法通过参数设置注入ImageInputSplit对象,并在方法中创建HFFmpegFrameGrabber解码器对象;在ImageFrameRecordReader 类中,nextKeyValue方法首先将用户自定义的ImageInputSplit类***为视频文件头信息HeaderSplit和对象的起始帧ImageFramesSplit,设置当前Key的值为0,对应Value的值为视频文件头信息HeaderSplit的二进制数据,接着判断HFFmpegFrameGrabber解码器对象是否超出该对象的起始帧ImageFramesSplit对象的结束位置,如果没有超出,继续获取下一图像帧,如果超出,该对象的起始帧ImageFramesSplit结束;通过每次迭代执行nextKeyValue方法来判断是否还有可获取的图像帧,直接设置当前的Key和Value,Key为图像帧的播放时间,Value为图像帧的二进制数据,分别在方法getCurrentKey和方法getCurrentValue中返回对应的值;
步骤d:在HadoopRDD的RDD转化transformation中完成分布式解码:
d1:根据Spark提供的API接口,编写map的函数,该函数的作用是根据map的传入参数key[0]对应的value对所有key[i]对应的value值进行解码,i>0;
d2:图像解码后,将视频图像播放时间作为key,视频帧图像文件作为value,以<key,value>形式作为map的输出;
d3:根据Spark提供的API接口编写reduce的函数,该函数的作用是对步骤b2输出的数据按其key值进行排序;
步骤e:在HadoopRDD的RDD动作action中对解码后视频图像文件进行保存,用于后续的智能视频分析:
e1:根据Spark提供的API接口,调用HadoopRDD的saveAsSequenceFile方法,将最终数据保存在指定路径下的SequenceFile中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410748160.4A CN104394415B (zh) | 2014-12-09 | 2014-12-09 | 一种视频大数据分布式解码的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410748160.4A CN104394415B (zh) | 2014-12-09 | 2014-12-09 | 一种视频大数据分布式解码的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104394415A CN104394415A (zh) | 2015-03-04 |
CN104394415B true CN104394415B (zh) | 2017-10-17 |
Family
ID=52612243
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410748160.4A Active CN104394415B (zh) | 2014-12-09 | 2014-12-09 | 一种视频大数据分布式解码的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104394415B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104935785A (zh) * | 2015-05-15 | 2015-09-23 | 江苏博智软件科技有限公司 | 基于Hadoop分布式视频大数据前景检测与运动跟踪方法 |
CN105721933A (zh) * | 2016-03-23 | 2016-06-29 | Tcl集团股份有限公司 | 广告视频信息库的创建方法、广告视频识别方法及装置 |
CN106231346B (zh) * | 2016-08-05 | 2020-01-17 | 中国传媒大学 | 一种针对离线视频的分布式加密方法 |
CN109491973A (zh) * | 2018-09-25 | 2019-03-19 | 中国平安人寿保险股份有限公司 | 电子装置、保单变化数据分布式分析方法及存储介质 |
CN114157463A (zh) * | 2021-11-23 | 2022-03-08 | 四川邮电职业技术学院 | 基于大数据分析的网络信息安全预警平台及预警方法 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102510499A (zh) * | 2011-10-19 | 2012-06-20 | 清华大学 | 一种云环境中基于图像组的视频转码方法 |
CN103279521A (zh) * | 2013-05-28 | 2013-09-04 | 重庆大学 | 一种基于Hadoop的视频大数据分布式解码方法 |
CN103297807A (zh) * | 2013-06-21 | 2013-09-11 | 哈尔滨工业大学深圳研究生院 | 一种基于hadoop平台的提高视频转码效率的方法 |
-
2014
- 2014-12-09 CN CN201410748160.4A patent/CN104394415B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN104394415A (zh) | 2015-03-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104394415B (zh) | 一种视频大数据分布式解码的方法 | |
WO2021008290A1 (zh) | 视频流解码方法、装置、终端设备及存储介质 | |
CN105120293B (zh) | 基于cpu和gpu的图像协同解码方法及装置 | |
CN110520909A (zh) | 使用激活数据的压缩和解压缩来减少存储器带宽利用率的神经网络处理器 | |
CN108881916A (zh) | 远程桌面的视频优化处理方法及装置 | |
CN107483059A (zh) | 一种基于动态霍夫曼树的多路数据编解码方法及装置 | |
CN104144349A (zh) | 基于h264的spice视频编解码扩展方法及*** | |
CN103279521A (zh) | 一种基于Hadoop的视频大数据分布式解码方法 | |
CN101299611B (zh) | 一种基于集合游程的数据压缩方法 | |
CN104159150A (zh) | 云终端、云服务器、媒体数据流播放***及方法 | |
CN103546161A (zh) | 基于二进制位处理的无损压缩方法 | |
CN109840879A (zh) | 图像渲染方法、装置、计算机存储介质及终端 | |
CN103428494A (zh) | 基于云计算平台的图像序列编码及恢复方法 | |
US10110896B2 (en) | Adaptive motion JPEG encoding method and system | |
CN102007772A (zh) | 用于分离图像压缩的***和方法 | |
CN110324668A (zh) | 图像块编码中的变换方法、解码中的反变换方法及装置 | |
CN105337617B (zh) | 一种fsn文件高效压缩方法 | |
US20140358996A1 (en) | Distributed encoding and decoding system, method, and device | |
CN105163128B (zh) | 一种利用gpu并行加速图像转换的屏幕图像获取方法 | |
CN112290953B (zh) | 多道数据流的阵列编码装置和方法、阵列解码装置和方法 | |
US20190026350A1 (en) | Structured record compression and retrieval | |
CN116935476A (zh) | 人脸关键点的识别方法、装置和视频直播*** | |
CN107454408A (zh) | 一种图像编码码率动态调整的方法 | |
CN103973310A (zh) | 一种基于异或逻辑运算折半划分的测试数据压缩方法 | |
CN105263021A (zh) | 一种基于uvd的hevc视频解码方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |