librtmp傳送AVC,AAC資料報

2021-08-03 02:18:51 字數 2912 閱讀 5457

1. librtmp的包結構

[cpp]view plain

copy

typedef

struct

rtmppacket  

rtmppacket;  

packet->m_headertype: 可以定義如下:

[cpp]view plain

copy

#define rtmp_packet_size_large    0

#define rtmp_packet_size_medium   1

#define rtmp_packet_size_small    2

#define rtmp_packet_size_minimum  3

一般定位為 rtmp_packet_size_medium

[cpp]view plain

copy

#define rtmp_packet_type_audio    0x08

#define rtmp_packet_type_video    0x09

#define rtmp_packet_type_info     0x12 

packet->m_hasabstimestamp: 是否使用絕對時間戳,一般定義為0。

[cpp]view plain

copy

#define stream_channel_metadata  0x03

#define stream_channel_video     0x04

#define stream_channel_audio     0x05

packet->m_ntimestamp:時間戳

音訊時間戳也可以從0開始計算,48k取樣每幀遞增21;44.1k取樣每幀遞增23。

packet->m_ninfofield2 = rtmp->m_stream_id

packet->m_nbodysize:資料報長度 = nalu包長度 + 包頭長度

packet->m_nbytesread:不用管

packet->m_chunk: 不用管

packet->m_body:包頭資料 + nalu資料,其長度為packet->m_nbodysize。

[cpp]view plain

copy

intrtmp_write_video_header(rtmp *rtmp)   

[cpp]view plain

copy

"code"

class

="cpp"

>

intrtmp_write_video_frame(rtmp *rtmp, 

const

byte

*nalu_data, 

intslice_count, 

intntimestamp)  

//傳送

if(rtmp_isconnected(rtmp))  

}  //釋放記憶體

rtmppacket_free(&packet);  

return

nret;  

}  

4. 傳送音訊頭包

[cpp]view plain

copy

intrtmp_write_audio_header(rtmp *rtmp)  

在最開始傳送一次即可。

5. 傳送音訊包

[cpp]view plain

copy

intrtmp_write_audio_data(rtmp *rtmp, 

const

byte

*nalu_data, 

intnalu_size, 

intaudio_timestamp)  

6. 本地儲存packet

[cpp]view plain

copy

intrtmp_sendpacket_wrap(rtmp_ *rtmp, rtmppacket *packet, 

intqueue);  

if(packet->m_packettype == rtmp_packet_type_video) else

if(packet->m_packettype == rtmp_packet_type_audio)  

intlen = 0;  

int_to_bytes(packet->m_nbodysize,  &data[1], 3);  // 3位元組 包內容長度

int_to_bytes(packet->m_ntimestamp, &data[4], 3);  // 3位元組 時間戳,沒用第4位元組,太長的檔案會溢位

len += fwrite(data, 1, 11, flv_fp);               // 寫入包頭11位元組

len += fwrite(packet->m_body, 1, packet->m_nbodysize, flv_fp); // 寫入資料報體

int_to_bytes(len, &data[0], 4);                   // 寫入的總位元組長度

fwrite(data, 1, 4, flv_fp);                       // 等於前tag總長度

#endif

return

rtmp_sendpacket(rtmp, packet, queue);  

}   頂0

踩 0

利用LIBRTMP直播時 更改傳送資料的包大小

rtmp r 提前申請的 rtmppacket pack rtmppacket alloc pack,4 pack.m packettype rtmp packet type chunk size pack.m nchannel 0x02 pack.m headertype rtmp packet ...

利用LIBRTMP直播時 更改傳送資料的包大小

rtmp r 提前申請的 rtmppacket pack rtmppacket alloc pack,4 pack.m packettype rtmp packet type chunk size pack.m nchannel 0x02 pack.m headertype rtmp packet ...

基於 Cygwin 編譯 librtmp

由於需要在移動平台上解決基於 rtmp 協議的編譯碼,所以用到了 rtmpdump 專案下的 librtmp 不知道有沒有更好的推薦?呵呵 直接上 ndk 稍嫌麻煩,於是乎想嘗試先在 windows 平台下做一些預研,便想到直接在 cygwin 下面做了 其實在 cygwin 下面編譯 librtm...