**:
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...