日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java aac rtp封装_分享一段H264视频和AAC音频的RTP封包代码

發(fā)布時間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java aac rtp封装_分享一段H264视频和AAC音频的RTP封包代码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. H264視頻的RTP封包

static?int?h264_parse(Track *tr, uint8_t *data, size_t len)

{

h264_priv *priv = tr->private_data;

//??? double nal_time; // see page 9 and 7.4.1.2

size_t nalsize = 0, index = 0;

uint8_t *p, *q;

if?(priv->is_avc) {

while?(1) {

unsigned?int?i;

if(index >= len)?break;

//get the nal size

nalsize = 0;

for(i = 0; i < priv->nal_length_size; i++)

nalsize = (nalsize << 8) | data[index++];

if(nalsize <= 1 || nalsize > len) {

if(nalsize == 1) {

index++;

continue;

}?else?{

fnc_log(FNC_LOG_VERBOSE,?"[h264] AVC: nal size %d", nalsize);

break;

}

}

if?(DEFAULT_MTU >= nalsize) {

mparser_buffer_write(tr,

tr->properties.pts,

tr->properties.dts,

tr->properties.frame_duration,

1,

data + index, nalsize);

fnc_log(FNC_LOG_VERBOSE,?"[h264] single NAL");

}?else?{

// single NAL, to be fragmented, FU-A;

frag_fu_a(data + index, nalsize, DEFAULT_MTU, tr);

}

index += nalsize;

}

}?else?{

//seek to the first startcode

for?(p = data; p

if?(p[0] == 0 && p[1] == 0 && p[2] == 1) {

break;

}

}

if?(p >= data + len)?return?ERR_PARSE;

while?(1) {

//seek to the next startcode [0 0 1]

for?(q = p; q

if?(q[0] == 0 && q[1] == 0 && q[2] == 1) {

break;

}

}

if?(q >= data + len)?break;

if?(DEFAULT_MTU >= q - p) {

fnc_log(FNC_LOG_VERBOSE,?"[h264] Sending NAL %d",p[0]&0x1f);

mparser_buffer_write(tr,

tr->properties.pts,

tr->properties.dts,

tr->properties.frame_duration,

1,

p, q - p);

fnc_log(FNC_LOG_VERBOSE,?"[h264] single NAL");

}?else?{

//FU-A

fnc_log(FNC_LOG_VERBOSE,?"[h264] frags");

frag_fu_a(p, q - p, DEFAULT_MTU, tr);

}

p = q;

}

// last NAL

fnc_log(FNC_LOG_VERBOSE,?"[h264] last NAL %d",p[0]&0x1f);

if?(DEFAULT_MTU >= len - (p - data)) {

fnc_log(FNC_LOG_VERBOSE,?"[h264] no frags");

mparser_buffer_write(tr,

tr->properties.pts,

tr->properties.dts,

tr->properties.frame_duration,

1,

p, len - (p - data));

}?else?{

//FU-A

fnc_log(FNC_LOG_VERBOSE,?"[h264] frags");

frag_fu_a(p, len - (p - data), DEFAULT_MTU, tr);

}

}

fnc_log(FNC_LOG_VERBOSE,?"[h264] Frame completed");

return?ERR_NOERROR;

}

static?int?h264_parse(Track?*tr,?uint8_t?*data,?size_t?len)

