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

 找回密码
 立即注册
查看: 180|回复: 6

[已解决] 悬赏并求助,求解决libvlc视频连续播放的问题

[复制链接]

4

主题

22

帖子

24

积分
交易币
0

新手入门

Rank: 1

发表于 2021-12-19 15:06:30 | 显示全部楼层 |阅读模式
本帖最后由 sunshine217 于 2021-12-20 12:27 编辑

悬赏10块钱,钱不多,只够喝茶的,略表心意,可加个微信,私下支付 。

有个libvlc视频连续播放的问题,百思不得解,也可能是标准库有问题。
代码如下,其实只加了一行,所有代码来自,范例程序--》音频视频--》视频-->libvlc,
加一行的地方,加了//============= 标记。


[aardio] 纯文本查看 复制代码
import fonts.fontAwesome;
import win.ui;
/*DSG{{*/
var winform = win.form(text="万能播放器 - 调用libvlc";right=856;bottom=483;bgcolor=16515070;clipch=1;parent=...)
winform.add(
btnFullScreen={cls="plus";text='\uF047';left=811;top=453;right=852;bottom=483;color=1938422;db=1;dr=1;font=LOGFONT(h=-16;name='FontAwesome');iconStyle={align="left";font=LOGFONT(h=-13;name='FontAwesome');padding={left=8}};notify=1;repeat="center";z=4};
btnPlay={cls="plus";text='\uF04B';left=10;top=456;right=42;bottom=479;color=1938422;db=1;dl=1;font=LOGFONT(h=-19;name='FontAwesome');notify=1;repeat="scale";z=5};
btnStop={cls="plus";left=518;top=458;right=550;bottom=481;background="I:\系统下载目录\aplayer视频播放器\res\stop-hover.png";db=1;dr=1;notify=1;repeat="scale";z=6};
plus={cls="plus";text='\uF027';left=666;top=457;right=691;bottom=480;color=1938422;db=1;dr=1;font=LOGFONT(h=-19;name='FontAwesome');repeat="scale";z=2};
trackbar={cls="plus";left=49;top=460;right=652;bottom=472;bgcolor=-2512093;border={radius=-1};color=23807;db=1;dl=1;dr=1;foreRepeat="expand";foreRight=13;forecolor=-14911489;notify=1;paddingBottom=5;paddingTop=5;z=1};
video={cls="custom";left=8;top=6;right=848;bottom=447;bgcolor=0;db=1;dl=1;dr=1;dt=1;z=7};
volume={cls="plus";left=696;top=461;right=812;bottom=473;bgcolor=-2512093;border={radius=-1};color=23807;db=1;dr=1;foreRepeat="expand";foreRight=13;forecolor=-14911489;notify=1;paddingBottom=5;paddingTop=5;z=3}
)
/*}}*/

import libvlc; 
import win.version;
import debug;

//初始化vlc引擎,可用参数:[url=https://wiki.videolan.org/VLC_command-line_help/]https://wiki.videolan.org/VLC_command-line_help/[/url] 
var vlcEngine = libvlc(
        "--subsdec-encoding=GB18030",//字幕默认使用中文编码
        win.version.isVistaLater ? "--freetype-font=DFKai-SB" : "--freetype-font=宋体",//WIN7可用字体:Arial Unicode MS,DFKai-SB, Microsoft JhengHei, MingLiU, MingLiU-ExtB, MingLiU_HKSCS, MingLiU_HKSCS-ExtB, PMingLiU, PMingLiU-ExtB
        "-I","dummy","--ignore-config"//,"--extraintf=logger" ,"--verbose=2" 
        )
        
//创建播放器
vlcPlayer = vlcEngine.mediaPlayer( winform.video );
vlcPlayer.setKeyInput(true)

var eventManager = vlcPlayer.getEventManager()
eventManager.mediaPlayerTimeChanged = function(event){ 
        if( !winform.trackbar.state.active ){
                
                winform.trackbar.progressPos = event.newTime
        }         
}

eventManager.mediaPlayerLengthChanged = function(event){ 
    winform.btnPlay.disabledText = null;
        winform.trackbar.setTrackbarRange(1,vlcPlayer.length);
        winform.trackbar.progressPos = 0;
        //vlcPlayer.spuLoad("字幕路径");
}  

