6

librtmp ライブラリを使用しようとしていますが、ストリームをプルするのに非常にうまく機能しました。しかし今、ストリームを公開しようとしています。そのためには RTMP_Write 関数を使用する必要があると思います。

ここで達成しようとしているのは、ファイルから読み取り、ストリームを crtmp サーバーにプッシュしようとする単純な C++ プログラムです。接続とストリームの作成は問題ありませんが、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;
}

この Upload 関数では、既に初期化された RTMP 構造体と開いているファイルへのポインターを受け取ります。

これは実際に機能し、ビデオが表示されているのを見ることができますが、すぐに失われ、パッケージの送信が停止します。私が設定したバッファ(そして、ランダムに64kにする必要がありましたが、特別な理由はありません)がたまたまflvタグ(http://osflash.org/flv#flv_format)を分割するたびに発生することを理解できました新しいパッケージ。

そのために、RTMP_Write 関数を修正し、flv タグ全体 (パケット タイプ、ボディ サイズ、タイムスタンプなど) をデコードできるかどうかを確認するように指示しました。バッファに残っている有用なバイト。

  if(s2 - 11 <= 0){
      rest = size - s2;
      return rest;
  }

上記のコードはこれに注意し、RTMP_Write によって返された値が送信するはずだったバイト数でない場合、値がバッファに残っている有効なバイト数であることを認識します。次に、これらのバイトをバッファーの先頭にコピーし、ファイルからさらに読み取ります。

しかし、私はそれで問題を抱え続けているので、疑問に思っていました.とにかく、この関数の正しい使い方は何ですか? 使用すべき特定のバッファ値はありますか? (そうは思わないでください)またはそれ自体がバグですか?

4

0 に答える 0