【音视频】VLC播放器

embedded/2025/3/5 2:14:51/

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、vlc是什么?

        VLC Media Player(简称VLC)是一款免费、开源、跨平台的多媒体播放器,由非营利组织VideoLAN开发,最初是法国巴黎中央理工学院学生的项目,现由全球志愿者维护。其核心特点包括支持几乎所有音视频格式、无广告、低资源占用以及强大的扩展功能,被誉为“万能播放器”;

        VLC 有一个理念 一切都是流的播放;

特点:

  1. 格式支持广泛:支持超过 200种 音视频格式,包括MP4、AVI、MKV、FLAC、MP3等,甚至能播放未下载完成的文件或加密DVD ;
  2. 跨平台与轻量化:支持 Windows、macOS、Linux、Android、iOS 等主流系统;
  3. 解码能力:集成FFmpeg解码器和libdvdcss库,直接解码加密内容,无需额外插件;
  4. 媒体服务器:可作为unicast/multicast服务器,支持IPv4/IPv6网络流分发;

二、使用步骤

1.安装

  1. 首先需要在 VLC 的 github 官网获取源码 ;VLC 的下载地址:https://github.com/videolan/vlc
  2. 或者本文章提供了一套已经弄好的开发环境 (压缩包); 将其解压到需要使用这个库的项目中即可(文章最上面资源绑定);

有了库、头文件和动态库之后,按照下面设置在visual studio使用该库步骤:

  1. 头文件配置

  2. 库文件配置 库的目录的设置:连接器→常规→附加库目录→追加 lib 文件夹

  3. 至此,该库就可以进行使用

  4. 注意,后续要将生成结果打包为安装包的时候; Plugins 文件夹和其中的内容、dll 文件,都需要一起打包走 否则可执行程序将无法正常工作

  5. libVLC 使用的 UTF-8 编码,所以如果参数中有中文 需要进行转码才能起效

2.demo

实现一个命令行的播放器,媒体是本地或者url的视频源;

#include <Windows.h>
#include <iostream>
#include "vlc.h"
#include <conio.h>// 将 Unicode 字符串转换为 UTF-8 编码 因为 libVLC 通常使用 UTF-8 编码来处理文件路径或 URL
//如果路径有中文,无法创建正常的media
std::string Unicode2Utf8(const std::wstring& strIn)
{//多字节std::string str;// 获取转换成 UTF-8 所需的缓冲区大小int length = ::WideCharToMultiByte(CP_UTF8, 0, strIn.c_str(), strIn.size(), NULL, 0, NULL, NULL);str.resize(length + 1);// 将 Unicode 转换为 UTF-8::WideCharToMultiByte(CP_UTF8, 0, strIn.c_str(), strIn.size(), (LPSTR)str.c_str(), length, NULL, NULL);return str;
}int main()
{// 初始化 VLC 的参数int argc = 1;char* argv[2];argv[0] = (char*)"--ignore-config"; // 忽略 VLC 默认配置// 1、创建 VLC 实例libvlc_instance_t* vlc_ins = libvlc_new(argc, argv);if (!vlc_ins) {std::cout << "创建 VLC 实例失败!" << std::endl;return -1;}// 将文件路径转换为 UTF-8 格式(确保 VLC 正确处理)std::string path = Unicode2Utf8(L"file:///E:/study_project/VideoPlay/VideoPlay/美女.mp4");//反斜杠\是转义字符 \\ 表示反斜杠本身// 2、使用文件路径创建媒体对象(URL 格式)libvlc_media_t* media = libvlc_media_new_location(vlc_ins, path.c_str());if (!media) {std::cout << "加载媒体失败!" << std::endl;libvlc_release(vlc_ins);return -1;}// 3、使用媒体对象创建媒体播放器libvlc_media_player_t* player = libvlc_media_player_new_from_media(media);if (!player) {std::cout << "创建媒体播放器失败!" << std::endl;libvlc_media_release(media);libvlc_release(vlc_ins);return -1;}// 4、启动媒体播放int ret = libvlc_media_player_play(player);if (ret == -1) {std::cout << "启动播放失败!" << std::endl;libvlc_media_player_release(player);libvlc_media_release(media);libvlc_release(vlc_ins);return -1;}Sleep(300);//只有media加载完成,才会有下面的参数// 等待媒体加载完成,直到能够访问音量信息int vol = -1;while (vol == -1) {Sleep(10); // 每隔 10 毫秒检查一次vol = libvlc_audio_get_volume(player); // 获取当前音量}std::cout << "当前音量: " << vol << std::endl;// 将音量设置为 10libvlc_audio_set_volume(player, 10);// 获取并显示媒体总时长libvlc_time_t tm = libvlc_media_player_get_length(player);std::cout << "媒体时长: " << int(tm / 3600000) << ":" << int(tm / 60000) % 60 << ":" << int(tm / 1000) % 60 << "." << int(tm) % 1000 << std::endl;// 获取并显示视频的宽度和高度int width = libvlc_video_get_width(player);int height = libvlc_video_get_height(player);std::cout << "视频分辨率: " << width << "x" << height << std::endl;// 显示播放进度(百分比)while (!_kbhit()) { // 等待用户按键退出std::cout << "播放进度: " << 100.0 * libvlc_media_player_get_position(player) << "%" << "\r";Sleep(500); // 每 500 毫秒更新一次}// 当用户按下键盘时暂停播放getchar(); // 等待用户输入libvlc_media_player_pause(player); // 暂停播放getchar(); // 等待用户输入恢复播放libvlc_media_player_play(player); // 恢复播放getchar(); // 等待用户输入停止播放libvlc_media_player_stop(player); // 停止播放// 释放资源libvlc_media_player_release(player);libvlc_media_release(media);libvlc_release(vlc_ins);return 0;
}


