苗健,许应康
(中国飞行试验研究院,陕西西安710089)
摘要:视频数据在各种数据中有着不可替代的作用,在视频数据量大,网络环境复杂的情况下,如何显示视频数据就成为重点。H.264格式因为具有更高的压缩效率,更友好的网络适应性,更有效的抗击错误和信息丢失的能力,已经被应用于视频数据中。因此设计了一款针对H.264格式的的视频播放软件,该款软件基于FFmpeg工具包进行开发,经过试验验证能够很好地进行多种格式的解码及播放。
教育期刊网 http://www.jyqkw.com
关键词 :视频数据;H.264;FFmpeg;VFW
中图分类号:TN911-34 文献标识码:A 文章编号:1004-373X(2015)12-0083-02
收稿日期:2014-12-20
0 引言
随着科学技术的发展,视频数据在各种数据中占据了不可替代的作用,而目前视频数据产生的数据量也是越来越大,如何在有限的资源下更好地利用这些数据,成为了大家研究的重点[1]。其中视频压缩算法占据了决定性的作用,不同的压缩算法会产生不同格式的数据[2],所以单一的视频播放器已经无法满足日益多变的视频格式的播放需求,而在各种各样格式文件中,H.264 格式的文件具有更好的压缩率,更友好的网络适应性以及抗干扰性能[3],同时H.264 具有低码率[4],高质量的图像[5],容错能力强,网络适应性强[6]的特点。因此在某些环境下被广泛使用。
但是针对H.264 格式文件进行播放的软件并不常见,很多时候需要进行转码才能进行观看,极大地浪费了时间,在此专门设计了一款针对H.264格式文件进行播放的播放器。
1 H.264 和FFmpeg 介绍
FFmpeg是一款用于记录、转换数字音频和视频,并能将其转化为流的开源工具,这款工具功能非常强大,能够完成视频转换、抓图、视频采集等功能。可以根据具体需求定制相应的功能。
大家常看到的视频文件可以统称为容器,在容器中将视频流、音频流以及字幕等融合在一起形成了视频文件[7],为了完成这些工作FFmpeg 工具包含有编解码模块。该模块位于libavcodec中,根据需要,可以将不同格式的视频流转换成为需要格式的文件,一般的工作流程为先解码然后再进行相应的编码形成对应格式的文件。Muxer模块实现将视频文件、音频文件和字幕文件合并为某一种格式,该模块位于libavformat 中,而在libavutil中则包含公共的工具函数。
2 软件设计及实现
2.1 软件设计
软件主要实现了两个功能:编解码模块和显示播放模块。其中编解码模块的工作流程如图1 所示。
在某些情况下视频需要对现有格式文件进行转码以后才能进行播放,这时就需要进行转码工作,它的工作流程是首先将原来的文件进行解码,然后再次进行编码,最后再合并到文件容器中,得到所需要的视频文件。转码工作流程图如图2所示。
图2中write_frame()函数是用于将编码后的数据包中的帧写入输出视频容器文件中,avpacket是写入容器文件的基本单元。通过上述两个流程基本完成了视频格式的解码工作。完成了解码工作后需要进行的就是视频的显示输出工作,在这里使用VFW 数字视频开发包及DrawDib函数组来完成相应的功能。
2.2 软件实现
处理视频流首先需要打开视频流,从视频流中读取包到帧中,如果这个帧不完整,则继续从视频流中读取包到帧中,然后对帧进行一些操作,该过程不断的重复,部分代码如下所示:
av_register_al(l );
char name[100];
AVFormatContext *pavFormatContext;
i(f av_open_input_file(&pavFormatContext,name,NULL)!=0)
return-1;
i(f av_find_stream_info(pavFormatContext)<0)
return-1;
int i,videoStream=-1,frameFinished;
AVCodecContext *pavCodecContext;
for(i=0;i<pavFormatContext->nb_streams;i++)
if(pavFormatContext->streams[i]->codec->codec_type==
CODEC_TYPE_VIDEO)
{
videoStream=I;
break;
}
i(f videoStream==-1)
return-1;
pavCodecContext= pavFormatContext->streams[videoStream]->
codec;AVCodec *pavCodec;
pavCodec = avcodec_find_decoder(pavCodecContext->
codec_id);
i(f avcodec_open(pavCodecContext,pavCodec)<0)
return-1;
AVFrame *pavFrame,*pavFrameRGB;
pavFrame = avcodec_alloc_frame();pavFrameRGB=avco-
dec_alloc_frame();
AVPacket packet;
while(av_read_frame(pavFormatContext,&packet)>=0)
{
i(f packet.stream_index==videoStream){
Avcodec_decode_video(pavCodecContext,pavFrame,&frame-
Finished,packet.data,packet.size);
i(f frameFinished){
img_convert((AVPicture*)pavFrameRGB,PIX_FMT_RGB24,
(AVPicture*)pavFrame,pavCodecContext->pix_fmt,pavCodecCon-
text->width,pavCodecContext->height);
SaveFrame(pavFrameRGB,pavCodecContext - >width,pavCo-
decContext->height,i);
}
}
Av_free_packe(t &packet);
}
3 结语
使用FFmpeg开源工具研制的这款软件经过试验,能够正常地播放多种格式的视频文件,提供了极高的便利性。目前视频格式越来越多样化,对于播放的要求也越来越高,如何对各种形式的数据进行解码复用就非常值得研究。同时也发现FFmpeg功能非常强大,涉及的内容非常多,是值得深入了解和学习的一款工具。因此在视频解码及播放显示方面,还有更多的工作需要进行深入的研究。
作者简介:苗健(1983—),男,河北石家庄人,助理工程师,硕士。主要研究方向为软件。
教育期刊网 http://www.jyqkw.com
参考文献
[1] 李蔷.H.264视频编码码率控制技术研究[D].上海:上海交通大学,2005.
[2] 徐传书.H.264中的快速运动估计算法研究[D].太原:太原理工大学,2011.
[3] 裴世保.H.264/AVC中预测模式选择算法研究[D].合肥:中国科学技术大学,2005.
[4] 秦秀贵.H.264 快速帧内预测算法研究[D].济南:山东大学,2008.
[5] 王纲.H.264视频压缩标准的研究与实现[D].成都:电子科技大学,2006.
[6] 朱珍伟.基于H.264标准视频流的错误隐藏技术研究[D].上海:复旦大学,2006.
[7] 刘合.音视频编辑库的设计与实现[D].武汉:华中科技大学,2011.