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;
}
...全文
1284 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自带的相关例子代码? 百度搜相关关键字?

24,855

社区成员

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

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