- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在我的项目中使用 paslibvlc 从 ip 摄像机 获取以 h.264 格式传输的视频。我需要从此流获取快照并尝试使用 vmem 。我的项目是用delphi 7 编写的。当我使用字符串“rtsp://ip/main”连接到相机时,一切正常,但当我设置回调并格式化时,会出现访问内存冲突错误。有人可以告诉我,我做错了什么吗?这是代码
PBytes = ^TBytes;
TBytes = array of byte;
var
MainForm: TMainForm;
ctx:TBytes;
const
cameraURL = 'rtsp://192.168.123.100/main';
function lock(opaque : Pointer; var planes : Pointer) : Pointer;
function unlock(opaque : Pointer; picture : Pointer; planes : Pointer) : Pointer;
function display(opaque : Pointer; picture : Pointer) : Pointer;
implementation
{$R *.dfm}
function lock(opaque : Pointer; var planes : Pointer) : Pointer;
begin
planes := x;
end;
function unlock(opaque : Pointer; picture : Pointer; planes : Pointer) : Pointer;
begin
end;
function display(opaque : Pointer; picture : Pointer) : Pointer;
begin
end;
procedure TMainForm.PlayerInit();
var
args: packed array[0..6] of PAnsiChar;
begin
libvlc_dynamic_dll_init();
SetLength(ctx, 1280*720*4+32);
if (libvlc_dynamic_dll_error <> '') then
begin
MessageDlg(libvlc_dynamic_dll_error, mtError, [mbOK], 0);
exit;
end;
args[0] := PAnsiChar(libvlc_dynamic_dll_path);
args[1] := '--no-video-title-show';
args[2] := '--no-xlib';
args[3] := '--no-audio';
p_li := libvlc_new(Length(args)-1, @args[0]);
p_mi := NIL;
end;
procedure TMainForm.PlayerPlay(fileName: WideString);
var
p_md: libvlc_media_t_ptr;
begin
btm:=Tbitmap.Create;
btm.Width:=1280;
btm.Height:=720;
PlayerStop();
// create new media from fileName
p_md := libvlc_media_new_path(p_li, PAnsiChar(System.UTF8Encode(fileName)));
//libvlc_media_player_set_media(p_mi, p_md);
p_mi := libvlc_media_player_new_from_media(p_md);
if (p_mi <> NIL) then
begin
libvlc_video_set_callbacks(p_mi,@lock,@unlock,@display,@ctx);
libvlc_video_set_format(p_mi, 'RV32', 1280, 720, 1280*4);
//libvlc_media_player_set_hwnd(p_mi, btm.Handle);
end;
// play
libvlc_media_player_play(p_mi);
// release media
if (p_md <> NIL) then
begin
libvlc_media_release(p_md);
// p_md := NIL;
end;
end;
procedure TMainForm.FormActivate(Sender: TObject);
begin
PlayerInit();
PlayerPlay(cameraURL);
end;
最佳答案
您的回调使用register
调用约定。但这是 Delphi 特定的调用约定。您的库使用cdecl
。这可以从该库的 Pascal 源代码中看出:
type
libvlc_video_lock_cb = function(opaque : Pointer;
var planes : Pointer) : Pointer; cdecl;
libvlc_video_unlock_cb = function(opaque : Pointer;
picture : Pointer; planes : Pointer) : Pointer; cdecl;
libvlc_video_display_cb = function(opaque : Pointer;
picture : Pointer) : Pointer; cdecl;
您需要更改回调以匹配库的调用约定。
如果您没有使用 @
运算符来获取函数指针,编译器就会告诉您所有这些。这样做意味着编译器不会检查函数指针的签名是否与声明的签名匹配。这是人们最常犯的错误之一。无论出于何种原因,人们一直认为获取函数指针的方法是使用 @
运算符。
总之,您需要将 cdecl
添加到回调函数中:
function lock(opaque : Pointer; var planes : Pointer) : Pointer; cdecl;
function unlock(opaque : Pointer; picture : Pointer;
planes : Pointer) : Pointer; cdecl;
function display(opaque : Pointer; picture : Pointer) : Pointer; cdecl;
然后停止使用@
来获取函数指针:
libvlc_video_set_callbacks(p_mi, lock, unlock, display, @ctx);
关于delphi - libvlc vmem 访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15518361/
我在我的项目中使用 paslibvlc 从 ip 摄像机 获取以 h.264 格式传输的视频。我需要从此流获取快照并尝试使用 vmem 。我的项目是用delphi 7 编写的。当我使用字符串“rtsp
我有一个关于 vmem 和 maxvmem 的问题。我在网上搜索过,但确实有很多令人困惑的解释两个字。我所做的是输入: qstat -j 1154926 | grep 虚拟内存 输出是:cpu=00:
我有一个关于 vmem 和 maxvmem 的问题。我在网上搜索过,但确实有很多令人困惑的解释两个字。我所做的是输入: qstat -j 1154926 | grep 虚拟内存 输出是:cpu=00:
我是一名优秀的程序员,十分优秀!