请选择 进入手机版 | 继续访问电脑版

 找回密码
 立即注册
查看: 174|回复: 11

[已解决] 悬赏5块,求助libvlc播放器改变播放速率的问题

[复制链接]

4

主题

22

帖子

24

积分
交易币
0

新手入门

Rank: 1

发表于 2021-12-31 13:15:59 | 显示全部楼层 |阅读模式
本帖最后由 sunshine217 于 2021-12-31 16:09 编辑

悬赏5块,解决后,可微信转钱。
我想改变libvlc播放器播放速率,根据文档 :https://videolan.videolan.me/vlc ... bd23a6b0c198aacf3cd

里面提到了两个函数,
libvlc_media_player_set_rate (libvlc_media_player_t *p_mi, float rate)

Set movie play rate. More...
libvlc_media_player_get_state (libvlc_media_player_t *p_mi)

Get current movie state. More...


所以我改写了 【标准库】-》libvlc播放器组件-》mediaPlayer,  在volume,这块,增加了两个函数
               
[aardio] 纯文本查看 复制代码
volume = {
                        _get = function(){  
                                return tonumber( dll.libvlc_audio_get_volume(owner.handle) );
                        }         
                        _set = function(value){  
                                return dll.libvlc_audio_set_volume(owner.handle,value);  ;
                        }
                };

//这里是增加的第一个函数,改变速率的,
                setRate= function(value){
                        
                        //..win.msgbox(owner.handle);
                        return dll.libvlc_media_player_set_rate(owner.handle,value);        
                };
//这里是增加的第二个函数,得到 当前速率的
                getRate = function(){
                        //..win.msgbox(owner.handle);
                        
                        return dll.libvlc_media_player_get_rate(owner.handle);
                };



然后呢,使用【范例】-》音频视频-》视频-》libvlc, 里的例子,增加一个按扭,点击时,调用vlcPlayer.getRate(), 取得速率,但总是得到 0, 或改变速率, vlcPlayer.serRate(2.0), 但总是没效果,不知道 是什么原因,有大神如果能解决,感激不尽, 转钱是必须的。



回复

使用道具 举报

4

主题

22

帖子

24

积分
交易币
0

新手入门

Rank: 1

 楼主| 发表于 2021-12-31 13:20:45 | 显示全部楼层
[aardio] 纯文本查看 复制代码
//这里是增加的代码,但getRate(),总是0,setRate(),没效果。
winform.openbtn.oncommand = function(id,event){
	win.msgbox(tostring(vlcPlayer.getRate()),"");
	vlcPlayer.setRate(2);
}


上面是代码
回复 支持 反对

使用道具 举报

0

主题

5

帖子

3

积分
交易币
0

新手入门

Rank: 1

发表于 2021-12-31 15:29:43 | 显示全部楼层
其实看下基础语法文档就有答案了,何必浪费这 5 块钱呢?!
别人给你答案,花了 5 块钱还没学到东西,看文档不用花钱,还能学到更多知识。

文档里《不声明直接调用API添加参数的规则》有写:
数值参数一律处理为32位int整型,32位整数类型,小于32位的整数、枚举类型、8位或32位bool值都跟int 32位数值兼容,可以直接写在参数里,示例
你这个 API 用的是 float 类型,所以先声明一下 API 就可以了。
回复 支持 反对

使用道具 举报

0

主题

5

帖子

3

积分
交易币
0

新手入门

Rank: 1

发表于 2021-12-31 15:31:04 | 显示全部楼层
另外也可以用 raw.float() 转换一下。
回复 支持 反对

使用道具 举报

0

主题

5

帖子

3

积分
交易币
0

新手入门

Rank: 1

发表于 2021-12-31 15:37:11 | 显示全部楼层
setRate= function(value){
   
return dll.libvlc_media_player_set_rate(owner.handle,..raw.float(value));   
};

getRate =
function(){
   
return dll.libvlc_media_player_get_rateF(owner.handle);
};
下次遇到这种问题如果你愿意先去看一下文档,你留个账号,我给你打 6 块钱。

回复 支持 反对

使用道具 举报

4

主题

22

帖子

24

积分
交易币
0

新手入门

Rank: 1

 楼主| 发表于 2021-12-31 15:37:20 | 显示全部楼层
批评的有道理,我再仔细看下。
回复 支持 反对

使用道具 举报

4

主题

22

帖子

24

积分
交易币
0

新手入门

Rank: 1

 楼主| 发表于 2021-12-31 16:00:26 | 显示全部楼层
我现在这样声明:
       
[aardio] 纯文本查看 复制代码
libvlc_media_player_get_rate = dll.api("libvlc_media_player_get_rate","LONG(POINTER mp)" );
	libvlc_media_player_set_rate = dll.api("libvlc_media_player_set_rate","void(POINTER mp,float value)" 


现在set_rate是没问题了,可以改变速率,但是get_rate, 怎么转换浮点数呢? 望lv9011 赐教。raw.float(), 好象没有这个函数。
回复 支持 反对

使用道具 举报

4

主题

22

帖子

24

积分
交易币
0

新手入门

Rank: 1

 楼主| 发表于 2021-12-31 16:09:20 | 显示全部楼层
是的,看了您 写的,dll.libvlc_media_player_get_rateF(owner.handle), 加了个F, 即解决了,好厉害 ,佩服佩服。
回复 支持 反对

使用道具 举报

0

主题

5

帖子

3

积分
交易币
0

新手入门

Rank: 1

发表于 2021-12-31 16:15:29 | 显示全部楼层
sunshine217 发表于 2021-12-31 16:00
我现在这样声明:
        [mw_shl_code=aardio,true]libvlc_media_player_get_rate = dll.api("libvlc_media_play ...

float 类型当然声明为 float 呀、
你为什么要声明为 LONG,然后再转换为 float  呢?!
libvlc_media_player_get_rate = dll.api("libvlc_media_player_get_rate","float(POINTER mp)" );
libvlc_media_player_set_rate = dll.api(
"libvlc_media_player_set_rate","void(POINTER mp,float value)


不声明调用,在 API 后面加 F 尾标就可以返回 float 值。
看下文档,你也可以变厉害
dll.ApiNameW() 切换到Unicode版本,字符串UTF8-UTF16双向转换
dll.ApiNameA() 切换到ANSI版本,字符串不作任何转换
dll.ApiNameL() 返回值为64位LONG类型
dll.ApiNameP() 返回值为指针类型
dll.ApiNameD() 返回值为double浮点数
dll.ApiNameF() 返回值为float浮点数

dll.ApiNameB() 返回值为C++中的8位bool类型


回复 支持 反对

使用道具 举报

4

主题

22

帖子

24

积分
交易币
0

新手入门

Rank: 1

 楼主| 发表于 2021-12-31 19:19:38 | 显示全部楼层
明白 了,我已修正,如下:
[aardio] 纯文本查看 复制代码
	libvlc_media_player_get_rate = dll.api("libvlc_media_player_get_rate","float(POINTER mp)" );
	libvlc_media_player_set_rate = dll.api("libvlc_media_player_set_rate","void(POINTER mp,float value)" );

多谢大师指点。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



GMT+8, 2022-1-19 05:42 , Processed in 0.105000 second(s), 25 queries .

© 2001-2011 Powered by Discuz! X3.2.

快速回复 返回顶部 返回列表