VLC用libvlc_audio_set_callbacks导致无声音

leehaoquan 2016-12-01 05:55:42
项目内嵌的vlc作为播放器, 想获取实时播放音量来画音量柱, 但使用libvlc_audio_set_callbacks来获取音频callback之后, 就没声音了, 求解
int CMutilMedia::Open(CString sPath, libvlc_audio_play_cb play_cb)
{
//处理中文路径问题, 转成UTF-8
char* pStr = CStringUtil::AsciiToUTF8(sPath);

m_pInst = libvlc_new(0, NULL); /* Load the VLC engine */
m_pMedia = libvlc_media_new_path(m_pInst, pStr); /* Create a new item */
if (!m_pMedia)
return 0;
m_pPlayer = libvlc_media_player_new_from_media(m_pMedia); /* Create a media player playing environement */
if (!m_pPlayer)
return 0;
libvlc_media_release(m_pMedia); /* No need to keep the media now */
libvlc_media_player_set_hwnd(m_pPlayer, m_hWnd);
delete pStr;

//设置播放回调, 获取音频数据
m_pPlay_cb = play_cb;
if (play_cb != NULL)
libvlc_audio_set_callbacks(m_pPlayer, play_cb, NULL, NULL, NULL, NULL, m_pPlayer);
return 1;
}
...全文
1626 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanglw115 2017-10-27
  • 打赏
  • 举报
回复
官方文档上面针对这个函数的调用说明如下: Note The audio callbacks override any other audio output mechanism. If the callbacks are set, LibVLC will not output audio in any way. 也就是说调用这个函数设置回调之后,libvlc将不再输出音频。 你想监听vlc播放状态相关的事件的话,请放弃使用这种方法,改为使用libvlc_event_attach接口去实现,但是每次更新media的时候,都需要设置一次,例如:

/* 设置播放状态转换回调,使用全局变量记录。后面set media的时候使用。 */
bool app_vlc_new_instance(libvlc_callback_t callback, void *usrData)
{
    /* 如果正在播放,测试表明不需要停止播放,会自动停止*/
    libvlc_media_t *pVlcMedia = NULL;
    char buffer[1024] = {0};
    if (g_bInstanceInited) {
        printf("Instance has been inited!\n");
        return;
    }

    pthread_mutex_lock(&g_mutex);

    if (g_pVlcInstance) {
        libvlc_release(g_pVlcInstance);
        g_pVlcInstance = NULL;
    }
    g_pVlcInstance = libvlc_new(0, NULL);
    if (!g_pVlcInstance) {
        goto Error;
    }

    g_pVlcCallback = callback;
    g_pUserData = usrData;

    if (g_pVlcPlayer) {
        libvlc_media_player_release(g_pVlcPlayer);
        g_pVlcPlayer = NULL;
    }
    pVlcMedia = libvlc_media_new_location(g_pVlcInstance, "");
    if (pVlcMedia) {
        g_pVlcPlayer = libvlc_media_player_new_from_media(pVlcMedia);
        if (!g_pVlcPlayer) {
            goto Error;
        }
    } else {
        goto Error;
    }
    libvlc_audio_set_volume(g_pVlcPlayer, 50);
    libvlc_media_release(pVlcMedia);
    pVlcMedia = NULL;
    pthread_mutex_unlock(&g_mutex);
    g_bInstanceInited = true;
    return true;

Error:
    if (pVlcMedia) {
        libvlc_media_release(pVlcMedia);
        pVlcMedia = NULL; 
    }
    libvlc_errmsg();
    pthread_mutex_unlock(&g_mutex);
    return false;

}

void app_vlc_set_media(const char *pUrl, UrlType type)
{
    char buffer[1024] = {0};
    if (Type_Local == type) {
        if (!app_get_local_url(pUrl, buffer, sizeof(buffer))) {
            printf("Url is invalid!\n");
            return;
        }
        pUrl = buffer;
    }

    /* 如果前面还正在播放,则set_media之后,前面的media将被释放,播放也会停止 */
    libvlc_media_t *pVlcMedia = NULL;
    pVlcMedia = libvlc_media_new_location(g_pVlcInstance, pUrl);
    printf("Prepare to set media url: %s\n", pUrl);

    pthread_mutex_lock(&g_mutex);
    {
        if (pVlcMedia) {
            if (!g_pVlcPlayer) {
                g_pVlcPlayer = libvlc_media_player_new_from_media(pVlcMedia);
                if (!g_pVlcPlayer) {
                    libvlc_errmsg();
                    goto Error;
                }
            } else {
                if (g_pVlcCallback) {
                    if (0 != libvlc_event_attach(libvlc_media_event_manager(pVlcMedia), libvlc_MediaStateChanged, g_pVlcCallback, g_pUserData)) {
                        printf("%s\n", libvlc_errmsg());
                    }
                }
                libvlc_media_player_set_media(g_pVlcPlayer, pVlcMedia);
            }
        } else {
            printf("%s\n", libvlc_errmsg());
        }                                   
    }
    pthread_mutex_unlock(&g_mutex);

Error:
    if (pVlcMedia) {
        libvlc_media_release(pVlcMedia);
        pVlcMedia = NULL;        
    }
}
赵4老师 2016-12-02
  • 打赏
  • 举报
回复 1
参考VLC自带的相关例子代码? 百度搜相关关键字?
内容概要:本文聚焦于“含虚拟惯量阻尼的大功率并网逆变器VSG控制策略与仿真验证”,系统研究虚拟同步发电机(VSG)技术在大功率并网逆变器中的应用,旨在提升新能源并网系统的动态响应能力与运行稳定性。通过引入虚拟惯量与虚拟阻尼控制机制,使逆变器能够模拟传统同步发电机的惯性与阻尼特性,有效应对电网频率波动和负载突变带来的冲击。文档深入剖析了VSG的核心控制原理,包括有功-频率、无功-电压的下垂控制模型,并基于Simulink平台构建完整的系统仿真模型,对不同工况下的动态性能进行仿真分析与验证,充分展示了VSG在提升并网系统稳定性、增强电网支撑能力方面的优越性。; 适合人群:具备电力电子、自动控制理论及新能源并网技术背景,从事电气工程、可再生能源系统仿真与控制研究的研究生、科研人员以及相关领域的工程技术人员。; 使用场景及目标:① 掌握VSG控制策略在大功率并网逆变器中的具体实现方法与参数设计流程;② 学习基于Simulink搭建高保真度并网逆变器动态仿真模型的技术路径;③ 深入探究虚拟惯量与虚拟阻尼对改善电网频率响应、抑制功率振荡的作用机理,服务于微电网、高比例可再生能源接入等复杂电力系统的稳定性优化与控制策略研究。; 阅读建议:建议结合提供的Simulink仿真文件同步操作,重点关注VSG控制环路的结构设计与关键参数(如虚拟惯量、阻尼系数)的整定方法,通过设置不同的电网扰动工况(如负载切换、频率突变)观察系统响应特性,从而深入理解VSG的动态调节机制与控制优势。同时可参考文中涉及的其他电力系统控制案例,拓展对现代智能电网综合控制策略的认知视野。

24,851

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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