配置VS+VLC并播放视频

文章目录

  • 前言
    • 配置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播放视频

基本流程

  1. 初始化 VLC 实例:创建一个 VLC 实例,用于后续的媒体播放操作。
  2. 设置日志和用户代理:配置日志详细级别和用户代理信息,以便调试和标识。
  3. 创建媒体对象:从指定的文件路径创建一个媒体对象,准备播放。
  4. 创建媒体播放器:从媒体对象创建一个媒体播放器,用于控制播放。
  5. 开始播放媒体:调用播放函数开始播放媒体。
  6. 等待播放完成:阻塞程序,直到播放结束或发生错误。
  7. 释放资源:释放媒体播放器、媒体对象和 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 播放器,并开发出更出色的多媒体应用。无论是在开发新项目还是改进现有项目,这一过程都将为您的应用增添重要的多媒体功能。

相关推荐
MetaEnchanter8 小时前
视频章节怎么整理:填好时间点,导出前检查这几处
音视频
小豆庄11 小时前
测试视频里的人脸车牌敏感信息自动化脱敏方案
计算机视觉·目标跟踪·ffmpeg·音视频·边缘计算·视频·敏捷流程
光泽雨12 小时前
WPF 音视频四大核心方案对比
wpf·音视频
揽秀亭长13 小时前
音频转乐谱如何实现?四类AI 扒谱工具的流程
音视频
敢敢のwings1 天前
SimpleMemVLA 深度解读:把原生视频上下文变成机器人的记忆
数码相机·机器人·音视频
ck0135792 天前
视频片段提取与视频修剪的区别:多时间段选择及导出流程
人工智能·音视频·视频
沐飞工具箱2 天前
游戏、漫画、视频里的外语怎么实时翻译?从 OCR + AI 原理聊聊 VoriTrans 屏幕翻译
人工智能·游戏·实时互动·音视频·自动翻译
小豆庄2 天前
监控视频脱敏的追踪漂移与ID撞号陷阱
目标跟踪·ffmpeg·音视频·视频·敏捷流程
原子延迟2 天前
批量压缩视频会变大?HandBrake等3款(2026)
图像处理·人工智能·计算机视觉·音视频
TST-魚爷2 天前
腾讯会议双机位同屏:前后两个摄像头画面合并显示方案(易视讯)
电脑·音视频·腾讯会议·zoom会议