pcm音频裸流的压缩和解码

跟视频一样,对于音频的传输,往往也需要经过压缩,下面是关于海思提供的PCM音频裸流文件压缩和解码库的运用,对比一个文件与其压缩、解码操作后的数据,可以明显的发现PCM->ADPCM的音频压缩过程是有损的。关于文件的对比,本人使用的是BCompare 这个软件,绝对是程序员必备的神器啊!如果没有的童鞋建议大家下来玩玩。下载地址:点击打开链接

由于是用海思提供的压缩和解码库,所以其实并不需要做什么复杂的事,只是简单的写几句调用代码就完事了。配置反倒是比较麻烦的事,所以在下面贴出代码后直接给出本人配置好的工程链接。

压缩,从PCM到ADPCM

#include "stdafx.h"
#include "hi_voice_api.h"

HI_S32 VoiceEngineState[0x100];

#define VOICE_FRAME_SIZE   160 

int _tmain(int argc, _TCHAR* argv[])//压缩,从pcm到adpcm,这种压缩是有损的
{
	HI_S32 frame;
	HI_S16 coder, len, frame_size;
	HI_S16 in_enc_pcmbuf[HI_VOICE_MAX_FRAME_SIZE];     //encoder input
	HI_S16 ou_enc_unpacked[HI_VOICE_MAX_FRAME_SIZE];   //encoder output
	coder = 35;

	FILE *fp_in = NULL, *fp_out = NULL;
	fopen_s(&fp_in, "paomo.pcm", "rb");
	fopen_s(&fp_out,"enpaomo.adpcm", "wb");

	frame_size = 2 * VOICE_FRAME_SIZE;
	if (coder == ADPCM_IMA)
		frame_size += 1;

	frame = 0;
	HI_VOICE_EncReset((HI_VOID*)VoiceEngineState, coder);//压缩编码器复位
	while (fread(in_enc_pcmbuf, sizeof(HI_S16), frame_size, fp_in) == (HI_U32)frame_size)
	{
		HI_VOICE_EncodeFrame((HI_VOID*)VoiceEngineState, in_enc_pcmbuf, ou_enc_unpacked, frame_size);//压缩编码
		fwrite(ou_enc_unpacked, sizeof(HI_S16), 2 + ou_enc_unpacked[1], fp_out);//压缩后数据写入文件
		frame++;
		printf("encoding %d frame\r",frame);
	}
	fclose(fp_in);
	fclose(fp_out);

	return 0;
}

解码,从ADPCM到PCM

#include "stdafx.h"
#include "hi_voice_api.h"

HI_S32 VoiceEngineState[0x100];

int _tmain(int argc, _TCHAR* argv[])//解码,从adpcm到pcm
{
	HI_S16 ou_dec_pcmbuf[HI_VOICE_MAX_FRAME_SIZE];     //decoder output
	HI_S16 in_enc_pcmbuf[HI_VOICE_MAX_FRAME_SIZE];     //encoder input
	HI_S16 ou_enc_unpacked[HI_VOICE_MAX_FRAME_SIZE];   //encoder output
	HI_S16 coder, len;
	HI_S32 frame;

	FILE *fp_in = NULL, *fp_out = NULL;
	fopen_s(&fp_in, "enpaomo.adpcm", "rb");
	fopen_s(&fp_out,"depaomo.pcm", "wb");

	coder = 35;
	frame = 0;

	HI_VOICE_DecReset((HI_VOID*)VoiceEngineState, coder);//解码器复位
	while (fread(&ou_enc_unpacked[0], sizeof(HI_S16), 2, fp_in) == 2)
	{
		len = (ou_enc_unpacked[1] & 0x00ff);
		if (fread(&ou_enc_unpacked[2], sizeof(HI_S16), len, fp_in) != (HI_U32)(len))
		{
			printf("\nfile end!\n");
			break;
		}
		HI_VOICE_DecodeFrame((HI_VOID*)VoiceEngineState, ou_enc_unpacked, ou_dec_pcmbuf, &len);//解码
		fwrite(ou_dec_pcmbuf, sizeof(HI_S16), len, fp_out);//解码后写入文件
		frame++;
		printf("decoding %d frame\r",frame);
	}
	fclose(fp_in);
	fclose(fp_out);
	return 0;
}

工程下载地址:点击打开链接

pcm音频裸流的压缩和解码

时间: 2024-10-06 15:18:05

pcm音频裸流的压缩和解码的相关文章

全志Tina_dolphin播放音视频裸流(h264,pcm)验证

最近在验证tina对裸流音视频的支持,主要指h264视频裸流及pcm音频裸流. 在原始sdk中有针对很多video和audio类型的parser,但就是没有找到pcm和h264的parser,所以需要自己搞个parser,同时找到audio播放的的接口写个demo来验证. 所有支持解析类型的parser方法都在目录:/Homlet-Tina-H2_H3/package/allwinner/tina_multimedia/libcedarx/libcore/parser下 aac Android.

