【音视频】VLC播放器

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


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue2+ele-ui实践

前言&#xff1a;真理先于实践&#xff0c;实践发现真理&#xff0c;再实践检验真理 环境&#xff1a;vue2 & element-ui 正片&#xff1a; Select 选择器 简称 下拉框 下拉框完整的使用循环 下拉框 → 点击下拉框 → 展示数据 → 选择数据 → 下拉框显示数据 核心具有…

刷题日记——部分二分算法题目分享

前言 咱们紧跟上一期结合时间复杂度浅谈二分法的好处, 并分享部分二分题目(将持续更新题目,绝对值你一个收藏)-CSDN博客 笔者接着分享一些刷过的关于二分算法的题目. 第一题 1283. 使结果不超过阈值的最小除数 - 力扣&#xff08;LeetCode&#xff09; 这道题就是典型的二…

excel 斜向拆分单元格

右键-合并单元格 右键-设置单元格格式-边框 在设置好分割线后&#xff0c;你可以开始输入文字。 需要注意的是&#xff0c;文字并不会自动分成上下两行。 为了达到你期望的效果&#xff0c;你可以通过 同过左对齐、上对齐 空格键或使用【AltEnter】组合键来调整单元格中内容的…

关于常规模式下运行VScode无法正确执行“pwsh”问题

前言&#xff1a; pwsh在系统环境中正确配置&#xff0c;且可以运行在cmd&#xff0c; powshell&#xff08;5.1&#xff09;--- 都需要在管理员权限下运行 &#xff08;打开setting&#xff09; 打开setting.json &#xff08;在vscode中添加 powershell 7 路径&…

企微审批中MySQL字段TEXT类型被截断的排查与修复实践

在MySQL中&#xff0c;TEXT类型字段常用于存储较大的文本数据&#xff0c;但在一些应用场景中&#xff0c;当文本内容较大时&#xff0c;TEXT类型字段可能无法满足需求&#xff0c;导致数据截断或插入失败。为了避免这种问题&#xff0c;了解不同文本类型&#xff08;如TEXT、M…

异常 PipeMapRed.waitOutputThreads(): subprocess failed with code 127

直接放问题异常 hadoop jar /opt/module/hadoop-3.3.2/share/hadoop/tools/lib/hadoop-streaming-3.3.2.jar \ -D mapreduce.map.memory.mb100 \ -D mapreduce.reduce.memory.mb100 \ -D mapred.map.tasks1 \ -D stream.num.map.output.key.fields2 \ -D num.key.fields.for.pa…

Focal Loss (聚焦损失) :解决类别不平衡与难易样本的利器,让模型学会“重点学习”

1. 为什么需要Focal Loss&#xff1f; 2. 交叉熵损失的问题 3.Focal Loss的智慧&#xff1a;给不同的错误“区别对待” 4.代码演示 1. 为什么需要Focal Loss&#xff1f; 在机器学习和深度学习中&#xff0c;类别不平衡&#xff08;Class Imbalance&#xff09; 是一个普遍…

算法系列之数据结构-二叉树

在计算机科学中&#xff0c;数据结构是组织和存储数据的方式&#xff0c;以便能够高效地访问和修改数据。树&#xff08;Tree&#xff09;是一种非常重要的非线性数据结构&#xff0c;广泛应用于各种算法和应用中。本文将详细介绍树的基本概念、常见类型以及用Java实现树的遍历…

进来了解一下python的深浅拷贝

深浅拷贝是什么&#xff1a;在Python中&#xff0c;理解深拷贝&#xff08;deep copy&#xff09;和浅拷贝&#xff08;shallow copy&#xff09;对于处理复杂的数据结构&#xff0c;如列表、字典或自定义对象&#xff0c;是非常重要的。这两种拷贝方式决定了数据在内存中的复制…

磁盘空间不足|如何安全清理以释放磁盘空间(开源+节流)

背景&#xff1a; 最近往数据库里存的东西有点多&#xff0c;磁盘不够用 查看磁盘使用情况 df -h /dev/sda5&#xff08;根目录 /&#xff09; 已使用 92% 咱们来开源节流 目录 背景&#xff1a; 一、开源 二、节流 1.查找 大于 500MB 的文件&#xff1a; 1. Snap 缓存…

