借鉴:http://blog.csdn.net/zgyulongfei/article/details/7538523 博客详细结束了SPS和PPS的获取

http://blog.csdn.net/zblue78/article/details/6083374 文章【Android 的视频编码 H263 MP4V H264】的代码实现

http://blog.csdn.net/jzl19901027/article/details/9864351 Android MediaRecorder H264 编码实时视频流不能播放(readInt()值太大)的问题


再利用mediarecorder录制视频过程中,首先录制一段钟视频数据后,将数据流传入StsBox对象,调用getMdat()即可得到mdat的合适的开始位置和结束位置

............try {fis = receiver.getInputStream();Thread.currentThread().sleep(500);} catch (IOException e2) {e2.printStackTrace();return;} catch (InterruptedException e) {e.printStackTrace();}releaseVideo();StsdBox stsdBox = new StsdBox(fis);//stsdBox.saveStsBoxHead(context);stsdBox.getMdat();Log.i(TAG, "mdat: " + (stsdBox.getEndMdat() - stsdBox.getStartMdat()));............

代码:


public class StsdBox {private byte[] buffer = new byte[1024 * 64];private int spsStartPos;private int spsLength;private int num, number = 0;private int frame_size = 1024;public StsdBox(InputStream fis) {initByte(fis);}private void initByte(InputStream fis) {while (true) {try {if(number >= buffer.length) {break;}num = fis.read(buffer, number, frame_size);number += num;if (num < frame_size) {break;}} catch (IOException e) {e.printStackTrace();Log.i("number: ", "" + number);break;}}}private int startMdat = 0;private int endMdat = 0;public int getStartMdat() {return startMdat;}public void setStartMdat(int startMdat) {this.startMdat = startMdat;}public int getEndMdat() {return endMdat;}public void setEndMdat(int endMdat) {this.endMdat = endMdat;}public void getMdat() {for(int im=0; im < buffer.length; im++) {if (buffer[im] == 'm' && buffer[im + 1] == 'd'&& buffer[im + 2] == 'a'&& buffer[im + 3] == 't') {if(im > 0 && buffer[im - 1] == '?') {startMdat = im - 4;} else {startMdat = im;}if(im < (buffer.length - 1) && buffer[im + 5] == '?') {if(buffer[im + 9] == '?') {endMdat = im + 12;} else {endMdat = im + 8;}} else {endMdat = im + 4;}break;}}}private int getAvcC() {byte[] avcC = new byte[] { 0x61, 0x76, 0x63, 0x43 };int avcRecord = 0;for (int ix = 0; ix < buffer.length; ++ix) {if (buffer[ix] == avcC[0] && buffer[ix + 1] == avcC[1]&& buffer[ix + 2] == avcC[2]&& buffer[ix + 3] == avcC[3]) {avcRecord = ix + 4;break;}}if (0 == avcRecord) {System.out.println(R.string.no_found_avcc);avcRecord = 0;}return avcRecord;}public byte[] findSPS() {if(getAvcC() == 0) {return null;}spsStartPos = getAvcC() + 6;byte[] spsbt = new byte[] { buffer[spsStartPos],buffer[spsStartPos + 1] };spsLength = CalculateUtil.bytes2Int(spsbt);byte[] h264sps = new byte[spsLength];// ���2���ֽڵ� sequenceParameterSetLengthspsStartPos += 2;System.arraycopy(buffer, spsStartPos, h264sps, 0, spsLength);printResult("SPS", h264sps, spsLength);return h264sps;}public byte[] findPPS() {if(getAvcC() == 0) {return null;}int ppsStartPos = spsStartPos + spsLength + 1;byte[] ppsbt = new byte[] { buffer[ppsStartPos],buffer[ppsStartPos + 1] };int ppsLength = CalculateUtil.bytes2Int(ppsbt);byte[] h264pps = new byte[ppsLength];ppsStartPos += 2;System.arraycopy(buffer, ppsStartPos, h264pps, 0, ppsLength);printResult("PPS", h264pps, ppsLength);return h264pps;}private void printResult(String type, byte[] bt, int len) {System.out.println(type + "����Ϊ��" + len);String cont = type + "������Ϊ��";System.out.print(cont);for (int ix = 0; ix < len; ++ix) {System.out.printf("%02x ", bt[ix]);}System.out.println("\n----------");}}

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. Android(安卓)判断一个url是否有效
  3. [置顶] Androd用WebView播放gif动画
  4. RxJava 2: 用Retrofit2架构Android(安卓)MVVM 生命周期
  5. 技术转载:Android开发之常用代码片段
  6. Android的源代码下载教程-android学习之旅(102)
  7. android internet参数传递
  8. Android(安卓)MemInfo 各项的意义(转)
  9. android 使用SQLite对数据进行增删改查、访问

随机推荐

  1. Android(安卓)读写XML文件(使用pull解析)
  2. Android创建和删除桌面快捷方式
  3. Android作为HTTP服务器--NanoHTTPD源码分
  4. google地图demo
  5. 如何把android设备中的固件dump出来
  6. Android(安卓)播放提示音
  7. 编程回忆之Android回忆(Android应用参数的
  8. Android中Data和String数据类型转换
  9. Android利用Looper在子线程中改变UI
  10. 录音及播放音频文件