现在的位置: 首页 > 综合 > 正文

在Android程序中获取avc中的数据

2013年10月12日 ⁄ 综合 ⁄ 共 1621字 ⁄ 字号 评论关闭

在Android程序中获取avc中的数据,也就是AVCDecoderConfigurationRecord 。

你可以先录制一小段视频保存在sd卡中。

然后根据以下代码来获取数据。这样就可以根据不同的手机或者不同的分辨率来调整sps pps或者avc了

package com.ppmeet.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * class name:MyDetect<BR>
 * class description:动态获取avc中的数据<BR>
 * PS: <BR>
 * 
 * @version 1.00 2011/10/21
 * @author CODYY)peijiangping
 */
public class MyDetect {
	final static int MAX_HEADER_LENGTH = 128;
	public static int mdataPosition = 32;
	private static byte[] checkBuffer = new byte[1024 * 4];
	public static byte[] avcdata = null;

	public static boolean checkMP4_MOOV(String fileName) throws IOException {
		File fin = new File(fileName);
		if (fin.isFile()) {
			InputStream is = new FileInputStream(fin.getAbsolutePath());
			int pos;
			int fms = 0;
			boolean isOK;
			int n;
			while (true) {
				isOK = false;
				n = is.read(checkBuffer);
				if (n < 0) {
					break;
				}
				for (pos = 0; pos < n; pos++) {
					byte tmp = checkBuffer[pos];
					switch (tmp) {
					case (byte) 'a':
						if (fms == 0)
							fms = 1;
						else
							fms = 0;
						break;

					case (byte) 'v':
						if (fms == 1)
							fms = 2;
						else
							fms = 0;
						break;
					case (byte) 'c':
						if (fms == 2)
							fms = 3;
						else
							fms = 0;
						break;
					case (byte) 'C':
						if (fms == 3)
							fms = 4;
						else
							fms = 0;
						break;
					case (byte) 0x01:
						if (fms == 4)
							fms = 5;
						else
							fms = 0;
						break;
					default:
						fms = 0;
						break;
					}
					if (fms == 5) {
						isOK = true;
						break;
					}
				}
				if (isOK) {
					for (int i = 0; i < checkBuffer.length - pos; i++) {
						checkBuffer[i] = checkBuffer[i + pos];
					}
					if (pos > checkBuffer.length - MAX_HEADER_LENGTH) {
						is.read(checkBuffer, checkBuffer.length - pos,
								MAX_HEADER_LENGTH);
					}
					getAVCData(checkBuffer);
					return true;
				}
			}
		}
		return false;
	}

	private static byte[] getAVCData(byte[] avc) {
		int avcsize = 0;
		for (int index = 0; index < avc.length; index++) {
			for (int i = 0; i < avc.length; i++) {
				if (i > 31 && avc[i] == 0) {
					avcsize = i;
					break;
				}
			}
			avcdata = new byte[avcsize];
			System.arraycopy(avc, 0, avcdata, 0, avcsize);
		}
		return avcdata;
	}
}

抱歉!评论已关闭.