Android MedieCodec硬解码mp3,wma

1MedieCodec支持4.1以上系统使用,是谷歌SDK的一个类。

2能够对mp3,wma格式音频文件解码

3解码前,需要MediaExactor提取文件信息,包括文件类型,采样率,

package com.dawin.mediacodec;

import java.io.IOException;
import java.nio.ByteBuffer;

import android.media.MediaCodec;
import android.media.MediaExtractor;
import android.media.MediaFormat;
import android.media.MediaCodec.BufferInfo;

public class MediaCodecTest
{
	byte[] decodeData = new byte[1024 * 1024 * 20];// 20m
	MediaCodec mMediaCodec;
	MediaExtractor mediaExtractor;
	MediaFormat mMediaFormat;
	final int TIMEOUT_US = 1000;
	BufferInfo info;
	boolean sawOutputEOS = false;
	boolean sawInputEOS = false;
	ByteBuffer[] codecInputBuffers;
	ByteBuffer[] codecOutputBuffers;

	/**
	 * 解码音频文件,返回最后解码的数据
	 *
	 * @param url
	 * @return
	 */
	public byte[] decode(String url)
	{
		url = "";
		try
		{
			mediaExtractor.setDataSource(url);
		} catch (IOException e)
		{
		}
		mMediaFormat = mediaExtractor.getTrackFormat(0);
		String mime = mMediaFormat.getString(MediaFormat.KEY_MIME);
		try
		{
			mMediaCodec = MediaCodec.createDecoderByType(mime);
		} catch (IOException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		mMediaCodec.configure(mMediaFormat, null, null, 0);
		mMediaCodec.start();

		codecInputBuffers = mMediaCodec.getInputBuffers();
		codecOutputBuffers = mMediaCodec.getOutputBuffers();

		info = new BufferInfo();
		mediaExtractor.selectTrack(0);
		input();
		output();
		return decodeData;
	}

	private void output()
	{
		final int res = mMediaCodec.dequeueOutputBuffer(info, TIMEOUT_US);
		if (res >= 0)
		{
			int outputBufIndex = res;
			ByteBuffer buf = codecOutputBuffers[outputBufIndex];

			final byte[] chunk = new byte[info.size];
			buf.get(chunk); // Read the buffer all at once
			buf.clear(); // ** MUST DO!!! OTHERWISE THE NEXT TIME YOU GET THIS
							// SAME BUFFER BAD THINGS WILL HAPPEN

			if (chunk.length > 0)
			{
				System.arraycopy(chunk, 0, decodeData, 0, chunk.length);
				// mAudioTrack.write(chunk, 0, chunk.length);
			}
			mMediaCodec.releaseOutputBuffer(outputBufIndex, false /* render */);

			if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0)
			{
				sawOutputEOS = true;
			}
		} else if (res == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED)
		{
			codecOutputBuffers = mMediaCodec.getOutputBuffers();
		} else if (res == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED)
		{
			final MediaFormat oformat = mMediaCodec.getOutputFormat();
			// Log.d(LOG_TAG, "Output format has changed to " + oformat);
			// mAudioTrack.setPlaybackRate(oformat.getInteger(MediaFormat.KEY_SAMPLE_RATE));
		}

	}

