【音视频】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的视频源;

cpp 复制代码
#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;
}
相关推荐
Smoothcloud润云2 小时前
Seedance 2.0深度解析:从“抽卡地狱”到工业化视频创作的革命
大数据·人工智能·计算机视觉·语言模型·ai作画·音视频·语音识别
凉拌菜2 小时前
术野摄像机在手术影像系统中的位置与系统架构分析
音视频·医疗视频·4k视频·术野摄像机·手术影像系统·手术头灯摄像
Be for thing2 小时前
Android 音频硬件(Codec / 喇叭 / 麦克风)原理 + 功耗与问题定位实战(手机 / 手表通用)
android·学习·智能手机·音视频
ai产品老杨4 小时前
终结协议孤岛:基于GB28181/RTSP融合网关的多品牌设备统一接入与边缘推流方案
人工智能·docker·架构·kubernetes·音视频
于先生吖6 小时前
JAVA国际版图文短视频交友系统源码:多语言适配,短视频+图文双形态可商用
java·音视频·交友
唯创知音6 小时前
WT2003H4系列:从芯片到模块,音频方案一站式解决
音视频·mp3解码芯片·音频解码芯片·语音播报芯片·wt2003h4
AF_INET66 小时前
RV1126B开发板学习篇(一)MPP的编译和基础使用
经验分享·音视频·嵌入式·视频编解码·rv1126·mpp编解码·rockchipmpp
嵌入式Linux,8 小时前
逻辑分析仪dump音频实锤排查问题
音视频
NGBQ121388 小时前
Camtasia 2026.0.7.dmg 全解析:Mac 端专业视频编辑工具深度指南
macos·音视频
阿甘编程点滴9 小时前
2026年,我找到了以下8款支持视频变声的配音软件
音视频