eventManager.mediaPlayerEndReached=function(event){
        //sleep(2000);
         //vlcPlayer.loadMediaFile(fsys.dlg.open(,"请指定视频文件")); 
         //vlcPlayer.loadMe("http://download.aardio.com/demo/video.aardio"); 
         //winform.btnPlay.disabledText = {'\uF254';'\uF251';'\uF252';'\uF253';'\uF250'};
         //vlcPlayer.play();
         
         
}
//=====================
//就是这里,想在前一个视频播放完之后,再播放下一个视频,但每次都会卡住,死界面,不执行
//不知为何原因,想请高人解决。
eventManager.mediaPlayerStopped = function(event){
        //vlcPlayer.release();
        
        //win.msgbox("released");
        vlcPlayer.loadMediaFile("e:\\book_head20_square.mp4"); 
         winform.btnPlay.disabledText = {'\uF254';'\uF251';'\uF252';'\uF253';'\uF250'};
         vlcPlayer.play();
}

import fsys.dlg;
winform.btnPlay.oncommand = function(id,event){  
    
         if( winform.btnPlay.checked ){ 
                 if(!vlcPlayer.isStopped() && !vlcPlayer.isPaused() &&  !vlcPlayer.isEnded() ){
                         //vlcPlayer.loadMediaFile(fsys.dlg.open(,"请指定视频文件")); 
                         vlcPlayer.loadMedia("http://download.aardio.com/demo/video.aardio"); 
                         winform.btnPlay.disabledText = {'\uF254';'\uF251';'\uF252';'\uF253';'\uF250'}
                 }
         
                vlcPlayer.play()   
        }
        else {
                vlcPlayer.pause(); 
        } 
        
} 

winform.btnStop.oncommand = function( id,event ){
        vlcPlayer.stop()
        winform.btnPlay.checked = false; 
}
  
winform.volume.setTrackbarRange(1,100);
winform.trackbar.onMouseUp = function(){
    vlcPlayer.pause()
        vlcPlayer.time = winform.trackbar.progressPos; 
        vlcPlayer.play()
} 

winform.volume.setTrackbarRange(1,100);
winform.volume.progressPos = 100;
winform.volume.onMouseUp = function(){ 
        vlcPlayer.volume = pos;
} 

winform.btnFullScreen.oncommand = function(id,event){
        winform.video.fullscreen(true);
} 

// 关闭窗体时退出播放器
winform.onClose = function(hwnd,message,wParam,lParam){
    vlcPlayer.release()
}

//按回车、空格暂停
winform.isDialogMessage = function(hwnd,msg){ 
    if(  msg.wParam == 0xD/*_VK_RETURN*/ || msg.wParam == 0x20/*_VK_SPACE*/ ){
        msg.hwnd = winform.btnPlay.hwnd;
        return;
    }
    return win.isDialogMessage(hwnd,msg);
}

//全屏快捷键
winform.video.translateAccelerator = function(msg){ 
         if(  msg.wParam == 0xD/*_VK_RETURN*/ || msg.wParam == 0x20/*_VK_SPACE*/ ){
                   msg.hwnd = winform.btnPlay.hwnd;
         }
         if(  msg.wParam == 0x1B/*_VK_ESC*/ ){
                  winform.video.fullscreen(false); 
         }
}

winform.adjust = function( cx,cy,wParam ) {         
        for(name,ctrl in winform.eachControl("plus") ){
                ctrl.redrawTransparent(); //修正内部裁剪不重绘
        } 
};

winform.volume.skin({
        background={
                default=0xFF23ABD9
        };
        foreground={
                default=0xFFFF771C;
                hover=0xFFFF6600
        };
        color={
                default=0xFFFF5C00;
                hover=0xFFFF6600
        }
})

winform.trackbar.setTrackbarRange(1,100);
winform.trackbar.skin({
        background={
                default=0xFF23ABD9
        };
        foreground={
                default=0xFFFF771C;
                hover=0xFFFF6600
        };
        color={
                default=0xFFFF5C00;
                hover=0xFFFF6600
        }
})

winform.btnFullScreen.skin({
        color={
                active=0xFF00FF00;
                default=0xFFF6931D;
                disabled=0xFF6D6D6D;
                hover=0xFFFF0000
        }
})

