最新标注
热门标注
历史更新
站点地图
RSS
Home
CrazyCoder
»
原创
»
it评论
»
it业界
»
互联网
»
精品软件
开发语言
»
网络编程
编程综合
嵌入式开发
算法
英文资料
汇编语言
PowerBuilder
p2p技术
验证码识别
DotNet
Java教程
C语言教程
C 教程
Delphi教程
VB教程
QQ协议开发
项目管理
»
数据库
»
Web开发
»
Python
Css教程
XML教程
网页特效
PhotoShop教程
Illustrator教程
CorelDraw教程
Ruby教程
CorelDraw教程
网站安全
开发平台-工具
Web
PHP教程
Flash教程
Ajax教程
Javascript教程
Html教程
Dreamweaver
Asp教程
技术综合
»
软件测试
办公软件
QQ相关
Windows
网络技术
游戏开发
软件工程
软件教程
编程思想
游戏开发
外挂开发
OpenApi
AutoCad
广告设计
3D设计
平面设计相关
移动手机开发
服务器
»
Linux
Unix/FreeBsd
web服务器
服务器技术
安全
博文摘选
»
翻译
首页
»
博文摘选
» wowza,H264通过RTMP发布到Wowza
Rss订阅
wowza,H264通过RTMP发布到Wowza
on 2011-4-2
in
博文摘选
|
0 Comment
只是一个测试
时间戳的感觉有问题 毕竟在RTMP里只是一个24位的整型,如果超过了怎么办呢??
// demo.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <librtmp/rtmp_sys.h> #include <librtmp/log.h> #include <librtmp/amf.h> // starts sockets int InitSockets() { #ifdef WIN32 WORD version; WSADATA wsaData; version = MAKEWORD(1, 1); return (WSAStartup(version, &wsaData) == 0); #else return TRUE; #endif } inline void CleanupSockets() { #ifdef WIN32 WSACleanup(); #endif } #define HEX2BIN(a) (((a)&0x40)?((a)&0xf)+9:((a)&0xf)) int hex2bin(char *str, char **hex) { char *ptr; int i, l = strlen(str); if (l & 1) return 0; *hex = (char *)malloc(l/2); ptr = *hex; if (!ptr) return 0; for (i=0; i<l; i+=2) *ptr++ = (HEX2BIN(str[i]) << 4) | HEX2BIN(str[i+1]); return l/2; } int main(int argc, _TCHAR* argv[]) { RTMP_LogPrintf("InitSockets!\n"); if (!InitSockets()) return -1; RTMP_debuglevel = RTMP_LOGINFO; RTMP *r; //char uri[]="rtmp://192.199.15.223/oflaDemo/mp4:test"; //rtsp://127.0.0.1:1935/live/test char uri[]="rtmp://127.0.0.1/live/test"; r= RTMP_Alloc(); RTMP_Init(r); RTMP_SetupURL(r, (char*)uri); RTMP_EnableWrite(r); RTMP_Connect(r, NULL); RTMP_ConnectStream(r,0); FILE *yuv=fopen("c:\\video-qcif.yuv","rb"); FILE *dbg=fopen("C:\\video-qcif.h264","wb"); unsigned char szNalBuffer[1024*32]; unsigned char szBodyBuffer[1024*32]; x264_nal_t *p264Nal; int i264Nal; x264_param_t * p264Param; x264_picture_t * p264Pic; x264_t *p264Handle; p264Param = new x264_param_t(); p264Pic = new x264_picture_t(); memset(p264Pic,0,sizeof(x264_picture_t)); x264_param_default(p264Param); //set default param p264Param->i_width = 176; //set frame width p264Param->i_height = 144; //set frame height /*baseline level 1.1*/ p264Param->b_cabac =0; p264Param->i_bframe =0; p264Param->b_interlaced=0; p264Param->rc.i_rc_method=X264_RC_CQP; p264Param->i_level_idc=10; // p264Param->rc.i_qp_constant=22; if((p264Handle = x264_encoder_open(p264Param)) == NULL) { fprintf( stderr, "x264_encoder_open failed\n" ); return -2; } bs_t bs={0}; //fwrite(szNalBuffer,sizeof(char),bs.p-bs.p_start,dbg); x264_picture_alloc(p264Pic, X264_CSP_I420, p264Param->i_width, p264Param->i_height); p264Pic->i_type = X264_TYPE_AUTO; x264_picture_t pic_out; RTMPPacket packet={0}; memset(&packet,0,sizeof(RTMPPacket)); packet.m_nChannel = 0x04; /* source channel (invoke) */ packet.m_headerType = RTMP_PACKET_SIZE_LARGE; packet.m_packetType = 0x09; /* INVOKE */ packet.m_nTimeStamp = 0; packet.m_nInfoField2 = r->m_stream_id; packet.m_hasAbsTimestamp = 0; packet.m_body =(char *) szBodyBuffer; szBodyBuffer[ 0]=0x17; szBodyBuffer[ 1]=0x00; szBodyBuffer[ 2]=0x00; szBodyBuffer[ 3]=0x00; szBodyBuffer[ 4]=0x00; szBodyBuffer[ 5]=0x01; szBodyBuffer[ 6]=0x42; szBodyBuffer[ 7]=0xC0; szBodyBuffer[ 8]=0x0D; szBodyBuffer[ 9]=0x03; szBodyBuffer[10]=0x01; unsigned char * szTmp=szBodyBuffer+11; short slen=0; bs_init(&bs,szNalBuffer,16);//初始话bsW x264_sps_write(&bs, p264Handle->sps);//读取编码器的SPS slen=bs.p-bs.p_start+1;//spslen(short) slen=htons(slen); memcpy(szTmp,&slen,sizeof(short)); szTmp+=sizeof(short); *szTmp=0x68; szTmp+=1; memcpy(szTmp,bs.p_start,bs.p-bs.p_start); szTmp+=bs.p-bs.p_start; bs_init(&bs,szNalBuffer,16);//初始话bs x264_pps_write(&bs, p264Handle->pps);//读取编码器的PPS slen=bs.p-bs.p_start+1;//spslen(short) slen=htons(slen); memcpy(szTmp,&slen,sizeof(short)); szTmp+=sizeof(short); *szTmp=0x67; szTmp+=1; memcpy(szTmp,bs.p_start,bs.p-bs.p_start); szTmp+=bs.p-bs.p_start; packet.m_nBodySize=szTmp-szBodyBuffer; RTMP_SendPacket(r,&packet,0); szBodyBuffer[ 1]=0x01; //packet.m_nTimeStamp=0xFFFFFF; while(dbg) { packet.m_nTimeStamp+=50; szBodyBuffer[ 0]=0x17; szBodyBuffer[ 1]=0x01; szBodyBuffer[ 2]=0x00; szBodyBuffer[ 3]=0x00; szBodyBuffer[ 4]=0x00; unsigned char * szTmp=szBodyBuffer+5; //for(int j=0;j<=5;j++) //{ int nCount; nCount=fread(p264Pic->img.plane[0],1,176*144,yuv); if (nCount<176*144) { fseek(yuv,SEEK_SET,0); continue; } nCount=fread(p264Pic->img.plane[1],1,176*144/4,yuv); if (nCount<176*144/4) { fseek(yuv,SEEK_SET,0); continue; } nCount=fread(p264Pic->img.plane[2],1,176*144/4,yuv); if (nCount<176*144/4) { fseek(yuv,SEEK_SET,0); continue; } if( x264_encoder_encode( p264Handle, &p264Nal, &i264Nal, p264Pic ,&pic_out) < 0 ) { fprintf( stderr, "x264_encoder_encode failed\n" ); } for( int i = 0; i < i264Nal; i++ ) { int i_size; int i_data; i_data = 1024*32; if( ( i_size = x264_nal_encode( szNalBuffer, &i_data, 1, &p264Nal[i] ) ) > 0 ) { if (i==0&&szNalBuffer[4]!=0x67) { szBodyBuffer[ 0]=0x27; } else { szBodyBuffer[ 0]=0x17; } if ((szNalBuffer[4]&0x60)==0) { continue; } //unsigned long *len=(unsigned long *)szNalBuffer; int nlen=htonl(i_size-4); memcpy(szTmp,szNalBuffer,i_size); memcpy(szTmp,&nlen,sizeof(unsigned long)); szTmp+=i_size; //fwrite(szNalBuffer,sizeof(char),i_size,dbg); //fflush(dbg); fprintf( stderr, "Info x264_nal_encode[%d] Type:%x size: %d\n",i,szNalBuffer[4], i_size); } else if( i_size < 0 ) { fprintf( stderr,"need to increase buffer size (size=%d)\n", -i_size ); } } Sleep(50); //if (szBodyBuffer[ 0]==0x17) break; //} packet.m_nBodySize=szTmp-szBodyBuffer; RTMP_SendPacket(r,&packet,0); } return 0; }
Tags:
rtmp协议
h264播放器
wowza破解
wowza
延伸阅读
2011-6-15
--
voip开源,开源 VoIP 首个真正免费的 RTMP 解决方案
2011-5-9
--
wowza,H264通过RTMP发布 V2.0 (Red5 Wowza 测试通过)
2011-5-9
--
wowza,Wowza 的Http扩展 (Publish State)
2011-3-31
--
h264播放器,RTPM中H264的VideoTag
2010-12-24
--
h264rtp,UDP分包重组算法和 基于RTP的H264视频数据分包重组
最新评论
发表评论
昵称
评论
验证码
点击图片更换
赞助商广告
随机更新
Windows To Go:在 USB 存储设备中运行 Windows 8,附演示视频
恒星和行星的区别,首次发现行星围绕两颗恒星运动
百度地图api,【百度地图API】如何制作公交线路的搜索?如331路
retrieve,开放源码的对象关系映射工具ORM.NET 读取数据 Retrieve Data using ORM.NET
Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences
xmpp协议,Windows Live支持XMPP协议
微软安全性能,微软详解Windows 8安全性能提升
facebook,Jefferies分析师称Facebook应该购买webOS
中国10大黑客,细数电脑史上10大强悍黑客
mysql正则,Mysql模糊查询示例(包含正则)
立案侦查,eBay涉嫌滥用对手机密信息 原告推动刑事立案
盛大创新院,盛大创新院发布光速搜索工具 将不涉足全网搜索
百度开放平台,百度站长平台开放注册 站长可优化网站
微软对开发者说:Metro才是你们的未来
【Windows 8】Windows 8安装
电信iphone,中电信部分省市已接到iPhone 5销售准备通知
最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用30
Adobe:IE10不支持Flash?无所谓
卫视通:社交电视应用
windows8,Windows 8隐藏的大秘密:新文件系统Protogon
ribbon,评论:Windows 8 Ribbon UI分析:反对出于成见
市场细分战略,微软苹果OS战略迥异 分别面向大众和细分市场
ARM全球总裁:PC市场虽未死却已僵
黑莓rim,黑莓PlayBook仅售出20万台 RIM计划降价
iPhone 5保护套泄露 类似iPad
ipad平板,iPad vs Windows 8 平板【视屏】
1:46:谁还可以Hold住iPad?
10avos,雅虎将向 AVOS 移交Delicious帐户信息
阿里巴巴收购雅虎,消息称阿里巴巴曾设计收购雅虎详尽方案
谷歌数字图书馆,谷歌欲建全球最大数字图书馆 谈判已持续6年
热门标注
暖色调悲伤
(2)
平安夜是圣诞节吗
(1)
英特尔芯片手机
(1)
平安夜圣诞节祝福
(1)
平安夜和圣诞节
(1)
平安夜圣诞节短信
(1)
圣诞节平安夜
(1)
denali
(1)
人像面部修整软件
(1)
单素材修整
(1)
多重修整视频
(1)
只读文件
(1)
一心只读圣贤书
(1)
只读一种书的意思
(1)
只读存储器
(1)
故事集合
(1)
中西方思维的差异
(1)
程序员的思维
(1)
程序员思维修炼
(1)
英国总统卡梅隆
(1)
最近更新
appsync,App Zap的非常货币化策略:付费游戏的应用内购买
ios推送,60beat GamePad推iOS设备的配套游戏手柄
lost第一季,Lost Monkey:既是吃货又是莽货的孙猴子
成都万科总经理,雷锋网特约专访成都维动科技总经理吴澜
今夜有戏非你莫属,非你莫属 因为有鼠
qq2011,2011最成功的中国IT企业排行榜
2012预测,2012年中国电信市场预测和分析
小米手机开放购买,1月4日小米再次开放购买,售罄10万部需多久
check,Check-in Recipe:在菜市场每签到一次就给你发一条食谱
2011年10大,雷锋网2011年度10大Android游戏
twitter,都怪Twitter
wifi,日本自动售货机将提供免费Wi-Fi服务
凌动上网本,英特尔推新款凌动芯片,欲拯救上网本
qq2011,Gamasutra: 2011年最佳手机游戏
checkin,购物党:中国版的Price Check
Thicket:非主流的视听创作平台
如何提高网速,看C罗如何利用移动游戏提高影响力
英国首相卡梅隆,英国首相卡梅隆特制iPad应用,处理政务
Winter Wake-Up:如果下雪就提前闹醒你
K到曝欢唱版评测:给果粉K歌的SNS
最新标注
暖色调悲伤
(2)
平安夜是圣诞节吗
(1)
英特尔芯片手机
(1)
平安夜圣诞节祝福
(1)
平安夜和圣诞节
(1)
平安夜圣诞节短信
(1)
圣诞节平安夜
(1)
denali
(1)
人像面部修整软件
(1)
单素材修整
(1)
多重修整视频
(1)
只读文件
(1)
一心只读圣贤书
(1)
只读一种书的意思
(1)
只读存储器
(1)
故事集合
(1)
中西方思维的差异
(1)
程序员的思维
(1)
程序员思维修炼
(1)
英国总统卡梅隆
(1)
最新评论