1

読み取り手順を行っているため、使用しているユニットが間違っていると思います。

procedure ReadStream (rtmp: RTMP; Stream: TStream);
var
   Buffer: array [0 .. 16384-1] of Byte ;/ / 16kB buffer
   BytesRead: Integer;
begin
   while True do
   begin
     BytesRead: = RTMP_ReadData (rtmp, @ Buffer [0], SizeOf (Buffer));
     if BytesRead = 0 then
       exit;
     Stream.WriteBuffer (Buffer [0], BytesRead);
   end;
end;

プロシージャ コール:

var
  MY_RTMP: RTMP;
  URL_str: string;
  MY_RTMPPacket: RTMPPacket;
  URL_char: PAnsiChar;
  F: TFileStream;
begin
  F: = TFileStream.Create (ExtractFilePath (GetModuleName (0)) + 'Video.flv', fmCreate or fmOpenWrite);
  URL_str: = 'rtmp :/ / localhost: 1935/Video/test.stream';
  MY_RTMP: = RTMP_Alloc;
  RTMP_Init (MY_RTMP);
  RTMP_SetupURL (MY_RTMP, pcchar (URL_str));
  RTMP_EnableWrite (MY_RTMP);
  RTMP_Connect (MY_RTMP, MY_RTMPPacket);
  RTMP_ConnectStream (MY_RTMP, 0);
  ReadStream (MY_RTMP, F);
end;

プログラムはコンパイルされますが、次のエラー メッセージが表示 されるようになります。プロシージャ エントリ ポイント RTMP_ReadData がライブラリ DLL librtmp に見つかりません しかし、この機能はモジュールで説明されています。矛盾を見つけるのを手伝ってください

Dependency Walker を信頼する場合、ライブラリは RTMP_ReadData を機能しません。関数 RTMP_Read があり、ソースによると:

リンク

C では次のように機能します。

static int rtmp_read (URLContext * s, uint8_t * buf, int size)
{
     LibRTMPContext * ctx = s-> priv_data;
     RTMP * r = & ctx-> rtmp;

     return RTMP_Read (r, buf, size);
}

そして、私が使用するモジュールでは、説明がありません

既存のエントリを使用するモジュール:

RTMP_READ = record
       buf: pcchar;
       bufpos: pcchar;
       buflen: cuint;
       timestamp: uint32_t;
       dataType: uint8_t;
       flags: uint8_t;
       status: int8_t;
       initialFrameType: uint8_t;
       nResumeTS: uint32_t;
       metaHeader: pcchar;
       initialFrame: pcchar;
       nMetaHeaderSize: uint32_t;
       nInitialFrameSize: uint32_t;
       nIgnoredFrameCounter: uint32_t;
       nIgnoredFlvFrameCounter: uint32_t;
     end;

彼女は呼び出された名前ですが、私の意見では、負荷の機能に関係なく、混乱を招くオプションがたくさん含まれています。この記録をどうするか?

4

2 に答える 2

2

私のすべての調査によると、関数は実際にはRTMP_Read.

たとえば、Dependency Walkerを使用して、DLL がエクスポートする関数を確認できます。もちろん、ライブラリの最終的なソースは、付属の C++ ヘッダー ファイルである必要があります。


私のアドバイスは、C または C++ を使用して LIBRTMP の使用方法を学び始めることです。現時点では、エラーの原因がインターフェイスの変換の誤りによるものなのか、それとも呼び出しの誤りによるものなのかはわかりません。Delphi を使い続けると、エラーの原因を突き止めるのに永遠に苦労することになります。

ただし、C または C++ に切り替えると、ライブラリへのリンクに必要なヘッダー ファイルが既に存在します。RTMPDUMP に付属のデモ プログラムをコンパイルして、その動作を観察できます。LIBRTMP自体には何もないように見えるので(私が見つけたわけではありません)、それらをドキュメントとして使用できます。

次に、ライブラリの仕組みを理解したら、Delphi への移植を開始します。まず、ライブラリを使用する最も単純な C++ プログラムを作成します。それを Delphi に移植します。実行中の C++ バージョンのプログラムと比較すると、障害を特定するのに役立ちます。

最終的には、機能するインターフェイスの Delphi 変換ができます。さらに重要なことは、ライブラリを呼び出す方法を実際に理解できるようになることです。現在のやり方を続けると、非常にゆっくりとした進歩になります。

于 2012-10-10T12:51:27.137 に答える
0

function RTMP_ReadData(var r:RTMP; buf:pcchar; size:cint):cint;cdecl; 外部 'librtmp' 名'RTMP_Read' ; <-- 書き込みを変更します。

于 2013-05-26T11:56:12.143 に答える