首先上**:
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長度接下來就是讀取aac data部分。因為bufferedinputstream的read方法是直接從上次讀取結束的地方接著讀取的,所以不需要偏移量引數,只需要知道 aac data長度即可。+ (adtsheaderbuffer[4]<<3)
+ ((adtsheaderbuffer[5]&0xe0)>>5) - 7;
byte samp = (byte) (adtsheaderbuffer[2]&0x3c); //獲取取樣率
sampling = rtputils.getsampling(samp);
isheader = 0;
aacdatabuffer = new byte[aacdatalen];接下來需要新增2位元組的au-headers-length, 2位元組的au-header(只有乙個),rtp header。其中au-header的高13位是aac data的長度。len = in.read(aacdatabuffer, 0, aacdatalen); //讀取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...