我在我的项目中使用mpg123解码mp3。我与开发人员(Thomas Orgis)讨论了搜索时的性能问题并且他有一个好主意:扫描文件,然后将扫描的索引设置为播放句柄。 所以我想在我的C#项目中使用mpg123_index和mpg123_set_index,并在libmpg123周围使用一个包装器。
包装器不是自编的,我也联系了开发人员,但他似乎无法使用。所以也许有人掌握了指针编程的知识,我自己也做了一些事情,但是目前我在调用方法时只得到一个AccessViolationException。
这里有一些代码: 包装规范(也许这是错的?!):
[DllImport(Mpg123Dll)]public static extern int mpg123_index(IntPtr mh, IntPtr offsets, IntPtr step, IntPtr fill);
网站上的规范(C):
https://www.mpg123.de/api/group__mpg123__seek.shtml#gae1d174ac632ec72df7dead94c04865fb
MPG123_EXPORT int mpg123_index(mpg123_handle * mh,off_t ** 偏移,off_t * step,size_t * fill)
允许访问为搜索而管理的帧索引表。您 被要求不要修改值...使用mpg123_set_index来设置 寻求指数
参数 把柄 偏移指向索引数组的指针 第一步索引字节偏移推进了这么多MPEG帧 填写记录索引偏移的数量;数组的大小
返回 MPG123_OK成功
我尝试在C#中使用该功能:
IntPtr pIndex = IntPtr.Zero;
IntPtr pFill = IntPtr.Zero;
IntPtr pStep = IntPtr.Zero;
if (MPGImport.mpg123_index(this.mp3Handle,pIndex,pStep,pFill) != (int)MPGImport.mpg123_errors.MPG123_OK))
{
log.error("Failed!");
}
那么,有谁有想法,如何在C#端正确使用该功能?从mpg123的作者我得到的信息,pIndex将是一个指向内部索引的指针。所以这个指针将被这个函数改变。
感谢您的帮助。
此致 斯文
编辑: 现在,以下代码几乎可以工作:
[DllImport(Mpg123Dll)]public unsafe static extern int mpg123_index(IntPtr mh, long **offsets, long *step, ulong *fill);
[DllImport(Mpg123Dll)]public unsafe static extern int mpg123_set_index(IntPtr mh, long* offsets, long step, ulong fill);
public static Boolean CopyIndex(IntPtr _sourceHandle,IntPtr _destinationHandle)
{
Boolean copiedIndex = false;
unsafe
{
long* offsets = null;
long step = 0;
ulong fill = 0;
int result = MPGImport.mpg123_index(_sourceHandle, &offsets, &step, &fill);
if (result == (int)MPGImport.mpg123_errors.MPG123_OK)
{
result = MPGImport.mpg123_set_index(_destinationHandle, offsets, step, fill);
if (result == (int)mpg123_errors.MPG123_OK)
{
copiedIndex = true;
}
}
}
return copiedIndex;
}
在result = MPGImport.mpg123_set_index(_destinationHandle, offsets, step, fill);
上,结果为-1,即MPG123_ERR = -1, /**< Generic Error */
。
答案 0 :(得分:2)
工作代码:
[DllImport(Mpg123Dll)]public unsafe static extern int mpg123_index(IntPtr mh, long **offsets, long *step, ulong *fill);
[DllImport(Mpg123Dll)]public unsafe static extern int mpg123_set_index(IntPtr mh, long* offsets, long step, ulong fill);
public static Boolean CopyIndex(IntPtr _sourceHandle,IntPtr _destinationHandle)
{
Boolean copiedIndex = false;
unsafe
{
long* offsets = null;
long step = 0;
ulong fill = 0;
int result = MPGImport.mpg123_index(_sourceHandle, &offsets, &step, &fill);
if (result == (int)MPGImport.mpg123_errors.MPG123_OK)
{
result = MPGImport.mpg123_set_index(_destinationHandle, offsets, step, fill);
if (result == (int)mpg123_errors.MPG123_OK)
{
copiedIndex = true;
}
}
}
return copiedIndex;
}
_sourceHandle和_destinationHandle可能不是IntPtr.Zero,这是我的错误。感谢Stargateur,真的很好!