使用librtmp庫發布直播流

2021-06-18 09:54:18 字數 3492 閱讀 2371

**:

rtmp協議與flv封包格式基本相同(本來就是一家公司的嘛)

將flv檔案解析出型別,時間戳,資料大小,資料區

對應寫的rtmp包的位置進行傳送即可

rtmpdump官網:

庫版本 2.4

下圖,左邊傳送到伺服器,右側可正常**(模擬的是實時流,發完該流也就結束了)

#include

#include

#include

#include "librtmp/rtmp_sys.h"

#include "librtmp/log.h"

#pragma comment(lib,"ws2_32.lib")

#pragma comment(lib,"lib/librtmp.lib")

#define hton16(x)  ((x>>8&0xff)|(x<<8&0xff00))

#define hton24(x)  ((x>>16&0xff)|(x<<16&0xff0000)|x&0xff00)

#define hton32(x)  ((x>>24&0xff)|(x>>8&0xff00)|\

(x<<8&0xff0000)|(x<<24&0xff000000))

bool read8(int &i8,file*fp);

bool read16(int &i16,file*fp);

bool read24(int &i24,file*fp);

bool read32(int &i32,file*fp);

bool peek8(int &i8,file*fp);

bool readtime(int &itime,file*fp);

//rtmp_***()返回0表示失敗,1表示成功

rtmp*rtmp=null;//rtmp應用指標

rtmppacket*packet=null;//rtmp包結構

char* rtmpurl="rtmp:";//連線的url

char* flvfile="test.flv";//讀取的flv檔案

bool zinit();//初始化相關

void zclear();//清除相關

int main()

/初始化//

// rtmp_debuglevel=rtmp_loginfo;//資訊等級(0-6)

限 2.3版以前使用

rtmp_loglevel lvl=rtmp_loginfo;

rtmp_logsetlevel(lvl);//設定資訊等級

//rtmp_logsetoutput(file*fp);//設定資訊輸出檔案

rtmp=rtmp_alloc();//申請rtmp空間

rtmp_init(rtmp);//初始化rtmp設定

rtmp->link.timeout=5;//設定連線超時,單位秒,預設30秒

packet=new rtmppacket();//建立包

rtmppacket_alloc(packet,1024*64);//給packet分配資料空間,

要滿足最長的幀,不知道可設大些

rtmppacket_reset(packet);//重置packet狀態

連線//

rtmp_setupurl(rtmp,rtmpurl);//設定url

rtmp_enablewrite(rtmp);//設定可寫狀態

if (!rtmp_connect(rtmp,null))//連線伺服器

if (!rtmp_connectstream(rtmp,0))//建立並發布流(取決於rtmp->link.lflags)

packet->m_hasabstimestamp = 0; //絕對時間戳

packet->m_nchannel = 0x04; //通道

packet->m_ninfofield2 = rtmp->m_stream_id;

file*fp=fopen(flvfile,"rb");

if (fp==null)

printf("rtmpurl:%s\nflvfile:%s\nsend data ...\n",rtmpurl,flvfile);

傳送資料//

fseek(fp,9,seek_set);//跳過前9個位元組

fseek(fp,4,seek_cur);//跳過4位元組長度

long start=clock()-1000;

long perframetime=0;//上一幀時間戳

while(true)

int type=0;//型別

int datalength=0;//資料長度

int time=0;//時間戳

int streamid=0;//流id

if(!read8(type,fp))

break;

if(!read24(datalength,fp))

break;

if(!readtime(time,fp))

break;

if(!read24(streamid,fp))

break;

if (type!=0x08&&type!=0x09)

if(fread(packet->m_body,1,datalength,fp)!=datalength)

break;

packet->m_headertype = rtmp_packet_size_medium; 

packet->m_ntimestamp = time; 

packet->m_packettype=type;

packet->m_nbodysize=datalength;

if (!rtmp_isconnected(rtmp))

if (!rtmp_sendpacket(rtmp,packet,0))

int alldatalength=0;//該幀總長度

if(!read32(alldatalength,fp))

break;

perframetime=time; }

printf("send data over\n");

fclose(fp);

zclear();

return 0; }

bool zinit()

return true; }

void zclear()

if (packet!=null)

///

wsacleanup(); }

bool read8(int &i8,file*fp)

bool read16(int &i16,file*fp)

bool read24(int &i24,file*fp)

bool read32(int &i32,file*fp)

bool peek8(int &i8,file*fp)

bool readtime(int &itime,file*fp)

需自己開啟rtmp伺服器)

使用FFmpeg轉錄網路直播流

找來乙個直播流url,比如東森新聞 試了一下,還不賴呢!命令列如下 上面例子中的直播流是http協議的。ffmpeg還支援其他什麼協議嗎?這也簡單!在控制台輸入ffmpeg protocols便一目了然了。不禁又一次暗暗佩服 ffmpeg holy high!ps.有位同學提醒道,應該加上 c v ...

ffmpeg使用指令實現推流實現直播流程

windows下用ffmpeg nginx rtmp搭建直播環境 實現推流 拉流 啟動nginx 進入nginx的目錄,執行其中rtmp檔案。執行下列 cd g studyprojects setupvideoservice nginx 1.7.11 3 gryphon nginx.exe c co...

使用nuget發布自己寫的類庫

2.建立自己的類庫工程,比如td.csproj 3.cmd或者powershell下定位到td.csproj所在的目錄,執行 nuget spec td.csproj或nuget spec 加入目錄下只有乙個工程檔案 生成nuspec檔案,這裡生成td.nuspec 4.使用文字編輯器 如notep...