首先是整體的**:
string filename = rtspnettyserver.outputpath + keyhash + ".h264";
file f = new file(filename);
if (!f.exists())
sendanswer(ctx, r, o);
bufferedinputstream in = null;
try
int start = 0; //第乙個nalu的起始位置
int offset = 0; //當前迴圈中的偏移量
while (offset <= len-4)
}offset += 4;
state = 0;
first = 0;
start = offset; //當前位置變成新的起始位置
cross = 0; //跨buffer標誌位重置成0
} else
}offset += 4;
state = 0;
first = 0;
start = offset; //當前位置變成新的起始位置
}} else
} else if (state == 1)
offset += 3;
state = 0;
start = offset; //當前位置變成新的起始位置
} else
} else if (state == 2)
offset += 2;
state = 0;
start = offset; //當前位置變成新的起始位置
} else
} else if (state == 3)
offset += 1;
state = 0;
start = offset; //當前位置變成新的起始位置
} else
}}
//指標指向最後3位時
if (offset == len-3) else if (buffer[offset + 1] == 0x00 &&
buffer[offset + 2] == 0x00) else if (buffer[offset + 2] == 0x00)
cross = 1; //一定會跨buffer
firsthalfnalu = new byte[offset + 3 - start]; //初始化前半段nalu陣列,將前半段內容放進去
system.arraycopy(buffer, start, firsthalfnalu, 0, firsthalfnalu.length);
} }
} catch (ioexception e) finally catch (ioexception e)
}
這裡的解析需要區分很多種情況,包括每次讀取的內容是否有隔斷了起始碼、隔斷的是起始碼的第幾個位元組等,需要設定很多個標識位。
首先,每次從檔案中讀取64*1024個位元組:
int buf_size = 64*1024;最後,相應的一些狀態都需要發生改變:byte buffer = new byte[buf_size]; //從檔案讀的位元組存入的地方
while (-1 != (len = in.read(buffer, 0, buf_size)))
offset += 4;先判斷第二次檔案讀寫的前3個位元組是否是00 00 01,如果不是,則狀態機重置為開始狀態0,並且偏移量offset後移一位state = 0;
first = 0;
start = offset; //當前位置變成新的起始位置
cross = 0; //跨buffer標誌位重置成0
state = 0;如果前三個位元組正好是00 00 01,那麼nalu正好是前半段去掉最後乙個00後的內容,將其取出傳送出去offset ++;
if (buffer[offset] == 0x00 &&相應狀態發生改變buffer[offset + 1] == 0x00 &&
buffer[offset + 2] == 0x01)
offset += 3;先判斷第二次檔案讀寫的前兩個位元組是否是00 01,如果不是,則狀態機重置為開始狀態0,並且偏移量offset後移一位state = 0;
start = offset; //當前位置變成新的起始位置
state = 0;如果前兩個位元組正好是00 01,那麼nalu正好是前半段去掉最後兩個位元組00 00後的內容,將其取出傳送出去offset ++;
if (buffer[offset] == 0x00 &&相應狀態發生改變buffer[offset + 1] == 0x01)
offset += 2;先判斷第二次檔案讀寫的第乙個位元組是否是01,如果不是,則狀態機重置為開始狀態0,並且偏移量offset後移一位state = 0;
start = offset; //當前位置變成新的起始位置
state = 0;如果第乙個位元組正好是01,那麼nalu正好是前半段去掉最後三個位元組00 00 00後的內容,將其取出傳送出去offset ++;
if (buffer[offset] == 0x01)相應狀態發生改變
offset += 1;state = 0;
start = offset; //當前位置變成新的起始位置
這裡先從倒數第三個位元組判斷,如果是00 00 00,那麼狀態機值為3;
如果不符合,則從倒數第二個位元組判斷,如果是00 00,那麼狀態機值為2;
如果不符合,則從倒數第乙個位元組判斷,如果是00,那麼狀態機值為1;
if (buffer[offset] == 0x00 &&然後此次檔案讀取結束了,因為當前還不能確定此次nalu是否完整,因此需要將目前讀取到的內容暫時儲存到nalu的前半段中。buffer[offset + 1] == 0x00 &&
buffer[offset + 2] == 0x00) else if (buffer[offset + 1] == 0x00 &&
buffer[offset + 2] == 0x00) else if (buffer[offset + 2] == 0x00)
firsthalfnalu = new byte[offset + 3 - start]; //初始化前半段nalu陣列,將前半段內容放進去system.arraycopy(buffer, start, firsthalfnalu, 0, firsthalfnalu.length);
解碼H264檔案的一些基礎知識
b.p 該幀可以引用前面的幀的資料來解壓縮並且相對於i幀來說,該幀可以壓縮程度更高。c.b 該幀可以引用前面的幀和後面的幀的資料,從而壓縮程度最高。乙個條帶是乙個幀中比較獨特的區域,不同於該幀中的其他區域。在最新的國際標準中,這裡已經存在 i slices i 條帶 p slices p 條帶 和 ...
從AAC檔案中讀取檔案並封裝成RTP
首先上 string filename rtspnettyserver.outputpath keyhash aac file f new file filename if f.exists sendanswer ctx,r,o bufferedinputstream in null in new ...
讀取h5檔案基本操作
import h5py f0 h5py.file users hupeiwen downloads modelnet40 ply hdf5 2048 ply data test0.h5 r 遍歷檔案中的一級組 forgroup in f0.keys print group 獲得其下面的dataset...