vue3学习-2(深入组件)

vue3学习-2&#xff08;深入组件&#xff09; 1.开始2.基础3.深入组件注册全局注册局部注册组件名格式 PropsProps 声明响应式 Props 解构 3.5将解构的 props 传递到函数中单向数据流更改对象 / 数组类型的 propsProp 校验 事件触发与监听事件事件参数声明触发的事件事件校验 组…

Java 入门 (超级详细)

一、什么是Java Java是一种高级编程语言&#xff0c;由Sun Microsystems公司于1995年推出。Java具有跨平台性、面向对象、健壮性、安全性、可移植性等特点&#xff0c;被广泛应用于企业级应用开发、移动应用开发、大数据处理、云计算等领域。Java程序可以在不同的操作系统上运…

23种设计模式之工厂方法模式(Factory Method Pattern)【设计模式】

文章目录 一、工厂方法模式简介二、关键点三、代码示例3.1 定义抽象产品3.2 实现具体产品3.3 创建抽象工厂3.4 实现具体工厂3.5 客户端代码 四、解释五、优缺点5.1 优点5.2 缺点 六、适用场景 一、工厂方法模式简介 工厂方法模式&#xff08;Factory Method Pattern&#xff0…

io学习----->标准io

思维导图&#xff1a; 一.io的作用 io是实现对文件的操作&#xff0c;把运行结果存到文件中&#xff0c;读取文件的数据&#xff0c;方便后期查询。 二.io的概念 io是指系统 和外部设备或用户之间的数据交互 I:input 表示数据从外部设备输入到内存中&#xff1b; O:output…

从 R1 到 Sonnet 3.7,Reasoning Model 首轮竞赛中有哪些关键信号?

DeepSeek R1 催化了 reasoning model 的竞争&#xff1a;在过去的一个月里&#xff0c;头部 AI labs 已经发布了三个 SOTA reasoning models&#xff1a;OpenAI 的 o3-mini 和deep research&#xff0c; xAI 的 Grok 3 和 Anthropic 的 Claude 3.7 Sonnet。随着头部 Al labs 先…

FPGA开发,使用Deepseek V3还是R1(7):以“FPGA的整体设计框架”为例

以下都是Deepseek生成的答案 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;1&#xff09;&#xff1a;应用场景 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;2&#xff09;&#xff1a;V3和R1的区别 FPGA开发&#xff0c;使用Deepseek V3还是R1&#x…

正大杯攻略|非量表题数据分析基本步骤

在各类研究和调查场景中&#xff0c;非量表类问卷作为数据收集的重要工具&#xff0c;其分析方法涵盖多个关键环节&#xff0c;对于精准解读数据、提炼有价值的结论起着决定性作用。下面详细介绍非量表类问卷的分析方法。 一、样本背景分析 样本背景分析借助描述性统计方法&am…

SuperMap iClient3D for WebGL三维场景与二维地图联动

作者&#xff1a;Lzzzz 在城市规划&#xff0c;应急救援&#xff0c;旅游规划等项目场景中&#xff0c;普遍存在通过二维地图定位区域或路线&#xff0c;三维场景展示布局细节的情况&#xff0c;那么&#xff0c;如何使三维场景与二维地图联动起来呢&#xff0c;一起来看看如何…

3dsmax烘焙光照贴图然后在unity中使用

效果预览 看不清[完蛋&#xff01;] 实现步骤 使用 软件 软体名称地址photoshophttps://www.adobe.com/products/photoshop.htmlunity3Dhttps://unity.com/3dsmaxhttps://www.autodesk.com.cn/products/3ds-max/free-trialpacker-iohttps://www.uv-packer.com/HDR 贴图地址…

ThinkPHP使用phpword读取模板word文件并添加表格

1.安装phpword包composer require phpoffice/phpword 2.模板文件结构 如上图框住的是要替换的文本和要复制表格样式 实现代码 <?phpnamespace app\api\logic;use PhpOffice\PhpWord\Element\Table; use PhpOffice\PhpWord\SimpleType\TblWidth; use PhpOffice\PhpWord\…