Bil*_*hon 6 flv publish rtmp rtmpd
我正在尝试使用librtmp库,它可以很好地拉出流.但是现在我正在尝试发布一个流,为此我相信我必须使用RTMP_Write函数.
我在这里要完成的是一个简单的c ++程序,它将从文件读取并尝试将流推送到crtmp服务器.连接和流创建是可以的,但我对使用RTMP_Write感到很困惑.
这是我做的:
int Upload(RTMP * rtmp, FILE * file){
int nRead = 0;
unsigned int nWrite = 0;
int diff = 0;
int bufferSize = 64 * 1024;
int byteSum = 0;
int count = 0;
char * buffer;
buffer = (char *) malloc(bufferSize);
do{
nRead = fread(buffer+diff,1,bufferSize-diff,file);
if(nRead != bufferSize){
if(feof(file)){
RTMP_LogPrintf("End of file reached!\n");
break;
}else if(ferror(file)){
RTMP_LogPrintf("Error reading from file stream detected\n");
break;
}
}
count += 1;
byteSum += nRead;
RTMP_LogPrintf("Read %d from file, Sum: %d, Count: %d\n",nRead,byteSum,count);
nWrite = RTMP_Write(rtmp,buffer,nRead);
if(nWrite != nRead){
diff = nRead - nWrite;
memcpy(buffer,(const void*)(buffer+bufferSize-diff),diff);
}
}while(!RTMP_ctrlC && RTMP_IsConnected(rtmp) && !RTMP_IsTimedout(rtmp));
free(buffer);
return RD_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
在这个上传函数中,我接收到已经初始化的RTMP结构和一个指向打开文件的指针.
这实际上有效,我可以看到一些视频正在显示,但它很快就会丢失并停止发送包.我设法理解,只要我设置的缓冲区(以及我随机要求的64k,没有特殊原因)碰巧拆分了flv标签(http://osflash.org/flv#flv_format),就会发生这种情况.新包装.
为此,我修改了RTMP_Write函数并告诉它验证它是否能够解码整个flv标签(数据包类型,正文大小,时间戳等等),如果不能,那么它应该只返回缓冲区中剩余的有用字节.
if(s2 - 11 <= 0){
rest = size - s2;
return rest;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码注意到这一点,如果RTMP_Write返回的值不是它应该发送的字节数,那么它知道该值是缓冲区中剩余的有用字节数.然后我将这些字节复制到缓冲区的开头并从文件中读取更多内容.
但我一直遇到问题,所以我想知道:这个功能的正确用法是什么?是否有我应该使用的特定缓冲区值?(不要这么认为)或者它本身就是马车吗?
| 归档时间: |
|
| 查看次数: |
1424 次 |
| 最近记录: |