ffmpeg

2024-07-14

ffmpeg(共4篇)

ffmpeg 篇1

多媒体技术逐渐普及深入,也随之出现了许多多媒体格式互相转换的软件,常见的格式有:avi、swf、flv、rm、rmvb和wmv等,不常见的格式有:navi、mkv等。不同格式的视频文件的计算方法不同,即采用了不同的的视频编码方法,这也就导致了保存同样的视频内容,视频清晰度不同和占用空间不同[1]。一般采用占用空间大的算法,其视频清晰程度也越高,而采用占用空间小的算法,其视频清晰度也越低。有些视频格式编码算法比较复杂,占用空间大,为了减少存储空间的占用率,也就是说为了减小体积,我们将某一格式转换为另一格式。另一方面,多媒体文件通常要制作多种多媒体产品,有时工具对视频格式的支持是有限的,所以为了满足相关工具的支持,所以,把少数格式(不常用的格式,软件不支持的格式)转换为多数格式(即常用的格式),满足了软件的制作需要,也就能够制作出产品来了。

1 相关背景

为了满足市场对多媒体视频处理的需求,无论是公司还是开源社区都作出了很多积极的尝试,出现了很多优秀的产品,他们分别是GStreamer、Drect Show和ffmpeg等,以下分别对这三种技术作出简单介绍。

GStreamer是一个开源的多媒体框架库。利用它可以实现从简单的ogg播放功能到复杂的音频和视频的处理。由于良好的封装性能,应用程序可以方便利用解码和过滤技术。开发者可以使用简洁通用的接口来编写一个简单的插件来添加新的解码器或滤镜。GStreamer是linux上的多媒体应用框架。一直以来,linux上的多媒体开发都很麻烦,由于没有统一模型,所以很多东西都需要自己实现。gstreamer的目的就是弥补这一缺陷。

Direct Show是微软公司在Active Movie和Video for Windows的基础上推出的新一代基于COM的流媒体处理的开发包,与Direct X开发包一起发布。Direct Show为多媒体流的捕捉和回放提供了强有力的支持。运用Direct Show,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。这样使在多媒体数据库管理系统(MDBMS)中多媒体数据的存取变得更加方便。

ffmpeg是一款强大的音视频编码器与解码器的集合[2],支持多种文件格式,ffmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件)你可以自由获取所有ffmpeg的源代码。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的。这个项目最初是由Fabrice Bellard发起的,而现在是由Michael Niedermayer在进行维护。许多ffmpeg的开发者同时也是MPlayer项目的成员,ffmpeg在MPlayer项目中是被设计为服务器版本进行开发。由于ffmpeg拥有良好的开源社区支持,ffmpeg视频格式转换越来越受到大家的重视。

2 ffmpeg格式转换

ffmpeg拥有强大的视频格式转换能力,其libavcodec库是专门用来对各种类型声音/图像进行编解码的。具体流程如图1所示。

格式转换算法流程如下:

第一步,打开输入文件,获取文件流信息

第二步,在视频文件中,存在音频流和视频流,这一步,主要从输入文件中的目标对象,即视频流。

第三步,根据视频流信息,找到相应的解码器,并打开解码器,让其处于工作状态,为接下来的视频解码做好准备。第四步,如果视频文件没有结束,则解码视频流文件下一帧,否则,结束。

第五步,根据格式转换的需要,构建输出视频文件信息,打开输出视频编码器。

第六步,将解码的视频流帧,利用第五步得到的编码器进行编码,并将其添加到输出视频文件中。

3 实现过程

3.1 寻找视频流,代码如下

3.2 解码视频帧,代码如下

3.3 编码视频帧,代码如下

4 结束语

ffmpeg由于得到开源社区的大力支持,接口函数得到了透明良好的封装,使得视频格式转换能够快速有效的进行,正因为如此,ffmpeg在视频处理领域越来越得到广大开发者的认可。

参考文献

[1]张学武,杨学星,江冰.基于H.263的视频编码、解码的研究及软件实现[J].计算机工程与设计,2005(9).

[2]吴张顺,张珣.基于FFmpeg的视频编码存储研究与实现[J].杭州电子科技大学学报,2006(3).

ffmpeg 篇2

