H263/H264/MPEG4及其差别 && Android 用MediaCodec实现视频硬解码

      目前比较流行的几种适合网络传输的视频编码有:MPEG4、H263、H264。下面简要介绍下这些编码。

(1)MPEG4:MPEG-4标准主要应用于视像电话(Video Phone),视像电子邮件(Video Email)和电子新闻(Electronic News)等。MPEG-4利用很窄的带宽,通过帧重建技术,压缩和传输数据,以求以最少的数据获得最佳的图象质量。它采用面向对象的压缩方式,根据图像的内容,把其中的对象(物体、人物、背景)分离出来,分别进行帧内、帧间编码,并允许在不同的对象之间灵活分配码率(对重要的对象分配较多的字节,对次要的对象分配较少的字节,从而大大提高了压缩比)。

(2)H263:263是国际电联ITU-T的一个标准草案,是为低码流通信而设计的。但实际上这个标准可用在很宽的码流范围,而非只用于低码流应用。H.263采用无限制的运动向量以及基于语法的算术编码,采用事先预测和与MPEG中的P-B帧一样的帧预测方法。H.263支持5种分辨率,即除了支持QCIF和CIF外,还支持SQCIF、4CIF和16CIF。

(3)H.264是ITU-T的VCEG (Video Coding Experts Group)和ISO/IEC的MPEG(Motion Picture Experts Group)联合成立的“联合视频组”(JVT:Joint Video Team)共同制定的新建议,它等同于ISO的MPEG-4的Part10。可以说,264是263的发展和延续,同时吸收了MPEG的一些优点。它的码流结构网络适应性强,增加了差错恢复能力,能够很好地适应IP和无线网络的应用,

(4)比较:和H.263、H.264比较而言,MPEG4相对简单,实现起来对系统要求也最低,但效果也最差的。对这种编码,和另外两种比起来,优势并不大,不多讲,主要的讲263和264。

      263是种优秀的编码,它可以根据需要产生适合网络情况传输的视频流,在网络允许的条件下生成最好的视频效果。也就是说,它产生的流量是可变的,可以适应很宽的网络带宽,满足不同需要。另外,263的标准也很完备,它充分考虑了不同厂家产品的兼容性,不同厂家的产品之间互通不存在问题,因此,263也是视频产品领域个厂家所必须支持的标准之一。

       从产品开发的角度讲,264和263的差别并不大:它是263的发展,与之比较,除了263的优点外,还有更高的压缩比,有更好的图象质量。这也就意味着,同样的网络和同样的流量情况下,264能够产生更好的视觉效果,从实际来看,这个效果是好很多的。

       但264也是有缺点的。首先,由于264的算法更加复杂,程序实现烦琐,运行它需要更多的处理器和内存资源。在相同的系统下,可能可以跑起四路MPEG4,两路263,却不一定跑得起一路264(当然跟这个程序的效率有关)。因此,运行264对系统要求是比较高的。其次,由于264的实现更加灵活,它把一些实现留给了厂商自己去实现,虽然这样给实现带来了很多好处,但是不同产品之间互通成了很大的问题,造成了通过A公司的编码器编出的数据,必须通过A公司的解码器去解这样尴尬的事情。

 参考原文:http://blog.csdn.net/wcl0715/archive/2006/04/25/676137.aspx

==================================Android 用MediaCodec实现摄像头H264硬编码解码===================================

参见http://blog.csdn.net/halleyzhang3/article/details/11473961

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MediaCodecAndroid 提供的一个用于音视频解码的 API,通过 MediaCodec 可以实现对 H.264 等常见视频格式的解码。下面是一个简单的使用 MediaCodec 解码 H.264 的示例: ```java // 创建 MediaCodec 对象 MediaCodec codec = MediaCodec.createDecoderByType("video/avc"); // 配置 MediaCodec,设置输入数据格式和输出数据 Surface MediaFormat format = MediaFormat.createVideoFormat("video/avc", width, height); format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Flexible); codec.configure(format, surface, null, 0); // 启动 MediaCodec codec.start(); // 循环读取 H.264 数据并进行解码 while (decoding) { int inputBufferIndex = codec.dequeueInputBuffer(-1); if (inputBufferIndex >= 0) { ByteBuffer inputBuffer = codec.getInputBuffer(inputBufferIndex); // 将 H.264 数据写入 inputBuffer 中 codec.queueInputBuffer(inputBufferIndex, 0, data.length, presentationTimeUs, 0); } MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); int outputBufferIndex = codec.dequeueOutputBuffer(bufferInfo, 0); if (outputBufferIndex >= 0) { ByteBuffer outputBuffer = codec.getOutputBuffer(outputBufferIndex); // 处理解码后的 YUV 数据 codec.releaseOutputBuffer(outputBufferIndex, true); } } ``` 需要注意的是,在使用 MediaCodec 解码 H.264 数据时,需要将 H.264 数据先解析成 NAL 单元,再将 NAL 单元写入到 inputBuffer 中进行解码。另外,解码后的数据是 YUV 格式的数据,需要根据实际需求进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值