winform.btnPlay.skin({
        color={
                active=0xFF00FF00;
                default=0xFFF6931D;
                disabled=0xFF6D6D6D;
                hover=0xFFFF0000
        }
        checked={
                text = '\uF04D'
        }
})

winform.show() 
win.loopMessage(); 

回复

使用道具 举报

4

主题

22

帖子

24

积分
交易币
0

新手入门

Rank: 1

 楼主| 发表于 2021-12-19 15:11:02 | 显示全部楼层
我的本意是,当前一个视频停止播放后,在eventManager.mediaPlayerStopped 事件里,找出下一个要播放的视频,然后.loadmediafile(),然后.play()播放之。 但如在源码中所示,一直没有成功,会直接卡死,不执行,就是loadmediafile(), 这个函数,执行不下去,恳请有关人士,解决之,事成加微信,付款。
回复 支持 反对

使用道具 举报

5

主题

44

帖子

55

积分
交易币
0

编程一段

Rank: 2

发表于 2021-12-19 17:38:39 | 显示全部楼层
本帖最后由 popdes 于 2021-12-19 18:14 编辑

用异步应该就可以了,你这个事件退不出去导致libvlc死锁了,用win.settimeout(fun,10),设置10毫秒后异步执行切换视频代码, 还有估计要放到eventManager.mediaPlayerEndReached 那个里面切换
[aardio] 纯文本查看 复制代码
eventManager.mediaPlayerEndReached=function(event){
    win.setTimeout(
            function(){
                    vlcPlayer.loadMedia("https://media.html5media.info/video.mp4"); 
                    winform.btnPlay.disabledText = {'\uF254';'\uF251';'\uF252';'\uF253';'\uF250'};
                    vlcPlayer.play();
            },10
    ) 
}


参考:
http://blog.sina.com.cn/s/blog_5e83fce60101f9g6.html
[size=13.6364px]后面发现原来是调用libvlc_media_player_stop时发生死锁了。
[size=13.6364px]通常出现libvlc_media_player_stop函数挂起时,我们都设置了回调函数,包括display、stop event之类的回调函数。
[size=13.6364px]由于回调函数和我们调用的libvlc_media_player_stop函数通常不在同一个线程上。由于libvlc_media_player_stop函数中需要互斥锁资源,如果在回调函数中调用了libvlc中需要互斥锁资源的接口时,就会出现死锁的情况
[size=13.6364px]那么那些接口是需要互斥锁资源的呢?
[size=13.6364px]其实,我们不用管这么多,只需要保持在回调函数中不调用libvlc的其他接口就好了。或者在调用接口时做好和其他线程的同步处理,让多个线程进行接口调用时不要出现资源竞争就好了。
[size=13.6364px]当然在进行同步的时候要优先采用无锁的机制,保证效率的同时又避免引入潜在的死锁。

网站: aardio学习笔记,www.htmlayout.cn
回复 支持 反对

使用道具 举报

4

主题

22

帖子

24

积分
交易币
0

新手入门

Rank: 1

 楼主| 发表于 2021-12-20 12:23:27 | 显示全部楼层
上面这位仁兄说的不错,已经 解决了,留个微信,可以转10块。
回复 支持 反对

使用道具 举报

5

主题

44

帖子

55

积分
交易币
0

编程一段

Rank: 2

发表于 2021-12-20 18:34:12 来自手机 | 显示全部楼层
https://www.htmlayout.cn/t/447 去这个帖子里的二维码转吧,哈哈
回复 支持 反对

使用道具 举报

4

主题

22

帖子

24

积分
交易币
0

新手入门

Rank: 1

 楼主| 发表于 2021-12-21 15:28:02 | 显示全部楼层
@popdes, 10块钱已转,请查收, 用微信转的。收款人是**伟。
回复 支持 反对

使用道具 举报

5

主题

44

帖子

55

积分
交易币
0

编程一段

Rank: 2

发表于 2021-12-21 16:35:11 | 显示全部楼层
sunshine217 发表于 2021-12-21 15:28
@popdes, 10块钱已转,请查收, 用微信转的。收款人是**伟。

收到, 谢谢
网站: aardio学习笔记,www.htmlayout.cn
回复 支持 反对

使用道具 举报

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

本版积分规则



GMT+8, 2022-1-19 06:46 , Processed in 0.077216 second(s), 25 queries .

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

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