http://www.ppmy.cn/embedded/169707.html

相关文章

使用watch监听route对象的变化

我们在vue项目中&#xff0c;有时候需要监听路由的变化&#xff0c;来做出一些操作&#xff0c;下面就是一些案例。 1、监听路由对象中的meta.title属性&#xff0c;来渲染tabs标签的高亮状态。 情况说明&#xff1a;①我们在Aside.vue中&#xff0c;有一个菜单组件&#xff0c…

类和对象(6)——Object类、内部类

目录 1. Object类 1.1 什么是Object类&#xff1f; 1.2 Object中的常用成员方法 1. toString方法 2. equals方法 3. hashCode方法 1.3 Object类与常见接口 1. Cloneable接口 #. clone方法 #. 浅拷贝与深拷贝 2. 比较接口 #. Comparable接口 #. Comparator接口 #.…

Java8面试

Java 8 有哪些新特性? &#x1f40e;Java 8五大神装特性&#x1f40e; Lambda表达式&#xff08;魔法调料&#xff09; 曼波觉得像速食魔法咒语&#xff01;(๑✧◡✧๑) // 传统写法&#xff08;像冗长菜谱&#xff09; new Thread(new Runnable() {public void run() {Syst…

Qt:窗口

目录 菜单栏 QMenuBar 菜单添加快捷键 添加子菜单 添加分割线和添加图标 QMenuBar创建方式 工具栏 QToolBar 和菜单栏搭配 创建多个工具栏 状态栏 QStatusBar 状态栏中添加其他控件 浮动窗口 QDockWidget 对话框 对话框的内存释放问题 自定义对话框界面 模态对话…

QT异步编程之QtConcurrent

一、概述 1、QtConcurrent模块提供了一组便捷的函数&#xff0c;用于在不显示创建和管理线程的情况下实现并发编程。 2、它通过将任务提交给线程池来执行&#xff0c;从而避免了频繁创建和销毁线程带来的性能开销。 3、QtConcurrent非常适合处理需要并行执行的批量任务&…

Java 泛型(Generics)详解与使用

一、什么是 Java 泛型&#xff1f; 泛型&#xff08;Generics&#xff09;是 Java 1.5 引入的一项重要特性&#xff0c;主要用于 类型参数化&#xff0c;允许在类、接口和方法定义时使用 类型参数&#xff08;Type Parameter&#xff09;&#xff0c;从而提高代码的复用性、类…

java2025热点面试题之springmvc

1. 请解释Spring MVC的工作原理。 答案&#xff1a; Spring MVC是一个基于Java的MVC框架&#xff0c;用于构建Web应用程序。其工作原理如下&#xff1a; 客户端发送请求到DispatcherServlet&#xff0c;它是Spring MVC的前端控制器。DispatcherServlet查询HandlerMapping&…

Spock框架:让单元测试更优雅的高效武器

&#x1f4d6; 前言&#xff1a;为什么选择Spock&#xff1f; 在软件开发领域&#xff0c;单元测试是保证代码质量的基石。但传统的JUnit/TestNG测试框架在面对复杂测试场景时&#xff0c;往往会显得力不从心。Spock框架作为新一代测试框架的佼佼者&#xff0c;以其独特的BDD&…