标签:
杂谈 |
分类: 音视频 |
转http://blog.csdn.net/zblue78/article/details/6298756
只是一个测试
时间戳的感觉有问题 毕竟在RTMP里只是一个24位的整型,如果超过了怎么办呢??
还有 感觉明明是发布上去了 用VLC通过RTSP也可以看到视频了
但是用FLASH看视频就是看不到 很奇怪
如果转载的话建议注明来源
- //
demo.cpp : 定义控制台应用程序的入口点。
- //
- #include
"stdafx.h" -
- #include
"librtmp/rtmp_sys.h" - #include
"librtmp/log.h" - #include
"librtmp/amf.h" - int
InitSockets() - {
- #ifdef
WIN32 -
version; -
WSADATA wsaData; -
version = MAKEWORD(1, 1); -
(WSAStartup(version, &wsaData) == 0); - #else
-
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) - {
-
*ptr; -
i, l = strlen(str); -
(l & 1) -
0; -
*hex = ( *)malloc(l/2); -
ptr = *hex; -
(!ptr) -
0; -
(i=0; i<l; i+=2) -
*ptr++ = (HEX2BIN(str[i]) << 4) | HEX2BIN(str[i+1]); -
l/2; - }
-
- char
* charput_byte( *output, uint8_t nVal ) - {
-
output[0] = nVal; -
output+1; - }
- char
* charput_be16( *output, uint16_t nVal ) - {
-
output[1] = nVal & 0xff; -
output[0] = nVal >> 8; -
output+2; - }
- char
* charput_be24( *output,uint32_t nVal ) - {
-
output[2] = nVal & 0xff; -
output[1] = nVal >> 8; -
output[0] = nVal >> 16; -
output+3; - }
- char
* charput_be32( *output, uint32_t nVal ) - {
-
output[3] = nVal & 0xff; -
output[2] = nVal >> 8; -
output[1] = nVal >> 16; -
output[0] = nVal >> 24; -
output+4; - }
-
- char
* charput_be64( *output, uint64_t nVal ) - {
-
output=put_be32( output, nVal >> 32 ); -
output=put_be32( output, nVal ); -
output; - }
-
- char
* charput_amf_string( *c, constchar *str ) - {
-
uint16_t len = strlen( str ); -
c=put_be16( c, len ); -
memcpy(c,str,len); -
c+len; - }
- char
* charput_amf_double( *c, doubled ) - {
-
*c++ = AMF_NUMBER; -
{ -
unsigned *ci, *co; -
ci = (unsigned *)&d; -
co = (unsigned *)c; -
co[0] = ci[7]; -
co[1] = ci[6]; -
co[2] = ci[5]; -
co[3] = ci[4]; -
co[4] = ci[3]; -
co[5] = ci[2]; -
co[6] = ci[1]; -
co[7] = ci[0]; -
} -
c+8; - }
-
- int
main( intargc, _TCHAR* argv[]) - {
-
-
RTMP_LogPrintf( -
(!InitSockets()) return-1; -
RTMP_debuglevel = RTMP_LOGINFO; -
RTMP *r; -
uri[]="rtmp://127.0.0.1/live/mp4:test"; -
uri[]= "rtmp://192.199.15.223/live/mp4:test"; -
uri[]="rtmp://192.199.15.223/oflaDemo/mp4:test"; -
uri[]="rtmp://192.199.15.151/live/test"; -
uri[]="rtmp://221.9.244.4/live/test"; -
r= RTMP_Alloc(); -
RTMP_Init(r); -
RTMP_SetupURL(r, ( -
RTMP_EnableWrite(r); -
RTMP_Connect(r, NULL); -
RTMP_ConnectStream(r,0); -
-
-
-
*yuv=fopen( "c://video-qcif.yuv","rb"); -
*dbg=fopen( "C://video-qcif.h264","wb"); -
unsigned szNalBuffer[1024*32]; -
char szTempBuffer[1024*32]; -
unsigned szBodyBuffer[1024*32]; -
x264_nal_t *p264Nal; -
i264Nal; -
x264_param_t * p264Param; -
x264_picture_t * p264Pic; -
x264_t *p264Handle; -
p264Param = x264_param_t(); -
p264Pic = x264_picture_t(); -
memset(p264Pic,0, -
x264_param_default(p264Param); default param -
p264Param->i_width = 176; frame width -
p264Param->i_height = 144; frame height -
-
p264Param->b_cabac =0; -
p264Param->i_bframe =0; -
p264Param->b_interlaced=0; -
p264Param->rc.i_rc_method=X264_RC_ABR; -
p264Param->i_level_idc=21; -
p264Param->rc.i_bitrate=64; -
p264Param->i_keyint_max=20; -
p264Param->i_fps_num=15; -
p264Param->rc.i_qp_constant=22; -
= x264_encoder_open(p264Param)) == NULL) -
{ -
fprintf( stderr, failed/n" ); -
-2; -
} -
bs_t bs={0}; -
-
-
-
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, -
-
packet.m_nChannel = 0x04; -
packet.m_headerType = RTMP_PACKET_SIZE_LARGE; -
packet.m_nTimeStamp = 0; -
packet.m_nInfoField2 = r->m_stream_id; -
packet.m_hasAbsTimestamp = 0; -
packet.m_body =( *) szBodyBuffer; -
* charszTmp=( *)szBodyBuffer; -
packet.m_packetType = RTMP_PACKET_TYPE_INFO; -
szTmp=put_byte(szTmp, AMF_STRING ); -
szTmp=put_amf_string(szTmp, ); -
szTmp=put_byte(szTmp, AMF_STRING ); -
szTmp=put_amf_string(szTmp, ); -
szTmp=put_byte(szTmp, AMF_OBJECT ); -
-
szTmp=put_amf_string( szTmp, ); -
szTmp=put_byte(szTmp, AMF_STRING ); -
szTmp=put_amf_string( szTmp, ); -
szTmp=put_amf_string( szTmp, ); -
szTmp=put_byte(szTmp, AMF_STRING ); -
szTmp=put_amf_string( szTmp, ); -
-
szTmp=put_amf_string( szTmp, ); -
szTmp=put_byte(szTmp, AMF_STRING ); -
szTmp=put_amf_string( szTmp, ); -
-
szTmp=put_amf_string( szTmp, ); -
szTmp=put_byte(szTmp, AMF_STRING ); -
szTmp=put_amf_string( szTmp, ); -
-
szTmp=put_amf_string( szTmp, ); -
szTmp=put_byte(szTmp, AMF_STRING ); -
szTmp=put_amf_string( szTmp, ); -
szTmp=put_amf_string( szTmp, ); -
szTmp=put_byte(szTmp, AMF_STRING ); -
szTmp=put_amf_string( szTmp, ); -
-
szTmp=put_amf_string( szTmp, ); -
szTmp=put_amf_double( szTmp, p264Param->i_width ); -
szTmp=put_amf_string( szTmp, ); -
szTmp=put_amf_double( szTmp, p264Param->i_width ); -
szTmp=put_amf_string( szTmp, ); -
szTmp=put_amf_double( szTmp, p264Param->i_height ); -
szTmp=put_amf_string( szTmp, ); -
szTmp=put_amf_double( szTmp, ( / p264Param->i_fps_den ); -
-
szTmp=put_amf_string( szTmp, ); -
szTmp=put_byte(szTmp, AMF_STRING ); -
szTmp=put_amf_string( szTmp, ); -
-
szTmp=put_amf_string( szTmp, ); -
szTmp=put_amf_double( szTmp, p264Param->rc.i_bitrate ); -
szTmp=put_amf_string( szTmp, ); -
szTmp=put_amf_double( szTmp, p264Param->i_level_idc ); -
szTmp=put_amf_string( szTmp, ); -
szTmp=put_amf_double( szTmp, 66 ); -
-
szTmp=put_amf_string( szTmp, ); -
szTmp=put_amf_double( szTmp, 10 ); -
szTmp=put_amf_string( szTmp, ); -
szTmp=put_byte( szTmp, AMF_OBJECT_END ); -
packet.m_nBodySize=szTmp-( *)szBodyBuffer; -
RTMP_SendPacket(r,&packet,1); -
packet.m_packetType = RTMP_PACKET_TYPE_VIDEO; -
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]=0x15; -
szBodyBuffer[ 9]=0x03; -
szBodyBuffer[10]=0x01; -
szTmp=( *)szBodyBuffer+11; -
slen=0; -
bs_init(&bs,szNalBuffer,16); -
x264_sps_write(&bs, p264Handle->sps); -
slen=bs.p-bs.p_start+1; -
slen=htons(slen); -
memcpy(szTmp,&slen, -
szTmp+= -
*szTmp=0x67; -
szTmp+=1; -
memcpy(szTmp,bs.p_start,bs.p-bs.p_start); -
szTmp+=bs.p-bs.p_start; -
*szTmp=0x01; -
szTmp+=1; -
bs_init(&bs,szNalBuffer,16); -
x264_pps_write(&bs, p264Handle->pps); -
slen=bs.p-bs.p_start+1; -
slen=htons(slen); -
memcpy(szTmp,&slen, -
szTmp+= -
*szTmp=0x68; -
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); -
-
unsigned nTimes=0; -
int old=GetTickCount(); -
packet.m_nTimeStamp=0; -
-
{ -
szBodyBuffer[ 0]=0x17; -
szBodyBuffer[ 1]=0x01; -
szBodyBuffer[ 2]=0x00; -
szBodyBuffer[ 3]=0x00; -
szBodyBuffer[ 4]=0x00; -
unsigned * szTmp=szBodyBuffer+5; -
unsigned * pNal=szNalBuffer; -
(nTimes%5==0) -
-
p264Pic->i_type=X264_TYPE_IDR; -
-
-
-
p264Pic->i_type=X264_TYPE_P; -
-
nTimes++; -
nFramsInPack=0; -
-
{ -
nFramsInPack++; -
nCount; -
nCount=fread(p264Pic->img.plane[0],1,176*144,yuv); -
(nCount<176*144) -
{ -
fseek(yuv,SEEK_SET,0); -
-
} -
nCount=fread(p264Pic->img.plane[1],1,176*144/4,yuv); -
(nCount<176*144/4) -
{ -
fseek(yuv,SEEK_SET,0); -
-
} -
nCount=fread(p264Pic->img.plane[2],1,176*144/4,yuv); -
(nCount<176*144/4) -
{ -
fseek(yuv,SEEK_SET,0); -
-
} -
x264_encoder_encode( p264Handle, &p264Nal, &i264Nal, p264Pic ,&pic_out) < 0 ) -
{ -
fprintf( stderr, failed/n" ); -
} -
-
int i = 0; i < i264Nal; i++ ) -
{ -
i_size; -
i_data; -
i_data = 1024*32; -
( i_size = x264_nal_encode( pNal, &i_data, 1, &p264Nal[i] ) ) > 0 ) -
{ -
((pNal[4]&0x60)==0) -
{ -
-
} -
-
fwrite(pNal, -
fflush(dbg); -
(pNal[4]==0x67) -
{ -
-
} -
(pNal[4]==0x68) -
{ -
-
} -
long *len=(unsigned long *)szNalBuffer; -
nlen=htonl(i_size-4); -
-
long)); -
memmove(pNal,pNal+4,i_size-4); -
fprintf( stderr, x264_nal_encode[%d] ,i,*pNal,Type:0x%x size: %d/n" i_size); -
pNal+=i_size-4; -
} -
if( i_size < 0 ) -
{ -
fprintf( stderr, to ,increase buffer size (size=%d)/n" -i_size ); -
} -
} -
Sleep(67); -
unsigned nSize=pNal-szNalBuffer; -
packet.m_nBodySize=nSize+9; -
(i264Nal>1) -
{ -
szBodyBuffer[ 0]=0x17; -
-
packet.m_nTimeStamp=0; -
packet.m_headerType = RTMP_PACKET_SIZE_LARGE; -
} -
-
{ -
szBodyBuffer[ 0]=0x27; -
packet.m_headerType = RTMP_PACKET_SIZE_MEDIUM; -
packet.m_packetType = RTMP_PACKET_TYPE_VIDEO; -
} -
-
int)); -
int); -
-
put_be32(( *)szBodyBuffer+5,nSize); -
memcpy(szBodyBuffer+9,szNalBuffer,pNal-szNalBuffer); -
RTMP_SendPacket(r,&packet,0); -
packet.m_headerType = RTMP_PACKET_SIZE_MEDIUM; -
packet.m_nTimeStamp+=67; -
-
stderr, "Info RTMP_SendPacket[%d] /n",nFramsInPack); -
-
} -
-
} -
0;