【音视频】VLC播放器

news2025/4/26 2:53:34

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


一、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;

    // 将音量设置为 10
    libvlc_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.coloradmin.cn/o/2309123.html

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

相关文章

【软件测试】_使用selenium进行自动化测试示例

目录 1. 导入依赖 2. 使用selenium编写测试代码 3. 运行结果 4. 关于浏览器驱动管理及浏览器驱动配置 创建一个空项目用于进行selenium的自动化测试。 1. 导入依赖 <dependencies><!-- https://mvnrepository.com/artifact/io.github.bonigarcia/webdrivermanager…

【清华大学】DeepSeek从入门到精通完整版pdf下载

DeepSeek从入门到精通.pdf 一共104页完整版 下载链接: https://pan.baidu.com/s/1-gnkTTD7EF2i_EKS5sx4vg?pwd1234 提取码: 1234 或 链接&#xff1a;https://pan.quark.cn/s/79118f5ab0fd 一、DeepSeek 概述 背景与定位 DeepSeek 的研发背景 核心功能与技术特点&#xff08…

题解 | 牛客周赛83 Java ABCDEF

目录 题目地址 做题情况 A 题 B 题 C 题 D 题 E 题 F 题 牛客竞赛主页 题目地址 牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ 做题情况 A 题 输出两个不是同一方位的字符中的任意一个就行 import java.io.*; import java.math.*; import java…

C语言(16)---------->二维数组

在学习二维数组之前&#xff0c;掌握一维数组是非常重要的。 对于一维数组的学习&#xff0c;读者可以参考我写过的博客&#xff1a; C语言&#xff08;15&#xff09;--------------&#xff1e;一维数组-CSDN博客 这里面由浅入深地介绍了C语言中一维数组的使用。 一、二维…

【计算机网络基础】-------计算机网络概念

1.什么是计算机网络 定义&#xff1a; 图解&#xff1a; 2.最简单的计算机网络 其中&#xff1a; 结点可以是计算机、集线器、交换机、路由器等链路可以是有线链路、无线链路 2.1集线器 2.2交换机 3.互连网&#xff08;internet&#xff09;与 路由器 路由器 与 家用路由…

C++实现3D(EasyX)详细教程

一、关于3D 我们看见&#xff0c;这两个三角形是相似的&#xff0c;因此计算很简单 若相对物体的方向是斜的&#xff0c;计算三角函数即可 不会的看代码 二、EasyX简介 initgraph(长,宽) 打开绘图 或initgraph(长,宽…

Centos7部署k8s(单master节点安装)

单master节点部署k8s集群(Centos) 一、安装前准备 1、修改主机名 按照资源准备修改即可 # master01 hostnamectl set-hostname master01 ; bash # node1 hostnamectl set-hostname node1 ; bash # node2 hostnamectl set-hostname node2 ; bash2、修改hosts文件 以下命令所…

【C】链式二叉树算法题1 -- 单值二叉树

leetcode链接https://leetcode.cn/problems/univalued-binary-tree/description/ 1 题目描述 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时&#xff0c;才返回 true&#xff1b;否则返回 false。 示例 1&#xff1…

word转换为pdf后图片失真解决办法、高质量PDF转换方法

1、安装Adobe Acrobat Pro DC 自行安装 2、配置Acrobat PDFMaker &#xff08;1&#xff09;点击word选项卡上的Acrobat插件&#xff0c;&#xff08;2&#xff09;点击“首选项”按钮&#xff0c;&#xff08;3&#xff09;点击“高级配置”按钮&#xff08;4&#xff09;点…

蓝桥杯 灯笼大乱斗【算法赛】

问题描述 元宵佳节&#xff0c;一场别开生面的灯笼大赛热闹非凡。NN 位技艺精湛的灯笼师依次落座&#xff0c;每位师傅都有相应的资历值&#xff0c;其中第 ii 位师傅的资历值为 AiAi​。从左到右&#xff0c;师傅们的资历值逐级递增&#xff08;即 A1<A2<⋯<ANA1​&l…

【多模态大模型学习】位置编码的学习记录

