我认为我使用的单位是错的,因为我做了阅读程序:
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;
她认为是被调用的名字,但在我看来,它包含了很多令我困惑的选项,与负载的功能无关。我该怎么处理这条记录?
答案 0 :(得分:2)
根据我的所有研究,该功能实际上名为RTMP_Read
。
例如,您可以使用Dependency Walker检查DLL导出的功能。当然,库的权威来源应该是它提供的C ++头文件。
我的建议是开始学习如何使用C或C ++来使用LIBRTMP。目前您不知道错误是由于接口转换错误还是由于错误地调用错误造成的。如果你继续使用Delphi,那么你将永远努力解决错误的原因。
但是,切换到C或C ++并且您已经拥有链接到库所需的头文件。您可以编译RTMPDUMP附带的演示程序,并观察它们的工作原理。您可以将它们用作文档,因为LIBRTMP本身似乎没有(不是我能找到的)。
然后,一旦你理解了库的工作原理,就开始将它移植到Delphi中。首先创建使用该库的最简单的C ++程序。到Delphi的端口。使用正在运行的程序C ++版本进行比较将有助于您隔离故障。
最终你将拥有一个功能正常的Delphi翻译界面。更重要的是,您实际上将了解如何调用库。如果你继续沿着当前的路径前进,你的进展会非常缓慢。
答案 1 :(得分:0)
function RTMP_ReadData(var r:RTMP; buf:pcchar; size:cint):cint; cdecl; external'librtmp'name 'RTMP_Read'; < - 改变写作。