随着科学技术的发展,视频数据在各种数据中占据了不可替代的作用,而目前视频数据产生的数据量也是越来越大,如何在有限的资源下更好地利用这些数据,成为了大家研究的重点[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 软件实现

处理视频流首先需要打开视频流,从视频流中读取包到帧中,如果这个帧不完整,则继续从视频流中读取包到帧中,然后对帧进行一些操作,该过程不断的重复,部分代码如下所示:

3 结语

使用FFmpeg开源工具研制的这款软件经过试验,能够正常地播放多种格式的视频文件,提供了极高的便利性。目前视频格式越来越多样化,对于播放的要求也越来越高,如何对各种形式的数据进行解码复用就非常值得研究。同时也发现FFmpeg功能非常强大,涉及的内容非常多,是值得深入了解和学习的一款工具。因此在视频解码及播放显示方面,还有更多的工作需要进行深入的研究。

参考文献

[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.

ffmpeg 篇3

关键词:Android,FFmpeg,C/S,RTP/RTCP,客户端

1 引言

随着网络技术和通信技术的不断发展, 网络视频监控技术突破了地域的限制, 广泛地应用于各个领域。但是传统视频监控系统采用将采集的实时视频传输到监控中心并由专业人员处理突发事件的方式, 并不能满足用户多元化的需求。

本文旨在设计基于FFmpeg的视频客户端软件, 即移动终端上的视频监控系统。该客户端可以让用户远程地使用手机接收视频了解监控情况并迅速做出处理, 在降低了监控服务成本的同时满足了人们对监控便捷性的要求[1]。

2 系统设计方案

本文结合Android操作系统的特点和流媒体协议, 设计并实现了基于FFmpeg的视频客户端软件。考虑到客户端处理问题的需求及安全性, 整体系统采用C/S的架构模式, 摆脱了Android对B/S架构中浏览器功能的局限性, 可以采用多种视频编解码标准展示不同的视频格式。系统的总体架构图如图1所示。

3 客户端软件设计

本文视频客户端软件基于Android平台开发, 运用Java语言编写代码设计并实现了用户登录、视频接收、视频解码和视频显示四个模块。

3.1 用户登录模块

为了视频的安全保密性, 用户在登陆前需要通过身份信息的验证。若用户名密码均验证通过则进入摄像头选择界面, 可选择摄像头编号并进行视频显示。

3.2 视频接收模块

视频接收模块主要负责与远程服务器连接, 并接收远程服务端以数据包形式传输的视频, 最后把数据包存入待解码缓冲区。目前, 视频的传输采用流媒体技术, 本客户端采用实时传输协议RTP完成端到端的传输, RTP通常运行于UDP协议之上, 是一种基于网络的一对一或一对多的多媒体数据流的传输协议。与数据传输控制协议RTCP一同使用, RTCP负责在RTP会话期间向应用程序提供会话、广播性能质量的统计信息[2]。

由于在客户端接收过程中, 较大的数据包会被分割, 因此需要对不完整的视频帧进行重新组帧。在缓冲后解码前, 从缓冲区内获取数据包, 并根据其时间戳和序列号来判断是否接收到充足的数据, 再根据帧算法完成帧的合成。帧处理算法流程图如图2所示。

3.3 视频解码模块

由于摄像头采集的视频数据量很大, 而且依赖于无线网络完成传输, 对于视频的存储和传输都相对困难。因此需要将视频进行压缩, 在保持视频清晰度的同时减少视频的存储空间, 提高视频的传输速度。

在解码之前, 首先需要通过av_registerall () 注册FFmpeg的各种解码格式, 然后通过avformat_find_stream_info () 获取数据已经解析的编码信息, 并通过avcodec_find_decoder () 选择合适的解码器, 在运用avcodec_alloc_frame () 为解码数据帧分配内存后, 利用av_get_frame () 获取待解码缓存区内的帧数据, 并用avcodec_decode_video () 进行解码, 解码完成的帧需要通过av_set_frame () 放入待播放缓冲区。在此过程中, 需要通过av_has_next_frame () 进行判断待解码缓冲区内是否还存在数据帧, 若解码完成则调用avcodec_close () 释放内存。解码模块的流程图如图3所示。

3.4 视频显示模块

视频在解码后就可以进行播放, 视频播放模块主要面向用户, 考虑到用户体验本客户端软件界面设计简约美观。视频采用实时播放, 一般情况下视频解码完成一帧后, 视频播放模块读取该帧数据进行播放。但是这就会导致视频播放可能出现抖动, 因此本客户端软件对视频播放模块进行了改进, 采用帧延迟的方法缓存待播放的帧, 从而提高视频的播放效果, 帧延时算法如图4所示。视频的显示效果图如图5所示。

4 结语

本文设计并实现了基于FFmpeg的视频客户端的软件, 完成了用户登录、视频接收、视频解码和视频显示功能。本客户端安装并运行于Android手机, 结合视频监控系统硬件设备进行了功能测试。测试结果表明各项功能均达到要求, 客户端具较好的通用性机及广阔的应用前景。

参考文献

[1]詹青龙.网络视频技术及应用[M].西安:西安电子科技大学出版社, 2004.

ffmpeg 篇4

在Windows平台的流媒体系统中,由于Windows Media Player与Windows操作系统捆绑以及Windows操作系统的普及程度,依赖Windows Media Player作为媒体系统的客户端呈现给用户可以使得用户友好性得到增强,也可以节省开发新媒体播放器的成本,所以很多应用于Windows平台下的流媒体系统都是利用Windows Media Player作为媒体系统的终端。要使得以Windows Media Player作为客户端的ASF流媒体系统能够采用H.264编码视频格式,就必须要有支持ASF容器中H.264视频播放的插件。通过探索,作者寻找到一种利用FFMPEG,对其进行DMO[3]封装实现配合Windows Media Player支持H.264视频播放的插件的方法。

1 H.264简介

H.264是国际标准化组织(ISO)和国际电信联盟(ITU)共同提出的继MPEG4之后的新一代数字视频压缩格式,它即保留了以往压缩技术的优点和精华又具有其他压缩技术无法比拟的许多优点。

(1) 低码流(Low Bit Rate):

和MPEG2和MPEG4 ASP等压缩技术相比,在同等图像质量下,采用H.264技术压缩后的数据量只有MPEG2的1/8,MPEG4的1/3;显然,H.264压缩技术的采用可以大大节省用户的下载时间和数据流量收费。

(2) 高质量的图像:

H.264能提供连续、流畅的高质量图像(DVD质量);

(3) 容错能力强:

H.264提供了解决在不稳定网络环境下容易发生的丢包等错误的必要工具;

(4) 网络适应性强:

H.264提供了网络适应层(Network Adaptation Layer), 使得H.264的文件能容易地在不同网络上传输(例如互联网,CDMA,GPRS,WCDMA,CDMA2000等);

H.264标准还在不断发展,SVC(scalable video coding)[4]和MVC(multi-view coding)[5]添加作为H.264的修正的标准化工作正在进行中,因此H.264的功能将更加丰富,适用更多应用场景。我们有理由相信,H.264标准将会受到业界的广泛应用,因此实现支持H.264播放的插件对Windows平台流媒体应用非常有意义。

2 DMO介绍及应用

在Windows 媒体应用中,主要包括DirectShow[3]和DMO。DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布,为多媒体流的捕捉和回放提供了强有力的支持。

DirectX媒体对象(DirectX Media Objects,简称DMOs),是微软提供的另一种流数据处理COM组件,与DirectShow filter相比,DMO有以下优点:

(1) DMO比filter实现的功能要少很多,这使得DMO“体积”很小;

(2) DMO使用起来比filter更有灵活性。DMO的使用不需要filter graph,应用程序可以直接与DMO交互。而DMO也可以通过一个DMO wrapper filter工作于 DirectShow环境。

(3) DMO总是同步处理数据,不像filter有独立的数据传送线程,需要考虑多线程编程问题;

(4) 与传统的编解码管理器ACM、VCM相比,用DMO开发的编解码器是基于COM的,更易于扩展。并且DMO支持多个输入和多个输出;

(5) DMO不需要像filter一样分配数据传送的内存,而有DMO的使用者负责;

(6) DMO是一个独立功能模块,不需要像filter一样连接成一条链路;

(7) DMO不需要像filter一样将数据“推”下去,数据的输入输出都是由DMO的使用者完成的;

所有这些优点,使得DMO成为微软对于Encoder和Decoder开发的重点推荐模式。DirectX 9.0 SDK中,微软更是把DMO从DirectShow中分离出来,而对于一些transform filter,微软也推荐用DMO的方式来替换。因此,本文选择用DMO来封装H.264视频解码插件。

3 FFMPEG

FFMPEG是一套完整的录制,转换和流化音频和视频的开放源代码的解决方案,其包括以下几部分组成:

(1) libavcodec,一个包含了所有FFmpeg音视频编解码器的库.为了保证最优性能和高可复用性,大多数编解码器从头开发的。

(2) libavformat,一个包含了所有的普通音视格式的解析器和产生器的库,该库里边包含解码H.264的codec。

(3) ffplay,用 SDL和FFmpeg库开发的一个简单的媒体播放器。

(4) ffserver,基于HTTP用于实时广播的多媒体服务器。

(5) ffmpeg,视频文件转换命令行工具,也支持经过实时电视卡抓取和编码成视频文件。

FFMPEG是基于linux平台上开发的,想要移植到VC平台上需要进行很大的改动,比较困难。幸好在Windows平台下可以利用MinGW 编译FFMPEG代码,生成avformat.dll, avcodec.dll , avutil.dll三个动态连接库,可供应用程序使用。FFMPEG的高性能设计,以及其包含的经过了优化的H.264解码算法,使得FFMPEG解码H.264视频的速度相当快;在H.264开源解码器评测中,FFMPEG的解码速度最快。因此利用FFMPEG实现播放插件,解码速度快,占用内存小。

4 代码实现

代码实现的主要任务是将FFMPEG封装在DMO对象中,由DMO对象与Windows Media Player协商媒体类型、对象连接以及传递媒体数据,而FFMPEG负责将输入到DMO中的未解码的H.264视频帧解码成可以显示的RGB格式的视频帧,然后交由DMO输出端传送予Windows Media Player进行显示。

在微软的DirectX SDK中,为开发DMO提供了一个IMediaObjectImpl模板类,使得开发DMO比较容易。 实现程序定制的DMO,只需派生此模板类,实现17个以Internal开头的函数。

4.1 FFMPEG库的使用

使用FFMPEG库,首先应该将avcodec.dll,avformat.dll,

avutil.dll加入到工程中,并且在文件头中需要包含avcodec.h头文件;

另外使用FFMPEG库的函数之前,需要对FFMPEG库进行初始化,因此本实现中是在DMO对象的构造函数中实现FFMPEG库的初始化。通常的操作是通过avcodec_init()以及avcodec_register_all()初始化并注册FFMPEG所有的编码解码器;然后通过CODEC_ID_H264指示码寻找到本DMO使用的H.264解码器,即:

codec = avcodec_find_decoder(CODEC_ID_H264).

然后做编解码器上下文初始化及申请空间保存解码图像,即:c= avcodec_alloc_context();

picture= avcodec_alloc_frame();

最后是根据得到的H.264 codec以及解码上下文结构去打开H.264解码器,使其能够工作,即:

avcodec_open(c, codec);

具体代码可以参照ffmpeg源代码中的output_example.c中的示例代码。

4.2 InternalCheckInputType函数

该函数的主要目的是检查DMO对象是否适合于此输入的媒体类型的解码,如果检查通过那么该DMO才可以用于此种类型视频的解码。本设计的DMO中实现的是H.264视频解码插件,因此DMO接收的输入媒体主类型是视频,而媒体subtype则是H.264格式;所以只有当媒体类型符合此限制时,函数返回TRUE,检查通过。

4.3 InternalCheckOutputType函数

该函数的目的是检查DMO对象是否能够产生此种媒体类型的视频输出,如果检查通过那么该DMO才可以用于产生此类视频输出。解码器的目的就是将压缩的格式解码,成为无压缩可以直接显示的格式;在这里,我们选择最普通的RGB24格式。

4.4 InternalProcessInput函数

该函数的作用是输入一个未解码的图像帧,需要做的工作就是把帧对象保存,以待应用程序在DMO输出端请求图像输出时,对此输入图像帧执行解码操作,属出解码图像。因为图像帧在图像中是通过C++的COM对象IMediaBuffer来保存的,因此我们只需要IMediaBuffer的接口函数GetBufferAndLength得到输入的图像存放的内存块指针和大小,然后增加COM对象的引用计数,最后设置相关的时间戳即可。

4.5 InternalProcessOutput函数

该函数的作用是将上次输入DMO的未解码的帧调用FFMPEG中的解码 函数进行解码,输入YUV格式的视频,然而我们最终要求输出的视频格式是RGB格式的,因此还必须将YUV格式的视频转换成RGB格式的视频。幸好的是FFMPEG中有高度优化的函数YUV2RGB供我们使用。使用本DMO的应用程序会向本函数请求输出解码图像,因此在这里我们调用FFMPEG中的解码函数对输入图像进行解码,把解码重建后的图像输出,交由应用程序进行播放。具体的代码如下:

len = avcodec_decode_video(c, picture, &got_picture,outbuf_ptr, size);//调用FFMPEG媒体库的解码函数进行解码

YUV2RGB(picture->data[0],picture->data[1],picture->data[2],pOutData,pic_width,pic_height); //调用FFMPEG媒体库的格式转换函数将YUV格式视频转换成RGB格式

4.6 DMO注册函数

Windows Media Player播放视音频时,会根据视音频的格式到系统注册表中寻找到相应的解码器,如果找不到合适的解码器,Windows Media Player则播放不正常甚至无法播放。所以DMO程序需要在系统中进行注册,而DMO本身是一个COM程序,COM程序的注册在DllRegisterServer中进行。因此在DllRegisterServer函数中通过接口函数DMORegister在操作系统注册表中注册本DMO的信息。设置DMO的信息为只有一个输入端,输入的是H.264格式的视频;设置DMO的信息为只有一个输出端,输出的是RGB格式的视频。如此设置以后,当Windows Media Player播放ASF中的H.264视频时可以顺利地寻找到本插件,成功播放ASF容器中H.264格式的视频。

//定义输入媒体格式

DMO_PARTIAL_MEDIATYPE mt_input;

mt_input.type=MEDIATYPE_Video;

mt_input.subtype=MEDIASUBTYPE_H264;

//定义输出媒体格式

DMO_PARTIAL_MEDIATYPE mt_output; mt_output.type=MEDIATYPE_Video;

mt_output.subtype=MEDIASUBTYPE_RGB24;

DMORegister(L“DMO Sample”, //DMO对象名

CLSID_Sample, //DMO对象的序列ID DMOCATEGORY_VIDEO_DECODER, //视频解码器目录

0,

1, //输入媒体类型个数

&mt_input, //输入媒体类型格式

1, //输出媒体类型个数

&mt_output); //输出媒体类型格式

到此,利用FFMPEG封装在DMO对象中构造一个能支持Windows Media Player播放ASF容器中的H.264视频播放插件所需要做的工作已经完成。

5 结束语

鉴于目前缺乏配合Windows Media Player播放ASF媒体容器格式的H.264视频播放的免费插件,本文介绍了一种简单实现此插件的方法,依赖于DMO高效性以及FFMPEG编解码库中性能优化的H.264解码算法,使得插件解码速度快,内存损耗小。利用此插件,Windows平台上的H.264流媒体系统可以利用Windows Media Player作为媒体系统的客户端,节省开发新播放器的成本,大大增强了系统的用户友好性。

参考文献

[1]Draft ITU-T recommendation and final draft international standard of joint video specification(ITU-T Rec.H.264/ISO/IEC14496-10AVC)in Joint Video Team(JVT)of ISO/IEC MPEG and ITU-TVCEG,JVTG050,2003.

[2]Microsoft Corporation.Adranced Sytems Format(ASF)Specifrcation,Revision01.20.03,December2004[5].

[3]陆其明.Drrectshow开发指南.北京:清华大学出版社,2003.

[4]T.Wiegand,G.J.Skuivan,J.Reichel,H.Schwarz ancl M.wien,eds.Jornt Draft7,Joint Video Team.Doc.JVT-T201,Klagenfurt,Austria,July2006.

【ffmpeg】推荐阅读:

上一篇:毕业意愿论文下一篇:BA网络

本站热搜

    相关推荐