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;

程序可以编译,但是当您开始收到错误消息时: 在库 DLL librtmp 中找不到过程入口点 RTMP_ReadData? 但是这个功能在模块里有描述,帮我找个出入

如果信任 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;

她被调用的imee名称,但在我看来,它包含很多让我困惑的选项,与加载的功能无关。我该怎么处理这张唱片?

4

2 回答 2

2

根据我所有的研究,该函数实际上名为RTMP_Read.

例如,您可以使用Dependency Walker检查您的 DLL 导出的函数。当然,库的最终来源应该是它提供的 C++ 头文件。


我的建议是开始学习如何使用 C 或 C++ 使用 LIBRTMP。目前您不知道错误是由于接口翻译错误,还是由于调用不正确。如果您继续使用 Delphi,那么您将永远难以找出错误的原因。

但是,切换到 C 或 C++,您已经拥有链接到库所需的头文件。您可以编译 RTMPDUMP 附带的演示程序并观察它们是如何工作的。您可以将它们用作您的文档,因为 LIBRTMP 本身似乎没有(我找不到)。

然后,一旦你了解了这个库是如何工作的,就开始将它移植到 Delphi 中。首先创建使用该库的最简单的 C++ 程序。将其移植到德尔福。拥有一个正在运行的 C++ 版本的程序进行比较将帮助您隔离故障。

最终,您将获得界面的功能 Delphi 翻译。更重要的是,您将真正了解如何调用该库。如果你继续你目前的道路,你将取得非常缓慢的进展。

于 2012-10-10T12:51:27.137 回答
0

函数 RTMP_ReadData(var r:RTMP; buf:pcchar; size:cint):cint;cdecl;external 'librtmp' name 'RTMP_Read' ; <--改写。

于 2013-05-26T11:56:12.143 回答