1. 程式人生 > >解決h264readInt()值太大 以及 SPS和PPS的獲取

解決h264readInt()值太大 以及 SPS和PPS的獲取

 再利用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���ֽڵ� sequenceParameterSetLength
		spsStartPos += 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----------");
	}
}

相關推薦

解決h264readInt() 以及 SPSPPS獲取

 再利用mediarecorder錄製視訊過程中,首先錄製一段鍾視訊資料後,將資料流傳入StsBox物件,呼叫getMdat()即可得到mdat的合適的開始位置和結束位置 ............ try { fis = receiver.getInput

ZTree id,ZTree沒有生成樹,ZTree的id

生成 如何解決 span image .cn 描述 今天 屬性 bsp ZTree id值太大,ZTree沒有生成樹,ZTree的id值過大 >>>>>>>>>>>>>>>>&

ES之類型以及

以及 span arc nic ont 一個 永遠 cti 方式 ES的數據類型: 原始類型(值存在棧內存中): Number、String Boolean、undefined、null charAt(inde

js 自動轉換bignumber

 大值轉換 function toNonExponential(num) { var m = num.toExponential().match(/\d(?:\.(\d*))?e([+-]\d+)/); return num.toFixed(Mat

資料溢位-int變成負數

       在解析硬體傳過來的訊號時,因為在壓力測試我就想記錄一下一共傳了多少包,下午再去看的時候,看列印日誌竟然打印出了負數,一臉懵逼。我還以為是出什麼想不到的bug了,後面我寫了段測試程式碼如下 int number = 1;

oracle 11g 匯入表時 提示 ***拒絕執行的錯誤

經查詢,這個是由於字符集設定的不是gbk的,導致匯入時遇到中文字元出現的問題, 1.開啟cmd 2.輸入sqlplus 3.登入管理員賬號:使用者名稱/密碼 as sysdba 4.檢視版本號:select userenv('language') from dual;  

例7.9 輸入10個數,要求輸出其中的元素該數是第幾個數。

Ø解題思路: 定義陣列a,用來存放10個數 設計函式max,用來求兩個數中的大者 在主函式中定義變數m,初值為a[0],每次呼叫max函式後的返回值存放在m中 用“打擂臺”演算法,依次將陣列元素a[1]到a[9]與m比較,最後得到的m值就是10個數中的最大者#include

mysql5.6.20配置,解決佔用記憶體問題

vps的記憶體為512M,安裝好nginx,php等啟動起來,mysql死活啟動不起來看了日誌只看到對應pid被結束了,後跟蹤看發現是記憶體不足被killed; 調整my.cnf 引數,重新配置(系統預設配置太高直接佔用400M記憶體,小玩家玩不起呢)即可 perfor

JQuery物件與DOM物件相互轉換以及JSJQyery獲取元素當前的方法

<!DOCTYPE html> <html> <head> <title>JQuery Object and DOM Object</title> <script type="text/javascrip

jsp解決中文查詢關鍵詞亂碼以及表單method獲取方式的使用問題

最近遇到一個問題:輸入查詢關鍵字,第一次能查出資料,第二次就查不出了,請看下圖: 第一次查詢: 第二次查詢: 可能有些大佬已經看出區別了:第一次查詢的路徑為:http://mylover:8080/CloudSpace/result_search.jsp?keyWord=

H.264---SPSPPS

轉自:https://zhuanlan.zhihu.com/p/27896239 1 SPS和PPS從何處而來? 2 SPS和PPS中的每個引數起什麼作用? 3 如何解析SDP中包含的H.264的SPS和PPS串? 1 客戶端抓包 在做客戶端視訊解碼時,一般都會使用Wireshark抓

DSS中的RTP打包傳輸h264時獲取h264的spspps資訊

static char base64DecodeTable[256]; static void initBase64DecodeTable() {   int i;   for (i = 0; i < 256; ++i) base64DecodeTable[i] = (char)0x80;      

從MP4頭資訊中提取spspps資料

一、MP4格式基本概念 MP4格式對應標準MPEG-4標準(ISO/IEC14496) 二、MP4封裝格式核心概念 1  MP4封裝格式對應標準為 ISO/IEC 14496-12(資訊科技 視聽物件編碼的第12部分: ISO 基本媒體檔案格式/Informati

H.264中的SPSPPS

H.264碼流第一個 NALU是 SPS(序列引數集Sequence Parameter Set) 對應H264標準文件 7.3.2.1 序列引數集的語法進行解析 H.264碼流第二個 NALU是 PPS(影象引數集Picture Parameter Se

解析MP4檔案中的spspps

一、MP4格式基本概念 MP4格式對應標準MPEG-4標準(ISO/IEC14496) 二、MP4封裝格式核心概念 1  MP4封裝格式對應標準為 ISO/IEC 14496-12(資訊科技 視聽物件編碼的第12部分: ISO 基本媒體檔案格式/Informat

h264手動新增spspps到AVCodecContext->extradata

最近編碼的時候發現生成的視訊不能用Windows Media Player等系統自帶的播放器播放,也沒有縮圖。找了很久,最後才發現在avcodec_open2之前新增一行程式碼就行了:codec_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HE

live555中是如何獲取SPSPPS

關於這個問題,困擾了很長時間,主要是為了獲取這2個東東,設計到的類太多了,首先的理清設計到了哪些類,其次得把這些類的依屬關係給理清,下面就讓咱們一步一步的來分析: SPS和PPS的獲取是在伺服器接受到了Descripute命令後進行的,在看下面的內容之前請大家先看上篇文章:

MP4檔案中h264的 SPSPPS獲取

【流媒體】H264—MP4格式及在MP4檔案中提取H264的SPS、PPS及碼流 SkySeraph Apr 1st 2012  Email:[email protected].com  一、MP4格式基本概念 MP4格式對應標準MPEG-4標準(ISO/IEC14496) 二、MP4封裝格式核

【Cuckoo】add_path()失敗 report.json解決辦法

add_path()失敗 >>>from cuckoo.core.database import Database >>>db=Database() >>

Id class 變量 的賦規範 駝峰小駝峰 代碼的格式註釋的類型

id classde 變量 的賦值規範 大駝峰和小駝峰 代碼的格式和註釋的類型Id classde 變量 的賦值規範 大駝峰和小駝峰 代碼的格式和註釋的類型 其實我認為這是非常重要的,只要是個開發人員都會寫代碼,但是做到這些的卻不容易,現在公司看中的是合作能力、溝通能力、和編碼風格,這也是開發人員