C++ 采集音频流(PCM裸流)实现录音功能

与上一篇的"C++ 播放音频流(PCM裸流)" 点击打开链接 相对应,本篇是关于用C++实现录音功能的.同样是直接建一个win32控制台程序然后将代码拷过去改个文件名就可以用,也可以下载本人上传的相关工程,这个工程是用VS2013写的,如果是较低的版本就呵呵了.点击打开链接 代码部分如下: #include "stdafx.h" #include <stdio.h> #include <Windows.h> #pragma comment(l

libvlc —— 播放器示例程序[C++代码实现攫取 RGB图像 和 PCM音频 数据功能]

在我以前的实际项目中,曾利用 libvlc 去解码音视频媒体数据(如 RTSP.本地文件 等),通过其提供的回调函数接口,攫取 RGB图像 进行图像分析,如 人脸识别.运动检测 等一类的产品应用.除此之外,只要提供适当的 MRL,配合选项参数,VLC 还可以进行屏幕录制.摄像头图像采集.麦克风音频采集 等功能. 我在网上参看过很多人提供的示例源码,实现流程都很初潜,只适合当作学习的 Demo 来看,与实际的项目应用还有很多问题要解决.为此,在这里公开我封装 libvlc 的 C++ 类,方便TA

视音频数据处理入门:AAC音频码流解析

本文继续上一篇文章的内容,介绍一个音频码流处理程序.音频码流在视频播放器中的位置如下所示. 本文中的程序是一个AAC码流解析程序.该程序可以从AAC码流中分析得到它的基本单元ADTS frame,并且可以简单解析ADTS frame首部的字段.通过修改该程序可以实现不同的AAC码流处理功能. 原理 AAC原始码流(又称为"裸流")是由一个一个的ADTS frame组成的.他们的结构如下图所示. 其中每个ADTS frame之间通过syncword(同步字)进行分隔.同步字为0xFFF(

视音频数据处理入门:PCM音频采样数据处理

上一篇文章记录了RGB/YUV视频像素数据的处理方法,本文继续上一篇文章的内容,记录PCM音频采样数据的处理方法.音频采样数据在视频播放器的解码流程中的位置如下图所示. 本文分别介绍如下几个PCM音频采样数据处理函数:  分离PCM16LE双声道音频采样数据的左声道和右声道  将PCM16LE双声道音频采样数据中左声道的音量降一半  将PCM16LE双声道音频采样数据的声音速度提高一倍  将PCM16LE双声道音频采样数据转换为PCM8音频采样数据  从PCM16LE单声道音频采样数据中截取一部

H264裸流分析中,能获取哪些信息?

从H264的裸流中,PPS,SPS中,一定可以获取到的,有图像的宽,高信息. 这部分信息的提取,用Stream eye 分析: 这里需要特别提一下这两个参数:  pic_width_in_mbs_minus1 = 119(1920)  pic_height_in_map_units_minus1 = 67(1088)分别表示图像的宽和高,以宏块(16x16)为单位的值减1因此,实际的宽为 (119+1)*16 = 352,高:(67+1)*16=1088 开始的时候,我还以为是哪里不对,1080

音频 PCM音频编码格式详解

[概念] PCM(Pulse Code Modulation)音频编码格式也被称为脉冲编码调制.就是将声音等模拟信号变成符号化的脉冲列,再进行记录存储. [原理] 把一个时间连续,取值连续的模拟信号变换成时间离散,取值离散的数字信号后在信道中传输.脉冲编码调制就是对模拟信号先抽样,再对样值幅度量化,编码的过程. 抽样,就是对模拟信号进行周期性扫描,把时间上连续的信号变成时间上离散的信号.该模拟信号经过抽样后还应当包含原信号中所有信息,也就是说能无失真的恢复原模拟信号.它的抽样速率的下限是由抽样定

使用AudioTrack播放PCM音频数据(android)

众所周知,Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer实现的.MediaPlayer在底层是基于OpenCore(PacketVideo)的库实现的,为了构建一个MediaPlayer程序,上层还包含了进程间通讯等内容,这种进程间通讯的基础是Android基本库中的Binder机制.但是该类只能对完整的音频文件进行操作,而不能直接对纯PCM音频数据操作.假如我们通过解码得到

【音视频连载-007】基础学习篇-SDL 播放 PCM 音频文件(上)

音视频学习入门技术文章连载: 技术开发故事会连载 [音视频连载-001]基础学习篇-SDL 介绍以及工程配置 [音视频连载-002]基础学习篇-SDL 创建窗口并显示颜色 [音视频连载-003]基础学习篇-SDL 消息循环和事件响应 [音视频连载-004]基础学习篇-SDL 加载图片并显示 [音视频连载-005]基础学习篇-SDL 加载 YUV 文件并显示 [音视频连载-006]基础学习篇-SDL 播放 YUV 视频文件]) 在前面的文章中已经能够利用 SDL 去播放 YUV 视频文件了,接下来