	private void input()
	{

		int inputBufIndex = mMediaCodec.dequeueInputBuffer(TIMEOUT_US);

		if (inputBufIndex >= 0)
		{
			ByteBuffer dstBuf = codecInputBuffers[inputBufIndex];

			int sampleSize = mediaExtractor.readSampleData(dstBuf, 0);
			// Log.i(LOG_TAG, "sampleSize : "+sampleSize);
			long presentationTimeUs = 0;
			if (sampleSize < 0)
			{
				// .Log.i(LOG_TAG, "Saw input end of stream!");
				sawInputEOS = true;
				sampleSize = 0;
			} else
			{
				presentationTimeUs = mediaExtractor.getSampleTime();
				// Log.i(LOG_TAG, "presentationTimeUs "+presentationTimeUs);
			}

			mMediaCodec.queueInputBuffer(inputBufIndex,
					0, // offset
					sampleSize, presentationTimeUs,
					sawInputEOS ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
			if (!sawInputEOS)
			{
				// Log.i(LOG_TAG, "extractor.advance()");
				mediaExtractor.advance();

			}
		}

	}
}
时间: 2024-12-18 11:36:50

Android MedieCodec硬解码mp3,wma的相关文章

Android中软解码和硬解码的优先级

我们先来看一下Android系统中解码器的命名,软解码器通常是以OMX.google开头的.硬解码器通常是以OMX.[hardware_vendor]开头的,比如TI的解码器是以OMX.TI开头的.当然还有一些不遵守这个命名规范的,不以OMX.开头的,那也会被认为是软解码器. 判断规则见frameworks/av/media/libstagefright/OMXCodec.cpp: static bool IsSoftwareCodec(const char *componentName) {

vlc源码分析(六) 调用OpenMAX硬解码H.265

http://www.cnblogs.com/jiayayao/p/6964506.html H.265(HEVC)编码格式能够在得到相同编码质量视频的前提下,使用相当于H.264(AVC)一半的存储容量,虽然H.265的算法复杂度比H.264高一个数量级,但是硬件水平在不断提高,因此H.265使用场合逐渐多了起来.好多硬件厂商芯片内部实现了H.265的硬解码.最近调试了vlc-android调用OpenMAX硬解码H.265的部分,使用的硬件平台是ZX-2000,系统是Android5.1.

H.264硬编码&硬解码

Firefly-RK3288拥有强大的VPU(视像处理器),能够流畅实现720P和1080P视频的H.264编解码: 而H.264的压缩率更高,可以更大程度更小视频的空间占用. 详细看视频演示 1. 演示介绍 基于Firefly开发板:视频监控演示: 需要两块开发板:一块开发板摄像头采集+硬编码,网络传输. 另一块开发板 网络接收.硬解码+显示. Demo中采样5GHz Wi-Fi传输,摄像头使用OV13850,或UVC camera 2. H.264技术介绍 H.264是一种高性能视频编解码技

【GPU编解码】GPU硬解码---DXVA

[GPU编解码]GPU硬解码---DXVA 前面介绍利用NVIDIA公司提供的CUVID库进行视频硬解码,下面将介绍利用DXVA进行硬解码. 一.DXVA介绍 DXVA是微软公司专门定制的视频加速规范,是一种接口规范.DXVA规范制定硬件加速解码可分四级:VLD,控制BitStream:IDCT,反余弦变换:Mocomp,运动补偿,Pixel Prediction:PostProc,显示后处理.其中,VLD加速等级最高,所以其包含IDCT.MoCoopm和PostProc:IDCT加速次之,包含

【GPU编解码】GPU硬解码---DXVA (转)

前面介绍利用NVIDIA公司提供的CUVID库进行视频硬解码,下面将介绍利用DXVA进行硬解码. 一.DXVA介绍 DXVA是微软公司专门定制的视频加速规范,是一种接口规范.DXVA规范制定硬件加速解码可分四级:VLD,控制BitStream:IDCT,反余弦变换:Mocomp,运动补偿,Pixel Prediction:PostProc,显示后处理.其中,VLD加速等级最高,所以其包含IDCT.MoCoopm和PostProc:IDCT加速次之,包含MoCoopm和PostProc:最后MoC

【GPU编解码】GPU硬解码---CUVID

问题描述:项目中,需要对高清监控视频分析处理,经测试,其解码过程所占CPU资源较多,导致整个系统处理效率不高,解码成为系统的瓶颈. 解决思路: 利用GPU解码高清视频,降低解码所占用CPU资源,加速解码过程. 一.OpenCV中的硬解码 OpenCV2.4.6中,已实现利用GPU进行读取视频,由cv::gpu::VideoReader_GPU完成,其示例程序如下. 1 int main(int argc, const char* argv[]) 2 { 3 if (argc != 2) 4 re

Android命令行播放MP3音乐

/*************************************************************************** * Android命令行播放MP3音乐 * 说明: * 有时候我们会遇到Touch不能使用,也没有鼠标,但是我们要在Android上测试 * 声卡情况,所以我们会想到在adb或者debug终端上使用命令行来播放声音. * * 2016-5-26 深圳 南山平山村 曾剑锋 *************************************

C#获取MP3,WMA信息

用于获取MP3内部信息,包括歌曲名,歌手名等…… namespace FileBatchRemaer.domain { /// <summary> /// Mp3信息结构 /// </summary> public struct Mp3Info { public string identify; //TAG,三个字节 public string Title; //歌曲名,30个字节 public string Artist; //歌手名,30个字节 public string Al

什么是“软解码”,什么又是“硬解码”呢?

我们在计算机上播放的视频文件都是经过压缩的,因为这样有利于节约存储空间:那么在播放过程,就需要进行一个反射的解压缩过程.在以前这项工作都是由CPU来完成的,对于普通分辨率的AVI.RMVB等文件,绝大多数的CPU都可以胜任:但是发展到高清视频(1080i/p)之后,数据解压缩的工作量比以前翻了数倍,这让很多处理器叫苦不迭. 随着技术的发展,工程师们发现显卡的GPU/VPU要比CPU更适合这类大数据量的.低难度的重复工作.视频解码工作从处理器那里分离出来,交给显卡去做,这就叫做“硬解码”,例如NV