{

h264_priv?*priv?=?tr->private_data;

//????double?nal_time;?//?see?page?9?and?7.4.1.2

size_t?nalsize?=?0,?index?=?0;

uint8_t?*p,?*q;

if?(priv->is_avc)?{

while?(1)?{

unsigned?int?i;

if(index?>=?len)?break;

//get?the?nal?size

nalsize?=?0;

for(i?=?0;?i?nal_length_size;?i++)

nalsize?=?(nalsize?<

if(nalsize?<=?1?||?nalsize?>?len)?{

if(nalsize?==?1)?{

index++;

continue;

}?else?{

fnc_log(FNC_LOG_VERBOSE,?"[h264]?AVC:?nal?size?%d",?nalsize);

break;

}

}

if?(DEFAULT_MTU?>=?nalsize)?{

mparser_buffer_write(tr,

tr->properties.pts,

tr->properties.dts,

tr->properties.frame_duration,

1,

data?+?index,?nalsize);

fnc_log(FNC_LOG_VERBOSE,?"[h264]?single?NAL");

}?else?{

//?single?NAL,?to?be?fragmented,?FU-A;

frag_fu_a(data?+?index,?nalsize,?DEFAULT_MTU,?tr);

}

index?+=?nalsize;

}

}?else?{

//seek?to?the?first?startcode

for?(p?=?data;?p

if?(p[0]?==?0?&&?p[1]?==?0?&&?p[2]?==?1)?{

break;

}

}

if?(p?>=?data?+?len)?return?ERR_PARSE;

while?(1)?{

//seek?to?the?next?startcode?[0?0?1]

for?(q?=?p;?q

if?(q[0]?==?0?&&?q[1]?==?0?&&?q[2]?==?1)?{

break;

}

}

if?(q?>=?data?+?len)?break;

if?(DEFAULT_MTU?>=?q?-?p)?{

fnc_log(FNC_LOG_VERBOSE,?"[h264]?Sending?NAL?%d",p[0]&0x1f);

mparser_buffer_write(tr,

tr->properties.pts,

tr->properties.dts,

tr->properties.frame_duration,

1,

p,?q?-?p);

fnc_log(FNC_LOG_VERBOSE,?"[h264]?single?NAL");

}?else?{

//FU-A

fnc_log(FNC_LOG_VERBOSE,?"[h264]?frags");

frag_fu_a(p,?q?-?p,?DEFAULT_MTU,?tr);

}

p?=?q;

}

//?last?NAL

fnc_log(FNC_LOG_VERBOSE,?"[h264]?last?NAL?%d",p[0]&0x1f);

if?(DEFAULT_MTU?>=?len?-?(p?-?data))?{

fnc_log(FNC_LOG_VERBOSE,?"[h264]?no?frags");

mparser_buffer_write(tr,

tr->properties.pts,

tr->properties.dts,

tr->properties.frame_duration,

1,

p,?len?-?(p?-?data));

}?else?{

//FU-A

fnc_log(FNC_LOG_VERBOSE,?"[h264]?frags");

frag_fu_a(p,?len?-?(p?-?data),?DEFAULT_MTU,?tr);

}

}

fnc_log(FNC_LOG_VERBOSE,?"[h264]?Frame?completed");

return?ERR_NOERROR;

}

2. AAC的RTP封包

static?int?aac_parse(Track *tr, uint8_t *data, size_t len)

{

//XXX handle the last packet on EOF

int?off = 0;

uint32_t payload = DEFAULT_MTU - AU_HEADER_SIZE;

uint8_t *packet = g_malloc0(DEFAULT_MTU);

if(!packet)?return?ERR_ALLOC;

// trim away extradata

//??? data += AAC_EXTRA;

//??? len -= AAC_EXTRA;

packet[0] = 0x00;

packet[1] = 0x10;

packet[2] = (len & 0x1fe0) >> 5;

packet[3] = (len & 0x1f) << 3;

if?(len > payload) {

while?(len > payload) {

memcpy(packet + AU_HEADER_SIZE, data + off, payload);

mparser_buffer_write(tr,

tr->properties.pts,

tr->properties.dts,

tr->properties.frame_duration,

0,

packet, DEFAULT_MTU);

len -= payload;

off += payload;

}

}

memcpy(packet + AU_HEADER_SIZE, data + off, len);

mparser_buffer_write(tr,

tr->properties.pts,

tr->properties.dts,

tr->properties.frame_duration,

1,

packet, len + AU_HEADER_SIZE);

g_free(packet);

return?ERR_NOERROR;

}

static?int?aac_parse(Track?*tr,?uint8_t?*data,?size_t?len)

{

//XXX?handle?the?last?packet?on?EOF

int?off?=?0;

uint32_t?payload?=?DEFAULT_MTU?-?AU_HEADER_SIZE;

uint8_t?*packet?=?g_malloc0(DEFAULT_MTU);

if(!packet)?return?ERR_ALLOC;

//?trim?away?extradata

//????data?+=?AAC_EXTRA;

//????len?-=?AAC_EXTRA;

packet[0]?=?0x00;

packet[1]?=?0x10;

packet[2]?=?(len?&?0x1fe0)?>>?5;

packet[3]?=?(len?&?0x1f)?<

if?(len?>?payload)?{

while?(len?>?payload)?{

memcpy(packet?+?AU_HEADER_SIZE,?data?+?off,?payload);

mparser_buffer_write(tr,

tr->properties.pts,

tr->properties.dts,

tr->properties.frame_duration,

0,

packet,?DEFAULT_MTU);

len?-=?payload;

off?+=?payload;

}

}

memcpy(packet?+?AU_HEADER_SIZE,?data?+?off,?len);

mparser_buffer_write(tr,

tr->properties.pts,

tr->properties.dts,

tr->properties.frame_duration,

1,

packet,?len?+?AU_HEADER_SIZE);

g_free(packet);

return?ERR_NOERROR;

}

上面的變量 AU_HEADER_SIZE=4

/* au header

+---------------------------------------+

|???? AU-size?????????????????????????? |

+---------------------------------------+

|???? AU-Index / AU-Index-delta???????? |

+---------------------------------------+

|???? CTS-flag????????????????????????? |

+---------------------------------------+

|???? CTS-delta???????????????????????? |

+---------------------------------------+

|???? DTS-flag????????????????????????? |

+---------------------------------------+

|???? DTS-delta???????????????????????? |

+---------------------------------------+

|???? RAP-flag????????????????????????? |

+---------------------------------------+

|???? Stream-state????????????????????? |

+---------------------------------------+

*/

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的java aac rtp封装_分享一段H264视频和AAC音频的RTP封包代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。