在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;
}
}