從h264檔案中讀取檔案並封裝成RTP

2021-10-06 16:32:21 字數 3926 閱讀 1905

首先是整體的**:

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;

state = 0;

first = 0;    

start = offset;                    //當前位置變成新的起始位置

cross = 0;                        //跨buffer標誌位重置成0

先判斷第二次檔案讀寫的前3個位元組是否是00 00 01,如果不是,則狀態機重置為開始狀態0,並且偏移量offset後移一位

state = 0;

offset ++;

如果前三個位元組正好是00 00 01,那麼nalu正好是前半段去掉最後乙個00後的內容,將其取出傳送出去

if (buffer[offset] == 0x00 &&

buffer[offset + 1] == 0x00 &&

buffer[offset + 2] == 0x01)

相應狀態發生改變

offset += 3;

state = 0;

start = offset;                    //當前位置變成新的起始位置

先判斷第二次檔案讀寫的前兩個位元組是否是00 01,如果不是,則狀態機重置為開始狀態0,並且偏移量offset後移一位

state = 0;

offset ++;

如果前兩個位元組正好是00 01,那麼nalu正好是前半段去掉最後兩個位元組00 00後的內容,將其取出傳送出去

if (buffer[offset] == 0x00 &&

buffer[offset + 1] == 0x01)

相應狀態發生改變

offset += 2;

state = 0;

start = offset;                    //當前位置變成新的起始位置

先判斷第二次檔案讀寫的第乙個位元組是否是01,如果不是,則狀態機重置為開始狀態0,並且偏移量offset後移一位

state = 0;

offset ++;

如果第乙個位元組正好是01,那麼nalu正好是前半段去掉最後三個位元組00 00 00後的內容,將其取出傳送出去

if (buffer[offset] == 0x01)

相應狀態發生改變

offset += 1;

state = 0;

start = offset;                    //當前位置變成新的起始位置

這裡先從倒數第三個位元組判斷,如果是00 00 00,那麼狀態機值為3;

如果不符合,則從倒數第二個位元組判斷,如果是00 00,那麼狀態機值為2;

如果不符合,則從倒數第乙個位元組判斷,如果是00,那麼狀態機值為1;

if (buffer[offset] == 0x00 && 

buffer[offset + 1] == 0x00    &&

buffer[offset + 2] == 0x00) else if (buffer[offset + 1] == 0x00 &&

buffer[offset + 2] == 0x00) else if (buffer[offset + 2] == 0x00)

然後此次檔案讀取結束了,因為當前還不能確定此次nalu是否完整,因此需要將目前讀取到的內容暫時儲存到nalu的前半段中。

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...