`
absolute
  • 浏览: 190530 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

h264解码接口的调用

 
阅读更多

前段时间需要用到在android里面软解码h264视频,就到网上找了些fmmepg的移植代码,可是虽然接口给我了,但是还是不会用。记录下研究新得把,太无聊了。

 

在h264里面,分为VCL层和NAL层。VCL为实际的h264实现,所有视频文件格式存储,具体的编解码工作都在这一层。

 

NAL层,我理解的是传输层,不管是在本地播放还是在网络播放的传输,都要通过这一层来传输。h264的文件被分割为

很多个叫着NAL的一个个小块,很多个小的NAL被组成一个完整的帧,也就是一个完整的画面。我要做的就是把这些NAL

包从文件里面分割出来传给fmpeg的解码函数。

 

package com.h264.codec;

import java.io.FileInputStream;
import java.io.InputStream;

public class H264Decoder {

	private int mask = 0x0F0F0F0F;

	int getNextNal(byte[] nalBuf, int nalBufUsed, byte[] dataBuf,
			int dataBufUsed, int dataRemain) {
		int i = 0;
		byte data;

		for (i = 0; i < dataRemain; i++) {
			data = dataBuf[i + dataBufUsed];
			nalBuf[i + nalBufUsed] = data;

			mask <<= 8;
			mask |= data;

			if (mask == 1) {
				i++;
				break;
			}
		}

		return i;
	}

	public void decode(InputStream is) throws Exception {
		
		boolean firstFlag = true;
		int nalLen;
		int read = 0;
		int nalBufUsed = 0;
		int dataBufUsed = 0;

		byte[] nalBuf = new byte[40960]; // 40k
		byte[] dataBuf = new byte[2048];

		while ((read = is.read(dataBuf, 0, 2048)) > 0) {
			dataBufUsed = 0;
			while (read - dataBufUsed > 0) {
				nalLen = getNextNal(nalBuf, nalBufUsed, dataBuf, dataBufUsed,
						read - dataBufUsed);

				nalBufUsed += nalLen;
				dataBufUsed += nalLen;

				if (mask == 1) {
					mask = 0xFFFFFFFF;
					if (firstFlag == true) {// the first start flag
						firstFlag = false;
					} else {
						// decode nal
						decoderNal(nalBuf, nalBufUsed-4);
					}

					nalBuf[0] = 0;
					nalBuf[1] = 0;
					nalBuf[2] = 0;
					nalBuf[3] = 1;

					nalBufUsed = 4;
				}
			}
		}
		is.close();
	}
	
	private void decoderNal(byte[] nalBuf, int length) {
		//具体的解码函数,需要调用c接口
	}

	public static void main(String[] args) throws Exception {
		InputStream is = new FileInputStream("D:/document/h264decoder/352x288.avi");
		H264Decoder test = new H264Decoder();
		test.decode(is);
	}
}
 
分享到:
评论

相关推荐

    思 H264 解码库

    他们的H264解码库通常是用C或C++编写的,并提供了API供开发者调用,以便在不同的平台上实现H264视频流的解码。 在C# WinForm应用中使用这个库,我们需要进行以下步骤: 1. **集成库文件**:压缩包中的"lib"文件夹...

    ffmpeg H264解码 vc版本

    关键接口包括`avcodec_find_decoder()`用于查找H264解码器,`avcodec_alloc_context3()`创建解码上下文,`avcodec_open2()`打开解码器并初始化上下文,以及`avcodec_decode_video2()`用于实际的解码操作。...

    h264_dec_vs2012_IHW264Dec_Api_海思H.264解码库_H.264_IHW264Dec_Api.h_源

    《海思H.264解码库与IHW264Dec_Api接口解析》 在数字视频处理领域,高效编码技术是至关重要的,而H.264(也称为AVC,Advanced Video Coding)正是其中的一颗璀璨明星。H.264以其卓越的压缩效率,广泛应用于高清视频...

    c++ H264文件逐帧提取 每帧可单独解码使用

    在这个项目中,可能已经包含了解码库的接口,通过调用`avcodec_decode_video2`函数来解码NAL单元,得到YUV或者RGB格式的图像数据。 为了使每帧可单独解码使用,我们需要确保每个NAL单元包含完整的视频帧信息,不...

    H264解码器(Android JNI 定制)

    最后,提到开放了JNI接口,意味着开发者为Java层提供了一套API,使得Java应用程序可以方便地调用C/C++解码器的功能,如初始化解码器、提交H264数据进行解码、获取解码后的帧等。这样的设计使得Java应用程序无需关心...

    基于ffmpeg的h264解码模块

    1. `.h` 文件:这是头文件,包含了接口定义和函数声明,允许开发者在自己的项目中调用解码模块。 2. `.lib` 文件:这是一个静态链接库,包含了编译好的解码器实现。在C/C++项目中,你可以链接这个库来使用解码功能。...

    基于ffmpeg的h264解码库

    在实际应用中,开发者可以通过接口调用该解码库,传入编码的H264数据流,解码库会自动完成以上流程,并将解码后的YUV 420p数据通过预设的回调函数返回。这使得开发者可以专注于自己的应用程序逻辑,而无需关心底层...

    WebCodecs 硬解码h264 9画面

    在“WebCodecs硬解码h264 9画面”这个场景中,我们讨论的是使用WebCodecs API来实现对h264编码的视频进行硬件加速解码,并同时显示9个不同的画面。 首先,我们来看WebCodecs API的核心概念。它提供了一系列接口,...

    Android H264解码库161207

    1. 解码器接口:一个API,供Android应用程序调用来解码H264流。 2. NAL单元解析:用于识别和提取视频帧的逻辑。 3. 硬件加速支持:如果可用,库可能利用Android硬件编解码器来提升性能。 4. 错误处理:确保在解码...

    h264decoder.rar_h264_rapidly552_windows h264解码_解码库

    H264Decoder这个库可能提供了接口或者DLL动态链接库,使得开发者能够轻松地将H.264解码功能集成到自己的应用程序中。解码库的功能简单易懂,意味着它可能具有清晰的API文档和简单的示例代码,使得开发者能够快速理解...

    海思H264解码库

    海思H264解码库是针对视频处理领域的一款高效解决方案,专为海思全系列芯片设计。H264,全称High Efficiency Video Coding(高效视频编码),是一种广泛应用于高清视频编码的标准,因其高效率和良好的图像质量而备受...

    H264解码库的资料,适合在VC++

    这款解码库针对H.264标准进行了优化,提供了简洁而灵活的API接口,使得开发者能够快速集成到自己的应用程序中,实现高效视频解码功能。 #### 二、开发环境与兼容性 H.264解码库支持Windows环境下的动态库(DLL)和...

    VC实现H264解码器并图像处理

    6. **编程接口(API)调用**:在VC++中,需要使用ffmpeg提供的API来实现H264的解码和图像处理。这涉及到初始化解码上下文、分配解码缓冲区、读取和解码帧、处理解码后的像素数据等步骤。 7. **内存管理**:在解码...

    android H264解码代码

    解码H264编码的视频是播放器的核心功能之一。本篇文章将详细探讨Android环境下H264解码的源码实现。 首先,H264是一种高级视频编码标准,它采用了多种技术如运动补偿、熵编码和多参考帧来优化视频数据的存储和传输...

    Python-实践介绍视频技术图像视频编解码器av1h264h265和ffmpeg编码

    Python虽然不是编解码器的直接实现者,但它可以通过FFmpeg库接口来调用这些编解码器。FFmpeg是一个跨平台的音频和视频处理工具,它集成了多种编解码器,可以进行格式转换、音视频提取、剪辑、转码等操作。通过Python...

    vs2010 ffmpeg实时解码h264码流

    在本文中,我们将深入探讨如何在Visual Studio 2010环境下使用C++实时解码H264视频码流。H264是一种高效、先进的视频编码标准,广泛应用于高清视频传输、在线流媒体服务等领域。FFmpeg是一个强大的开源多媒体处理...

    Android H264解码

    1. **MediaCodec的使用**:首先,通过`MediaFormat`对象设置解码器的配置,如视频格式(H264),然后调用`MediaCodec.createDecoderByType()`创建解码器。接着,使用`MediaCodec.configure()`设置解码器的输入和输出...

    h264 解码库08-09-10checkout

    3. 调用解码函数:根据头文件中的声明,调用解码函数,如`decodeFrame()`,传入H264码流数据,获取解码后的像素数据。 四、FFmpeg与H264解码 FFmpeg是一个开源的多媒体处理框架,它包含了H264的解码器。虽然本解码...

    封装的使用FFMPEG的DXVA2解码显示H264和H265码流的库

    例如,当识别到H264码流时,库会调用相应的DXVA2解码器;如果是H265码流,那么会使用HEVC的硬件加速解码器。 在实现中,FFmpeg会通过以下步骤进行DXVA2解码: 1. 初始化:首先,库会检测系统是否支持DXVA2,并创建...

    Android-h264解码

    在`H264Demo`这个示例中,开发者可能已经实现了上述步骤,将`720pq.h264`文件中的`H264`流解码并显示出来。这个过程涉及文件读取、NAL单元解析、`MediaCodec`接口的使用以及可能的Surface渲染。为了调试和学习,可以...

Global site tag (gtag.js) - Google Analytics