海康威视delphi二次开发遇到的莫名奇妙的问题

qq_41325939 2017-12-11 11:07:20
用SDK处理按文件回放,遇到一个问题,返回的结果中读取的文件大小、开始时间、结束时间的错误的数值。
...
type
NET_DVR_FIND_DATA = record
sFileName: Array[0..100-1] of Char;
struStartTime: NET_DVR_TIME;
struStopTime: NET_DVR_TIME;
dwFileSize: LongInt;
end {NET_DVR_FIND_DATA};
LPNET_DVR_FIND_DATA = ^NET_DVR_FIND_DATA;
...
type
NET_DVR_TIME = record
dwYear: LongInt;
dwMonth: LongInt;
dwDay: LongInt;
dwHour: LongInt;
dwMinute: LongInt;
dwSecond: LongInt;
end {NET_DVR_TIME};
LPNET_DVR_TIME = ^NET_DVR_TIME;

...
strFile : NET_DVR_FIND_DATA;
...
lnext := NET_DVR_FindNextFile(lFindFile, strFile);

//获取文件名是正确的
kbmMemTB_FielPlay.FieldByName('Filename').AsString := PAnsiChar(@strFile.sFileName);
//获取文件大小,虽然有数值,但是是错误的,和官方DEMO获取的数值不一样
kbmMemTB_FielPlay.FieldByName('FileSize').AsInteger := LongInt(strFile.dwFileSize);
iYear := strFile.struStartTime.dwYear;//获取的年份数值也是错误的
...全文
825 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_41325939 2017-12-18
  • 打赏
  • 举报
回复
引用 11 楼 DelphiGuy 的回复:
[quote=引用 9 楼 qq_41325939 的回复:] [quote=引用 8 楼 DelphiGuy 的回复:] [quote=引用 4 楼 qq_41325939 的回复:] [quote=引用 3 楼 DelphiGuy 的回复:] NET_DVR_FIND_DATA = packed record ...
大侠,可否指条明路。。。[/quote] 不是丢写了吗,估计是结构对齐的问题,你定义成packed record试试。 [/quote] 好的,我试试。会不会是sFileName: Array[0..100-1] of Char;这里定义的问题?D2009的Char字节数改变了,所以后面记录体的位置也改变了,导致取出来的数值错误?[/quote] 如果是D2009+,这里应该改成AnsiChar。 [/quote] 用D7重新编译测试了,可以正常获取记录结构的值,但是反而播放不了视频了,但是问题应该就是Char。
  • 打赏
  • 举报
回复
引用 9 楼 qq_41325939 的回复:
[quote=引用 8 楼 DelphiGuy 的回复:] [quote=引用 4 楼 qq_41325939 的回复:] [quote=引用 3 楼 DelphiGuy 的回复:] NET_DVR_FIND_DATA = packed record ...
大侠,可否指条明路。。。[/quote] 不是丢写了吗,估计是结构对齐的问题,你定义成packed record试试。 [/quote] 好的,我试试。会不会是sFileName: Array[0..100-1] of Char;这里定义的问题?D2009的Char字节数改变了,所以后面记录体的位置也改变了,导致取出来的数值错误?[/quote] 如果是D2009+,这里应该改成AnsiChar。
tanqth 2017-12-13
  • 打赏
  • 举报
回复
var nSize: Integer; begin nSize :=strFile.dwFileSize; if nSize > 1073741824 then Result := FormatFloat('###,##0.00G', nSize / 1073741824) else if nSize > 1048576 then Result := FormatFloat('###,##0.00M', nSize / 1048576) else if nSize > 1024 then Result := FormatFloat('###,##00K', nSize / 1024) else Result := FormatFloat('###,#0B', nSize); if Length(Result) > 2 then if Result[1] = '0' then Delete(Result, 1, 1); end;
lyhoo163 2017-12-13
  • 打赏
  • 举报
回复
你贴出的Java Damo, 就是有转换方式,模仿做就可以了。
qq_41325939 2017-12-13
  • 打赏
  • 举报
回复
引用 6 楼 lyhoo163 的回复:
你贴出的Java Damo, 就是有转换方式,模仿做就可以了。
JAVA demo里面的转换,只是将strFile.dwFileSize由字节数换算成K数,M数而已,现在是strFile.dwFileSize字节数取出来就不对
qq_41325939 2017-12-13
  • 打赏
  • 举报
回复
引用 8 楼 DelphiGuy 的回复:
[quote=引用 4 楼 qq_41325939 的回复:] [quote=引用 3 楼 DelphiGuy 的回复:] NET_DVR_FIND_DATA = packed record ...
大侠,可否指条明路。。。[/quote] 不是丢写了吗,估计是结构对齐的问题,你定义成packed record试试。 [/quote] 好的,我试试。会不会是sFileName: Array[0..100-1] of Char;这里定义的问题?D2009的Char字节数改变了,所以后面记录体的位置也改变了,导致取出来的数值错误?
  • 打赏
  • 举报
回复
引用 4 楼 qq_41325939 的回复:
[quote=引用 3 楼 DelphiGuy 的回复:] NET_DVR_FIND_DATA = packed record ...
大侠,可否指条明路。。。[/quote] 不是丢写了吗,估计是结构对齐的问题,你定义成packed record试试。
qq_41325939 2017-12-12
  • 打赏
  • 举报
回复
引用 2 楼 tanqth 的回复:
他DEMO里写清楚了,取数需要再转换一下的。
这个。。。DEMO的转换在哪里?
qq_41325939 2017-12-12
  • 打赏
  • 举报
回复
引用 3 楼 DelphiGuy 的回复:
NET_DVR_FIND_DATA = packed record ...
大侠,可否指条明路。。。
tanqth 2017-12-12
  • 打赏
  • 举报
回复
他DEMO里写清楚了,取数需要再转换一下的。
  • 打赏
  • 举报
回复
NET_DVR_FIND_DATA = packed record ...
qq_41325939 2017-12-11
  • 打赏
  • 举报
回复
String MyString; if (strFile.dwFileSize < 1024 * 1024) { iTemp = (strFile.dwFileSize) / (1024); MyString = iTemp + "K"; } else { iTemp = (strFile.dwFileSize) / (1024 * 1024); MyString = iTemp + "M "; iTemp = ((strFile.dwFileSize) % (1024 * 1024)) / (1204); MyString = MyString + iTemp + "K"; } newRow.add(MyString); //添加文件大小信息 newRow.add(strFile.struStartTime.toStringTime());//添加开始时间信息 newRow.add(strFile.struStopTime.toStringTime()); //添加结束时间信息 -- 这个是官方JAVA的DEMO,看上去也是直接就读取到数值的

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