配置VS+VLC并播放视频

news2024/11/13 11:01:37

文章目录

  • 前言
    • 配置VS+VLC
    • VLC播放视频
      • 基本流程
      • 1. `libvlc_new`
      • 2. `libvlc_set_user_agent`
      • 3. `libvlc_set_log_verbosity`
      • 4. `libvlc_media_new_path`
      • 5. `libvlc_media_player_new_from_media`
      • 6. `libvlc_media_player_play`
      • 7. `libvlc_media_player_get_state`
      • 8. `libvlc_media_release`
      • 9. `libvlc_media_player_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

函数原型:

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

函数原型:

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

函数原型:

void libvlc_set_log_verbosity(libvlc_instance_t* p_instance, int level);

作用:
设置 VLC 实例的日志详细级别。这影响到日志信息的详细程度。

参数:

  • p_instance: VLC 实例指针。
  • level: 日志详细级别(从 054 表示详细日志)。

返回值:

  • 无返回值。

4. libvlc_media_new_path

函数原型:

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

函数原型:

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

函数原型:

int libvlc_media_player_play(libvlc_media_player_t* p_mi);

作用:
开始播放媒体。

参数:

  • p_mi: 媒体播放器指针。

返回值:

  • 返回 0 表示成功,返回其他值表示失败。

7. libvlc_media_player_get_state

函数原型:

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

函数原型:

void libvlc_media_release(libvlc_media_t* p_md);

作用:
释放媒体对象的资源。

参数:

  • p_md: 媒体对象指针。

返回值:

  • 无返回值。

9. libvlc_media_player_release

函数原型:

void libvlc_media_player_release(libvlc_media_player_t* p_mi);

作用:
释放媒体播放器的资源。

参数:

  • p_mi: 媒体播放器指针。

返回值:

  • 无返回值。

10. libvlc_release

函数原型:

void libvlc_release(libvlc_instance_t* p_instance);

作用:
释放 VLC 实例的资源。

参数:

  • p_instance: VLC 实例指针。

返回值:

  • 无返回值。

播放代码

#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 播放器,并开发出更出色的多媒体应用。无论是在开发新项目还是改进现有项目,这一过程都将为您的应用增添重要的多媒体功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1940609.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用9种方法隐藏和显示元素

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>使用9种方法隐藏和显示元素</title><sty…

Bash 学习摘录

文章目录 1、变量和参数的介绍&#xff08;1&#xff09;变量替换$(...) &#xff08;2&#xff09;特殊的变量类型export位置参数shift 2、引用&#xff08;1&#xff09;引用变量&#xff08;2&#xff09;转义 3、条件判断&#xff08;1&#xff09;条件测试结构&#xff08…

数据结构——栈(顺序结构)

一、栈的定义 栈是一种数据结构&#xff0c;它是一种只能在一端进行插入和删除操作的特殊线性表。这一端被称为栈顶&#xff0c;另一端被称为栈底。栈按照后进先出&#xff08;LIFO&#xff09;的原则进行操作&#xff08;类似与手枪装弹后射出子弹的顺序&#xff09;。在计算…

docker 打包orbbec

docker pull humble容器 sudo docker run -it osrf/ros:humble-desktop docker 启动容器 sudo docker run -u root --device/dev/bus/usb:/dev/bus/usb -it -v /home/wl:/share --name wl4 osrf/ros:humble-desktop /bin/bash新开一个终端 查看本地存在的容器&#xff1a;…

【Git】(基础篇六)—— 发现好项目

发现github上的好项目 在开源社区中&#xff0c;发现好的项目&#xff0c;不论是对于自己的学习&#xff0c;还是在前人的基础上继续改进&#xff0c;都十分重要&#xff0c;本文为你介绍如何在github上面找到好的项目&#xff08;gitee同理&#xff09; 关注活跃大牛 GitHu…

Spring的IoC与DI介绍

Spring基础 Spring Framework系统架构 Spring Framework是Spring生态圈中最基础的项目,是其它项目的根基。 IoC(Inversion ofControl)控制反转 使用对象时,由主动new产生对象转换为由外部提供给对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。Sprin…

Flutter 插件之 easy_refresh(下拉刷新、上拉加载)

今天给大家较少一下日常开发中最常见的一个功能,就是 下拉刷新、上拉加载,这个在我们使用分页功能是最常见的。 此前我我也写了一篇关于 下拉刷新、上拉加载。 Flutter 下拉刷新、上拉加载flutter_easyrefresh的使用https://blog.csdn.net/WangQingLei0307/article/details/…

【AI大模型】生成式AI的未来——CHAT还是AGENT?

【AI大模型】CHAt还是AGENt&#xff1f; 最近&#xff0c;许多人工智能公司或者部门都在针对Agent——人工智能体有所动作。 例如&#xff1a; 文心一言智能体 Gnomic智能体 英伟达视觉AI代理 那么人工智能概念中的智能体Agent到底是什么呢&#xff1f;它又为何会突然在人工智…

Linux存储管理-逻辑卷管理(LVM)

逻辑卷管理&#xff08;LVM&#xff09;流程 物理磁盘/分区 -> 物理卷&#xff08;PV&#xff09;-> 加入卷组&#xff08;VG&#xff09;-> 卷组调配空间&#xff0c;制作逻辑卷&#xff08;LV&#xff09;-> 格式化 -> 挂载 -> 使用 为什么需要逻辑卷管理…

昇思25天学习打卡营第19天|MindNLP ChatGLM-6B StreamChat

文章目录 昇思MindSpore应用实践ChatGML-6B简介基于MindNLP的ChatGLM-6B StreamChat Reference 昇思MindSpore应用实践 本系列文章主要用于记录昇思25天学习打卡营的学习心得。 ChatGML-6B简介 ChatGLM-6B 是由清华大学和智谱AI联合研发的产品&#xff0c;是一个开源的、支持…

分享 2 个 .NET EF 6 只更新某些字段的方法

前言 EF 更新数据时&#xff0c;通常情况下&#xff0c;是更新全部字段的&#xff0c;但实际业务中&#xff0c;更新全部字段的情况其实很少&#xff0c;一般都是修改其中某些字段&#xff0c;所以为了实现这个目标&#xff0c;很多程序员通常会这样作&#xff1a; 先从数据库…

web服务器测试

[rootlocalhost ~]# vim /etc/nginx/conf.d/test_ test_ip.conf test_name.conf test_virtualdir.conf [rootlocalhost ~]# vim /etc/nginx/conf.d/test_name.conf [rootlocalhost ~]# tree /www/

controller层-请求格式为json-请求方法为get

前置条件 get请求映射&#xff0c;内容和PostMapping一致&#xff0c;需要请求参数更换为get数据 请求过程&#xff1a;用户请求--初始化DispatcherServlet及对接和分发用户请求--controller--service 用户请求&#xff1a;http://ip:port/user/getinfo 请求方法&#xff1a;ge…

有关于链表带环的两道OJ题目

目录 1.判断链表是否带环 1.1快指针的速度为慢指针的2倍 1.2快指针的速度为慢指针的3倍 2.找出带环链表开始入环的第一个节点 2.1将快慢指针相遇的节点与后面分开&#xff0c;构造交叉链表 2.2记录快慢指针相遇节点&#xff0c;与头结点一起向后走&#xff0c;相遇点为入…

笔记:现代卷积神经网络之VGG

本文为李沐老师《动手学深度学习》笔记小结&#xff0c;用于个人复习并记录学习历程&#xff0c;适用于初学者 神经网络架构设计的模块化 然AlexNet证明深层神经网络卓有成效&#xff0c;但它没有提供一个通用的模板来指导后续的研究人员设计新的网络。 在下面的几个章节中&a…

C语言-栈和队列

文章目录 &#x1f3af;引言&#x1f453;栈和队列1.栈1.1栈的概念与结构1.2栈的实现 2.队列2.1队列的概念与结构2.2队列的实现 &#x1f947;结语 &#x1f3af;引言 欢迎来到HanLop博客的C语言数据结构初阶系列。在之前的文章中&#xff0c;我们详细介绍了链表及其操作方法。…

LabVIEW多线圈电磁式振动发电机测试

开发了一种基于LabVIEW设计的多线圈电磁式振动发电机测试系统。系统通过高效的数据采集、波峰检测及相位差计算&#xff0c;优化了传统振动发电机的测试流程&#xff0c;提升了电压波形分析的精度和效率&#xff0c;具有较好的应用前景和推广价值。 项目背景 随着可再生能源技…

【python】Numpy运行报错详细分析:IndexError: too many indices for array

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Hadoop-37 HBase集群 JavaAPI 操作3台云服务器 POM 实现增删改查调用操作 列族信息 扫描全表

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; HadoopHDFSMapReduceHiveFlumeSqoopZookeeperHBase 正在 章节内容 上一节我们完成了&#xff1a; HBase …

docker tomcat 404

HTTP 404状态码表示“Not Found”&#xff0c;即服务器无法找到请求的页面。 当用户尝试访问一个不存在的网页时&#xff0c;服务器会返回这个状态码。这个状态码是HTTP协议的一部分&#xff0c;用于告知客户端&#xff08;通常是浏览器&#xff09;服务器无法完成请求。404状…