文章目录
- 前言
-
- 配置VS+VLC
- VLC播放视频
-
- 基本流程
- [1. `libvlc_new`](#1.
libvlc_new
) - [2. `libvlc_set_user_agent`](#2.
libvlc_set_user_agent
) - [3. `libvlc_set_log_verbosity`](#3.
libvlc_set_log_verbosity
) - [4. `libvlc_media_new_path`](#4.
libvlc_media_new_path
) - [5. `libvlc_media_player_new_from_media`](#5.
libvlc_media_player_new_from_media
) - [6. `libvlc_media_player_play`](#6.
libvlc_media_player_play
) - [7. `libvlc_media_player_get_state`](#7.
libvlc_media_player_get_state
) - [8. `libvlc_media_release`](#8.
libvlc_media_release
) - [9. `libvlc_media_player_release`](#9.
libvlc_media_player_release
) - [10. `libvlc_release`](#10.
libvlc_release
) - 播放代码
- 总结
前言
在现代多媒体应用开发中,Visual Studio (VS) 和 VLC 播放器是两个强大的工具。Visual Studio 提供了一个全面的开发环境,支持多种编程语言和框架,而 VLC 播放器则是一个开源的多媒体播放器,支持几乎所有的音视频格式,并且可以通过其强大的 API 进行定制和扩展。本文将介绍如何在 Visual Studio 中配置 VLC 并实现视频播放功能。这对于那些希望在自己的应用程序中集成视频播放功能的开发者来说,尤其有用。
配置VS+VLC
首先我们需要先创建VS工程
然后把我们之前下载的include和lib放到里面去
接着我们把这些东西弄到vs里面:
首先把include放进去
然后把lib目录放进去:
在里面填上libvlc.lib;libvlccore.lib
即可
VLC播放视频
基本流程
- 初始化 VLC 实例:创建一个 VLC 实例,用于后续的媒体播放操作。
- 设置日志和用户代理:配置日志详细级别和用户代理信息,以便调试和标识。
- 创建媒体对象:从指定的文件路径创建一个媒体对象,准备播放。
- 创建媒体播放器:从媒体对象创建一个媒体播放器,用于控制播放。
- 开始播放媒体:调用播放函数开始播放媒体。
- 等待播放完成:阻塞程序,直到播放结束或发生错误。
- 释放资源:释放媒体播放器、媒体对象和 VLC 实例,清理内存。
以下是代码中使用的主要函数的详细介绍,包括函数原型、作用、参数和返回值的含义:
1. libvlc_new
函数原型:
c
libvlc_instance_t* libvlc_new(int argc, const char *const *argv);
作用:
创建并初始化一个新的 VLC 实例。该实例用于管理 VLC 的全局设置和操作。
参数:
argc
: 参数的数量(通常为0
)。argv
: 参数的数组(通常为nullptr
)。
返回值:
- 返回一个
libvlc_instance_t*
类型的实例指针。如果创建失败,返回nullptr
。
2. libvlc_set_user_agent
函数原型:
c
void libvlc_set_user_agent(libvlc_instance_t* p_instance, const char *psz_name, const char *psz_version);
作用:
设置 VLC 实例的用户代理信息。这通常用于网络请求中,以便服务器识别客户端。
参数:
p_instance
: VLC 实例指针。psz_name
: 用户代理的名称。psz_version
: 用户代理的版本。
返回值:
- 无返回值。
3. libvlc_set_log_verbosity
函数原型:
c
void libvlc_set_log_verbosity(libvlc_instance_t* p_instance, int level);
作用:
设置 VLC 实例的日志详细级别。这影响到日志信息的详细程度。
参数:
p_instance
: VLC 实例指针。level
: 日志详细级别(从0
到5
,4
表示详细日志)。
返回值:
- 无返回值。
4. libvlc_media_new_path
函数原型:
c
libvlc_media_t* libvlc_media_new_path(libvlc_instance_t* p_instance, const char *psz_mrl);
作用:
从指定的路径创建一个媒体对象。psz_mrl
是媒体资源定位符(Media Resource Locator)。
参数:
p_instance
: VLC 实例指针。psz_mrl
: 媒体文件的路径。
返回值:
- 返回一个
libvlc_media_t*
类型的媒体对象指针。如果创建失败,返回nullptr
。
5. libvlc_media_player_new_from_media
函数原型:
c
libvlc_media_player_t* libvlc_media_player_new_from_media(libvlc_media_t* p_md);
作用:
根据给定的媒体对象创建一个新的媒体播放器。
参数:
p_md
: 媒体对象指针。
返回值:
- 返回一个
libvlc_media_player_t*
类型的媒体播放器指针。如果创建失败,返回nullptr
。
6. libvlc_media_player_play
函数原型:
c
int libvlc_media_player_play(libvlc_media_player_t* p_mi);
作用:
开始播放媒体。
参数:
p_mi
: 媒体播放器指针。
返回值:
- 返回
0
表示成功,返回其他值表示失败。
7. libvlc_media_player_get_state
函数原型:
c
libvlc_state_t libvlc_media_player_get_state(libvlc_media_player_t* p_mi);
作用:
获取当前媒体播放器的状态。
参数:
p_mi
: 媒体播放器指针。
返回值:
- 返回
libvlc_state_t
类型的状态值,如libvlc_Playing
(播放中)、libvlc_Ended
(播放结束)、libvlc_Error
(错误)等。
8. libvlc_media_release
函数原型:
c
void libvlc_media_release(libvlc_media_t* p_md);
作用:
释放媒体对象的资源。
参数:
p_md
: 媒体对象指针。
返回值:
- 无返回值。
9. libvlc_media_player_release
函数原型:
c
void libvlc_media_player_release(libvlc_media_player_t* p_mi);
作用:
释放媒体播放器的资源。
参数:
p_mi
: 媒体播放器指针。
返回值:
- 无返回值。
10. libvlc_release
函数原型:
c
void libvlc_release(libvlc_instance_t* p_instance);
作用:
释放 VLC 实例的资源。
参数:
p_instance
: VLC 实例指针。
返回值:
- 无返回值。
播放代码
cpp
#include <iostream>
// 避免 ssize_t 引发的错误
#if defined(_MSC_VER)
#include <basetsd.h>
typedef SSIZE_T ssize_t;
#endif
#include <vlc/vlc.h>
#include <thread>
using namespace std;
void waitPlaying(libvlc_media_player_t* mp)
{
libvlc_state_t state;
do {
state = libvlc_media_player_get_state(mp);
} while (state != libvlc_Error && state != libvlc_Ended);
}
int main()
{
const char* localMrl = "./a.mp4";
// const char* rtspMrl = "http://ivi.bupt.edu.cn/hls/cctv6hd.m3u8";
libvlc_instance_t* instance = nullptr;
libvlc_media_player_t* player = nullptr;
libvlc_media_t* media = nullptr;
// 创建并初始化 libvlc 实例
instance = libvlc_new(0, nullptr);
if (!instance) {
cerr << "Failed to create VLC instance" << endl;
return -1;
}
libvlc_set_user_agent(instance, "VLC", "VLC");
libvlc_set_log_verbosity(instance, 4); // 设置详细日志级别
// 创建一个媒体
media = libvlc_media_new_path(instance, localMrl);
// media = libvlc_media_new_location(instance, rtspMrl);
if (!media) {
cerr << "Failed to create media from path" << endl;
libvlc_release(instance);
return -1;
}
// 创建一个媒体播放器
player = libvlc_media_player_new_from_media(media);
if (!player) {
cerr << "Failed to create media player" << endl;
libvlc_media_release(media);
libvlc_release(instance);
return -1;
}
if (libvlc_media_player_play(player) != 0) {
cerr << "Failed to play media" << endl;
libvlc_media_player_release(player);
libvlc_media_release(media);
libvlc_release(instance);
return -1;
}
// 等待播放状态
waitPlaying(player);
// 释放 media
libvlc_media_release(media);
// 释放 media player
libvlc_media_player_release(player);
// 释放 libvlc 实例
libvlc_release(instance);
return 0;
}
总结
通过在 Visual Studio 中配置 VLC 播放器,我们能够充分利用 VLC 的强大功能,在我们的应用程序中实现高效的视频播放。这不仅简化了多媒体应用的开发过程,还增强了应用的多功能性和用户体验。希望本文提供的步骤和指导能够帮助您顺利集成 VLC 播放器,并开发出更出色的多媒体应用。无论是在开发新项目还是改进现有项目,这一过程都将为您的应用增添重要的多媒体功能。