正确使用libvlc_media_open_cb
我正在尝试使用libvlc函数从内存播放媒体。此函数需要指向四个回调函数的指针:正确使用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
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)
...