【多模态大模型学习】位置编码的学习记录 0.前言1. sinusoidal编码1.0 数学知识——复数1.0.1 复数乘法、共轭复数1.0.2 复数的指数表示 1.1 sinusoidal编码来历1.2 代码实现 2. Rotary Positional Embedding (RoPE) ——旋转位置编码2.1 RoPE来历2.2 代码实现2.2.1 GPT-J风格的…

vector 面试点总结

ps&#xff1a;部分内容使用“AI”查询 一、入门 1、什么是vector 动态数组容器&#xff0c;支持自动扩容、随机访问和连续内存存储。 2、怎么创建-初始化vector std::vector<int> v; // 创建空vectorstd::vector<int> v {1, 2, 3}; // 直接初始化std::vec…

正式页面开发-登录注册页面

整体路由设计&#xff1a; 登录和注册的切换是切换组件或者是切换内容&#xff08;v-if和 v-else)&#xff0c;因为点击两个之间路径是没有变化的。也就是登录和注册共用同一个路由。登录是独立的一级路由。登录之后进到首页&#xff0c;有三个大模块&#xff1a;文章分类&…

Spring项目-抽奖系统(实操项目-用户管理接口)(END)

^__^ (oo)\______ (__)\ )\/\ ||----w | || || 一&#xff1a;前言&#xff1a; 活动创建及展示博客链接&#xff1a;Spring项目-抽奖系统(实操项目-用户管理接口)(THREE)-CSDN博客 上一次完成了活动的创建和活动的展示&#xff0c;接下来就是重头戏—…

Kafka面试题及原理

1. 消息可靠性&#xff08;不丢失&#xff09; 使用Kafka在消息的收发过程都会出现消息丢失&#xff0c;Kafka分别给出了解决方案 生产者发送消息到Brocker丢失消息在Brocker中存储丢失消费者从Brocker 幂等方案&#xff1a;【分布式锁、数据库锁&#xff08;悲观锁、乐观锁…

CSS—text文本、font字体、列表list、表格table、表单input、下拉菜单select

目录 1.文本 2.字体 3.列表list a.无序列表 b.有序列表 c.定义列表 4.表格table a.内容 b.合并单元格 3.表单input a.input标签 b.单选框 c.上传文件 4.下拉菜单 1.文本 属性描述color设置文本颜色。direction指定文本的方向 / 书写方向。letter-spacing设置字符…

水果识别系统 | BP神经网络水果识别系统,含GUI界面(Matlab)

使用说明 代码下载&#xff1a;BP神经网络水果识别系统&#xff0c;含GUI界面&#xff08;Matlab&#xff09; BP神经网络水果识别系统 一、引言 1.1、研究背景及意义 在当今科技迅速发展的背景下&#xff0c;人工智能技术尤其是在图像识别领域的应用日益广泛。水果识别作为…

40岁开始学Java:Java中单例模式(Singleton Pattern),适用场景有哪些?

在Java中&#xff0c;单例模式&#xff08;Singleton Pattern&#xff09;用于确保一个类只有一个实例&#xff0c;并提供全局访问点。以下是详细的实现方式、适用场景及注意事项&#xff1a; 一、单例模式的实现方式 1. 饿汉式&#xff08;Eager Initialization&#xff09; …

李宏毅机器学习课程学习笔记04 | 浅谈机器学习-宝可梦、数码宝贝分类器

文章目录 案例&#xff1a;宝可梦、数码宝贝分类器第一步&#xff1a;需要定义一个含有未知数的function第二步&#xff1a;loss of a function如何Sample Training Examples > 如何抽样可以得到一个较好的结果如何权衡模型的复杂程度 Tradeoff of Model Complexity todo 这…

Redis详解(实战 + 面试)

目录 Redis 是单线程的&#xff01;为什么 Redis-Key(操作redis的key命令) String 扩展字符串操作命令 数字增长命令 字符串范围range命令 设置过期时间命令 批量设置值 string设置对象,但最好使用hash来存储对象 组合命令getset,先get然后在set Hash hash命令: h…