24,855
社区成员
发帖
与我相关
我的任务
分享
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;
}
/* 设置播放状态转换回调,使用全局变量记录。后面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;
}
}