前段时间需要用到在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解码库通常是用C或C++编写的,并提供了API供开发者调用,以便在不同的平台上实现H264视频流的解码。 在C# WinForm应用中使用这个库,我们需要进行以下步骤: 1. **集成库文件**:压缩包中的"lib"文件夹...
关键接口包括`avcodec_find_decoder()`用于查找H264解码器,`avcodec_alloc_context3()`创建解码上下文,`avcodec_open2()`打开解码器并初始化上下文,以及`avcodec_decode_video2()`用于实际的解码操作。...
《海思H.264解码库与IHW264Dec_Api接口解析》 在数字视频处理领域,高效编码技术是至关重要的,而H.264(也称为AVC,Advanced Video Coding)正是其中的一颗璀璨明星。H.264以其卓越的压缩效率,广泛应用于高清视频...
在这个项目中,可能已经包含了解码库的接口,通过调用`avcodec_decode_video2`函数来解码NAL单元,得到YUV或者RGB格式的图像数据。 为了使每帧可单独解码使用,我们需要确保每个NAL单元包含完整的视频帧信息,不...
最后,提到开放了JNI接口,意味着开发者为Java层提供了一套API,使得Java应用程序可以方便地调用C/C++解码器的功能,如初始化解码器、提交H264数据进行解码、获取解码后的帧等。这样的设计使得Java应用程序无需关心...
1. `.h` 文件:这是头文件,包含了接口定义和函数声明,允许开发者在自己的项目中调用解码模块。 2. `.lib` 文件:这是一个静态链接库,包含了编译好的解码器实现。在C/C++项目中,你可以链接这个库来使用解码功能。...
在实际应用中,开发者可以通过接口调用该解码库,传入编码的H264数据流,解码库会自动完成以上流程,并将解码后的YUV 420p数据通过预设的回调函数返回。这使得开发者可以专注于自己的应用程序逻辑,而无需关心底层...
在“WebCodecs硬解码h264 9画面”这个场景中,我们讨论的是使用WebCodecs API来实现对h264编码的视频进行硬件加速解码,并同时显示9个不同的画面。 首先,我们来看WebCodecs API的核心概念。它提供了一系列接口,...
1. 解码器接口:一个API,供Android应用程序调用来解码H264流。 2. NAL单元解析:用于识别和提取视频帧的逻辑。 3. 硬件加速支持:如果可用,库可能利用Android硬件编解码器来提升性能。 4. 错误处理:确保在解码...
H264Decoder这个库可能提供了接口或者DLL动态链接库,使得开发者能够轻松地将H.264解码功能集成到自己的应用程序中。解码库的功能简单易懂,意味着它可能具有清晰的API文档和简单的示例代码,使得开发者能够快速理解...
海思H264解码库是针对视频处理领域的一款高效解决方案,专为海思全系列芯片设计。H264,全称High Efficiency Video Coding(高效视频编码),是一种广泛应用于高清视频编码的标准,因其高效率和良好的图像质量而备受...
这款解码库针对H.264标准进行了优化,提供了简洁而灵活的API接口,使得开发者能够快速集成到自己的应用程序中,实现高效视频解码功能。 #### 二、开发环境与兼容性 H.264解码库支持Windows环境下的动态库(DLL)和...
6. **编程接口(API)调用**:在VC++中,需要使用ffmpeg提供的API来实现H264的解码和图像处理。这涉及到初始化解码上下文、分配解码缓冲区、读取和解码帧、处理解码后的像素数据等步骤。 7. **内存管理**:在解码...
解码H264编码的视频是播放器的核心功能之一。本篇文章将详细探讨Android环境下H264解码的源码实现。 首先,H264是一种高级视频编码标准,它采用了多种技术如运动补偿、熵编码和多参考帧来优化视频数据的存储和传输...
Python虽然不是编解码器的直接实现者,但它可以通过FFmpeg库接口来调用这些编解码器。FFmpeg是一个跨平台的音频和视频处理工具,它集成了多种编解码器,可以进行格式转换、音视频提取、剪辑、转码等操作。通过Python...
在本文中,我们将深入探讨如何在Visual Studio 2010环境下使用C++实时解码H264视频码流。H264是一种高效、先进的视频编码标准,广泛应用于高清视频传输、在线流媒体服务等领域。FFmpeg是一个强大的开源多媒体处理...
1. **MediaCodec的使用**:首先,通过`MediaFormat`对象设置解码器的配置,如视频格式(H264),然后调用`MediaCodec.createDecoderByType()`创建解码器。接着,使用`MediaCodec.configure()`设置解码器的输入和输出...
3. 调用解码函数:根据头文件中的声明,调用解码函数,如`decodeFrame()`,传入H264码流数据,获取解码后的像素数据。 四、FFmpeg与H264解码 FFmpeg是一个开源的多媒体处理框架,它包含了H264的解码器。虽然本解码...
例如,当识别到H264码流时,库会调用相应的DXVA2解码器;如果是H265码流,那么会使用HEVC的硬件加速解码器。 在实现中,FFmpeg会通过以下步骤进行DXVA2解码: 1. 初始化:首先,库会检测系统是否支持DXVA2,并创建...
在`H264Demo`这个示例中,开发者可能已经实现了上述步骤,将`720pq.h264`文件中的`H264`流解码并显示出来。这个过程涉及文件读取、NAL单元解析、`MediaCodec`接口的使用以及可能的Surface渲染。为了调试和学习,可以...