前段时间需要用到在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);
}
}
分享到:
相关推荐
1.移植ffmpeg到android...2.通过JNI接口调用ffmpeg实现h264的解码以及渲染 3.h264渲染采用opengles技术 代码保护局ffmpeg源码 JNI部分 以及opengles渲染部分,还有上层demo APP程序,该程序可以直接安装,播放h264文件
Android使用FFmeg进行音视频解码,实时回调H264流到java接口中。已经实现JNA的调用代码,可以直接调用。使用时可以直接通过一个方法就可以实时的获取到从rtsp或rtmp视频流中解析出的H264视频流数据。简单、方便。
该工程是从ffmpeg中提取出来,并修改成dll的方式进行调用。该工程经过VS2008编译。进行release编译后体积只有380K,体积很小。解码效率也不错. 其中main.c被改成dll的入口文件,并且main.c中包含被注释掉的函数接口...
基于rtmpdump的rtmp包转解码打包ts(h264+aac),通过rtmpdump收流,调用系统接口,转码音视频数据包成h264视频和aac的音频。供封转ts使用
**H.264视频编解码在Android项目中的应用** 随着移动设备的普及和多媒体技术的发展,视频编解码技术在Android项目中的地位日益重要。H.264作为一种高效、通用的视频编码标准,被广泛应用于各种场景,如在线视频播放...
jni解码库接口封装完整项目,包括ffmpeg2.5.2的头文件和动态库文件,解码.c文件源码,以及编译出来的so文件。按照规则可以直接使用。
本资源深度裁剪于ffmpeg2.0解码器中的H264视频解码部分,编译成Android可调用的SO文件。附带有Android make文件以及JNI接口C源码文件等,特别适合于android下的视频开发(只适合H264视频格式的解码),可以通过简单...
2、编译x264,3、然后在build_ffmpeg.sh中指定x264编译出来的lib和include目录,4、执行build_ffmpeg.sh编译ffmpeg生成相应的静态库文件,最后再结合你想要的静态库和你写的调用ffmpeg的接口生成相应的so文件,供...
本例程通过调用RK3399的MPP库,实现从USB摄像头采集视频数据,并编码输出为h264帧的视频文件。
H264 H263 编解码程序,调用FFMPEG接口,并通过SOCKET/TCP协议直接把音视频数据从一端传输到另一端
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软件例程源码,可做为你的学习设计参考。 int main(void) { uint32_t lcdid; char cStr[100]; double deg_lat;//转换成[degree].[degree]格式的纬度 double deg_...
本文档详细描述了开发包中各个函数实现的功能、接口及其函数之间的调用关系和示例实现. 本开发套件主要包括业务操作和设备管理两大部分: 业务操作 状态侦听、实时监视、实时预览、字符叠加、音频控制、录像回放...
1. 概述 2. 硬件购买 3. 接口概要 4. 接口调用样例 5. 回调 6. 结构体 7. 解码接口
1 简介借助于WebAssembly(简称Wasm)技术,实现在浏览器端调用ffmpeg接口完成H.265码流到YUV数据的解码。总体流程如下:2 依赖2.1按照官网的定义,WebAssembly (wasm) 是一个可移植、体积小、加载快并且兼容 Web 的...
解码SDK是硬盘录像机的配套产品,支持h264码流。本文档详细描述了开发包中各函数实现的功能及接口 播放SDK的主要功能有:支持文件或流数据的播放、回放控制(如暂停\恢复、快放慢放)、音频控制、流数据录像、多区域...
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 基于压缩板卡的...
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 基于压缩板卡的...
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 基于压缩板卡的...
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 基于压缩板卡的...