RTMP_Write函数使用

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返回的值不是它应该发送的字节数,那么它知道该值是缓冲区中剩余的有用字节数.然后我将这些字节复制到缓冲区的开头并从文件中读取更多内容.

但我一直遇到问题,所以我想知道:这个功能的正确用法是什么?是否有我应该使用的特定缓冲区值?(不要这么认为)或者它本身就是马车吗?