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

2021-10-06 16:40:39 字數 3309 閱讀 5230

首先上**:

string filename = rtspnettyserver.outputpath + keyhash + ".aac";

file f = new file(filename);

if (!f.exists())

sendanswer(ctx, r, o);

bufferedinputstream in = null;

in = new bufferedinputstream(new fileinputstream(f));

int seqnum = 1; //rtp的seqnum

int ssrc = randomutils.nextint(); //rtp的ssrc

int len = 0; //每次從檔案讀的實際位元組數

int aacdatalen = 0; //aac data長度

int sampling = 16000; //取樣率,預設值16000

byte adtsheaderbuffer = new byte[7]; //臨時儲存adts頭

byte aacdatabuffer; //臨時儲存aac data

rtputils = new rtputils();

int isheader = 1; //標誌位,表示當前讀取的是adts頭還是aac data

len = in.read(adtsheaderbuffer, 0, 7); //剛開始讀取adts頭

while (len != -1)

if (isheader == 1) else

}in.close();

//aac data封裝成rtp

public byte aactortppack(byte aacdata, int seqnum, int ssrc)

public byte makeaacrtp(byte pcdata, boolean mark, int seqnum, int timestamp, int ssrc) else 

bytebuffer bb = bytebuffer.allocate(pcdata.length + 12);

bb.put((byte) 0x80); //v、p、x、cc, 1000 0000

bb.put(b); //mark 、payloadtype(96)

bb.putshort((short) seqnum);

bb.putint(timestamp);

bb.putint(ssrc);

bb.put(pcdata);

return bb.array();

}

從aac檔案中讀取檔案並封裝成rtp,會比從h264檔案中讀取檔案並封裝成rtp要簡單很多,因為這裡是讀檔案並往外傳送rtp,這裡不考慮組合封包模式和分片封包模式, 只使用單一 單元模式,寫起來會簡單很多。

adts幀格式如上,在adts header 倒數13位往前數13位儲存著aac data長度,而adts header本身的長度是固定7個位元組,這樣就很容易解析出每乙個adts單元了。

首先要設定乙個標誌位,標識當前解析到的是adts header還是aac data

int isheader = 1;                        //標誌位,表示當前讀取的是adts頭還是aac data

第一次只讀取7個位元組,也就是第乙個adts header

len = in.read(adtsheaderbuffer, 0, 7);                //剛開始讀取adts頭

從中獲取到aac data長度以及取樣率,取樣率是用來往外傳送rtp資料時做的延時,結束後需要將標識位置為aac data狀態

aacdatalen = ((adtsheaderbuffer[3]&0x03)<<11)        //獲取aac data長度

+ (adtsheaderbuffer[4]<<3)

+ ((adtsheaderbuffer[5]&0xe0)>>5) - 7;

byte samp = (byte) (adtsheaderbuffer[2]&0x3c);        //獲取取樣率

sampling = rtputils.getsampling(samp);

isheader = 0; 

接下來就是讀取aac data部分。因為bufferedinputstream的read方法是直接從上次讀取結束的地方接著讀取的,所以不需要偏移量引數,只需要知道 aac data長度即可。

aacdatabuffer = new byte[aacdatalen];                

len = in.read(aacdatabuffer, 0, aacdatalen);        //讀取aac data

接下來需要新增2位元組的au-headers-length, 2位元組的au-header(只有乙個),rtp header。其中au-header的高13位是aac data的長度。

//aac data封裝成rtp

public byte aactortppack(byte aacdata, int seqnum, int ssrc)

rtp的封裝方法跟之前的h264類似,只不過payload type看情況是否修改。

public byte makeaacrtp(byte pcdata, boolean mark, int seqnum, int timestamp, int ssrc) else 

bytebuffer bb = bytebuffer.allocate(pcdata.length + 12);

bb.put((byte) 0x80); //v、p、x、cc, 1000 0000

bb.put(b); //mark 、payloadtype(96)

bb.putshort((short) seqnum);

bb.putint(timestamp);

bb.putint(ssrc);

bb.put(pcdata);

return bb.array();

}

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

首先是整體的 string filename rtspnettyserver.outputpath keyhash h264 file f new file filename if f.exists sendanswer ctx,r,o bufferedinputstream in null try...

PHP封裝成類(檔案上傳)

uploadfile.class.php created by phpstorm.user huang date 2017 7 19 time 23 20 header content type text html charset utf 8 new new upload class upload ...

PHP檔案上傳封裝成函式

header content type text html charset utf 8 檔案上傳封裝函式 param1 array file 上傳的檔案資訊 5屬性元素陣列 param2 array allow type 允許上傳的mime型別 param3 string path 儲存的路徑 pa...