正确使用libvlc_media_open_cb

正确使用libvlc_media_open_cb,libvlc,realbasic,xojo,Libvlc,Realbasic,Xojo,我正在尝试使用libvlc函数从内存播放媒体。此函数需要指向四个回调函数的指针:Open、Read、Seek和Close 将函数libvlc_media_new_回调Lib“libvlc.dll”(实例为Ptr,OpenCB为Ptr,ReadCB为Ptr,SeekCB为Ptr,CloseCB为Ptr,不透明为Ptr)声明为Ptr 变暗不透明,因为Ptr=SomeOpaqueValue() 作为Ptr=libvlc_media_new_回调的Dim句柄(实例,AddressOf MediaOpen

我正在尝试使用libvlc函数从内存播放媒体。此函数需要指向四个回调函数的指针:
Open
Read
Seek
Close

将函数libvlc_media_new_回调Lib“libvlc.dll”(实例为Ptr,OpenCB为Ptr,ReadCB为Ptr,SeekCB为Ptr,CloseCB为Ptr,不透明为Ptr)声明为Ptr
变暗不透明,因为Ptr=SomeOpaqueValue()
作为Ptr=libvlc_media_new_回调的Dim句柄(实例,AddressOf MediaOpen,AddressOf MediaRead,AddressOf MediaSeek,AddressOf MediaClose,不透明)
如果我没有指定
Open
回调,则
Read
Seek
Close
回调都可以正常工作,但这意味着libvlc不知道介质的长度

当我指定一个
Open
回调时,它会被正确的
opaque
参数调用,但是其他回调会得到一个空指针。这使得不可能知道回调应该处理哪个流

我是否误解了公开回调的目的

以下是我的回调函数:

共享函数MediaOpen(不透明为Ptr,缓冲区为Ptr,ByRef BufferSize为UInt64)为UInt32
Dim r As BinaryStream=Streams.Lookup(不透明,无)
如果r=Nil,则返回1'无效不透明
Buffer=Nil'不确定如何处理此参数
缓冲区大小=r.长度
返回0
端函数
共享子媒体关闭(与Ptr一样不透明)
如果Streams.HasKey(不透明),则Streams.Remove(不透明)
如果Streams.Count=0,则Streams=Nil
端接头
共享函数MediaRead(不透明为Ptr,缓冲区为Ptr,缓冲区大小为整数)为UInt32
Dim r As BinaryStream=Streams.Lookup(不透明,无)
如果r=Nil,则返回0'无效不透明
将mb调为MemoryBlock=缓冲区
Dim数据作为MemoryBlock=r.Read(缓冲区大小)
mb.StringValue(0,data.Size)=数据
返回数据。大小
端函数
共享函数MediaSeek(不透明为Ptr,偏移量为UInt64)为Int32
Dim r As BinaryStream=Streams.Lookup(不透明,无)
如果r=Nil,则返回1'无效不透明
如果偏移量>r.长度,则返回1'无效偏移量
r、 位置=偏移量
返回0
端函数

根据文档,您必须分配一个缓冲区,并在open的buffer参数中返回其地址(为此,您需要将其更改为ByRef parm!)。然后在其他函数中传递相同的缓冲区ptr

理想情况下,你应该

Buffer = r
在MediaOpen中。但是Xojo不会让你的。相反,您需要维护一个字典,在其中存储
r
,然后将其与可以分配给缓冲区parm的值相关联

下面是一个示例(未测试):


希望这对您有所帮助

只是一个猜测:您是否需要从Open返回一个值,并且该值将传递给其他调用,而不是不透明的值?文档中说,成功返回零,否则返回非零,我正在这样做。我已经设置了一个字典,将
不透明
值与正确的流相关联。所以基本上我所做的就是将
不透明
参数复制到
HandleOut
参数中,它就成功了!
Static Property OpenedBuffers as Dictionary
Static Property OpenedBufferID as Integer

Shared Function MediaOpen(Opaque As Ptr, ByRef HandleOut As Integer, ByRef BufferSize As UInt64) As UInt32
  Dim r As BinaryStream = Streams.Lookup(Opaque, Nil)
  If r = Nil Then Return 1 ' invalid Opaque
  if OpenedBuffers = nil then OpenedBuffers = new Dictionary
  OpenedBufferID = OpenedBufferID + 1
  OpenedBuffers.Value(OpenedBufferID) = r
  HandleOut = OpenedBufferID
  BufferSize = r.Length
  Return 0
End Function

Shared Function MediaRead(Handle As Integer, Buffer As Ptr, BufferSize As Integer) As UInt32
  Dim r As BinaryStream = OpenedBuffers.Value(Handle)
  ...

Shared Sub MediaClose(Handle As Integer)
  Dim r As BinaryStream = OpenedBuffers.Value(Handle)
  OpenedBuffers.Remove (Handle)
  If Streams.HasKey(r) Then Streams.Remove(r)
  ...