`
absolute
  • 浏览: 188240 次
  • 性别: 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);
	}
}
 
分享到:
评论

相关推荐

    Android 移植ffmpeg解码h264文件并播放渲染

    1.移植ffmpeg到android...2.通过JNI接口调用ffmpeg实现h264的解码以及渲染 3.h264渲染采用opengles技术 代码保护局ffmpeg源码 JNI部分 以及opengles渲染部分,还有上层demo APP程序,该程序可以直接安装,播放h264文件

    Android使用FFmeg进行音视频解码,实时回调H264流到java接口中 已经实现JNA的调用代码,可以直接调用

    Android使用FFmeg进行音视频解码,实时回调H264流到java接口中。已经实现JNA的调用代码,可以直接调用。使用时可以直接通过一个方法就可以实时的获取到从rtsp或rtmp视频流中解析出的H264视频流数据。简单、方便。

    ffmpeg h264 解码动态库

    该工程是从ffmpeg中提取出来,并修改成dll的方式进行调用。该工程经过VS2008编译。进行release编译后体积只有380K,体积很小。解码效率也不错. 其中main.c被改成dll的入口文件,并且main.c中包含被注释掉的函数接口...

    基于rtmpdump的rtmp包转解码打包ts(h264+aac)

    基于rtmpdump的rtmp包转解码打包ts(h264+aac),通过rtmpdump收流,调用系统接口,转码音视频数据包成h264视频和aac的音频。供封转ts使用

    Android项目H.264视频编解码.rar

    **H.264视频编解码在Android项目中的应用** 随着移动设备的普及和多媒体技术的发展,视频编解码技术在Android项目中的地位日益重要。H.264作为一种高效、通用的视频编码标准,被广泛应用于各种场景,如在线视频播放...

    JNI解码接口完整工程

    jni解码库接口封装完整项目,包括ffmpeg2.5.2的头文件和动态库文件,解码.c文件源码,以及编译出来的so文件。按照规则可以直接使用。

    Android移植ffmpeg2.0解码器

    本资源深度裁剪于ffmpeg2.0解码器中的H264视频解码部分,编译成Android可调用的SO文件。附带有Android make文件以及JNI接口C源码文件等,特别适合于android下的视频开发(只适合H264视频格式的解码),可以通过简单...

    ffmpeg-2.2.16+x264.tar.gz

    2、编译x264,3、然后在build_ffmpeg.sh中指定x264编译出来的lib和include目录,4、执行build_ffmpeg.sh编译ffmpeg生成相应的静态库文件,最后再结合你想要的静态库和你写的调用ffmpeg的接口生成相应的so文件,供...

    基于RK3399的MPP库实现的视频编码例程

    本例程通过调用RK3399的MPP库,实现从USB摄像头采集视频数据,并编码输出为h264帧的视频文件。

    音视频编解码程序socket传输

    H264 H263 编解码程序,调用FFMPEG接口,并通过SOCKET/TCP协议直接把音视频数据从一端传输到另一端

    Visual C++音频视频处理技术及工程实践(分卷0)

    15.4.2 ffmpeg-h264-vc工程实现H.264视频解码 612 15.5 本章小结 613 第16章 打造自己的DVR监控系统 615 16.1 DVR监控系统分析与设计 616 16.1.1 监控系统分类 616 16.1.2 监控系统组成 617 16.1.3 基于压缩板卡的...

    STM32单片机读写 ATGM336H(GPS)模块+液晶显示DEMO软件例程源码.zip

    STM32单片机读写 ATGM336H(GPS)模块+液晶显示DEMO软件例程源码,可做为你的学习设计参考。 int main(void) { uint32_t lcdid; char cStr[100]; double deg_lat;//转换成[degree].[degree]格式的纬度 double deg_...

    大华DVR网络SDK

    本文档详细描述了开发包中各个函数实现的功能、接口及其函数之间的调用关系和示例实现. 本开发套件主要包括业务操作和设备管理两大部分: 业务操作 状态侦听、实时监视、实时预览、字符叠加、音频控制、录像回放...

    linux开发文档 V21

    1. 概述 2. 硬件购买 3. 接口概要 4. 接口调用样例 5. 回调 6. 结构体 7. 解码接口

    decoder_wasm:借助于WebAssembly技术,基于ffmpeg的H.265解码器

    1 简介借助于WebAssembly(简称Wasm)技术,实现在浏览器端调用ffmpeg接口完成H.265码流到YUV数据的解码。总体流程如下:2 依赖2.1按照官网的定义,WebAssembly (wasm) 是一个可移植、体积小、加载快并且兼容 Web 的...

    乔安SDK开发包-WLSDK.rar

    解码SDK是硬盘录像机的配套产品,支持h264码流。本文档详细描述了开发包中各函数实现的功能及接口 播放SDK的主要功能有:支持文件或流数据的播放、回放控制(如暂停\恢复、快放慢放)、音频控制、流数据录像、多区域...

    Visual C++音频/视频处理技术及工程实践 (分卷1)

    15.4.2 ffmpeg-h264-vc工程实现H.264视频解码 612 15.5 本章小结 613 第16章 打造自己的DVR监控系统 615 16.1 DVR监控系统分析与设计 616 16.1.1 监控系统分类 616 16.1.2 监控系统组成 617 16.1.3 基于压缩板卡的...

    Visual C++ 音频/视频 处理技术及工程实践(分卷3)

    15.4.2 ffmpeg-h264-vc工程实现H.264视频解码 612 15.5 本章小结 613 第16章 打造自己的DVR监控系统 615 16.1 DVR监控系统分析与设计 616 16.1.1 监控系统分类 616 16.1.2 监控系统组成 617 16.1.3 基于压缩板卡的...

    Visual C++音频视频处理技术及工程实践(分卷9)

    15.4.2 ffmpeg-h264-vc工程实现H.264视频解码 612 15.5 本章小结 613 第16章 打造自己的DVR监控系统 615 16.1 DVR监控系统分析与设计 616 16.1.1 监控系统分类 616 16.1.2 监控系统组成 617 16.1.3 基于压缩板卡的...

    Visual C++音频/视频处理技术及工程实践(分卷2)

    15.4.2 ffmpeg-h264-vc工程实现H.264视频解码 612 15.5 本章小结 613 第16章 打造自己的DVR监控系统 615 16.1 DVR监控系统分析与设计 616 16.1.1 监控系统分类 616 16.1.2 监控系统组成 617 16.1.3 基于压缩板卡的...

Global site tag (gtag.js) - Google Analytics