用VLC开发视频播放器/组件(两种方式:libVLC / VLC-Qt)

这篇具有很好参考价值的文章主要介绍了用VLC开发视频播放器/组件(两种方式:libVLC / VLC-Qt)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

测试环境

  • MSVC-2015
  • Qt 5.14.2
  • QCreator

1. libVLC(关键步骤)

参考:心流剑

libVLC 各版本 下载链接

我的下载版本为:3.0.11
vlc开发,Qt,qt,音视频,VLC

  • sdk/lib文件夹目录
    vlc开发,Qt,qt,音视频,VLC
  • qmake vlc 部分的配置(路径根据自己的修改)
  • 只需要: libvlc.lib、libvlccore.lib
#####################  VLC 库 ############################
INCLUDEPATH += $$PWD/../vlc/sdk/include
LIBS += -L$$PWD/../vlc/sdk/lib
LIBS += -llibvlccore
LIBS += -llibvlc

############ 设置输出路径、文件名、加载的链接库 ###############
CONFIG(debug, debug|release){
    DESTDIR =$$PWD/../bin_Debug # 输出目录
    TARGET = XVLCDemod  # 输出文件名
}
else{
    DESTDIR =$$PWD/../bin_Release
    TARGET = XVLCDemo
}
  • 把 plugins 文件夹、libvlc.dll、libvlccore.dll 复制到 bin_Debug / bin_Release
#include <QCoreApplication>

#ifdef _WIN32
#include <basetsd.h>
typedef SSIZE_T ssize_t;
#endif

#include <QDebug>

#include "vlc/vlc.h"

int main(int argc, char *argv[])
{
//    QCoreApplication a(argc, argv);
    libvlc_instance_t     * pInstance = nullptr;
    libvlc_media_player_t * pPlayer = nullptr;
    libvlc_media_t        * pMedia = nullptr;

    libvlc_time_t length;
    int width;
    int height;
    int wait_time = 5000;
    //libvlc_time_t length;
    /* Load the VLC engine */
    pInstance = libvlc_new(0, NULL);
    //Create a new item
    //Method 1:
    //m = libvlc_media_new_location (inst, "file:///F:\\movie\\cuc_ieschool.flv");
    //Screen Capture
    //m = libvlc_media_new_location (inst, "screen://");
    //Method 2:
    // 创建一个流媒体(视频/音频对象)
    pMedia = libvlc_media_new_path(pInstance, "C:\\Users\\YuLei\\Desktop\\ch4.mp4");
    if (!pMedia)
    {
        qDebug() << "libvlc_media_new_path  fail!!!";
        return -1;
    }
    // 创建一个播放窗口(环境),加载流
    pPlayer = libvlc_media_player_new_from_media(pMedia);
    /* No need to keep the media now */
    libvlc_media_release(pMedia);
    // play the media_player
    libvlc_media_player_play(pPlayer);
    //wait until the tracks are created
    _sleep(wait_time);
    length  = libvlc_media_player_get_length(pPlayer);
    width   = libvlc_video_get_width(pPlayer);
    height  = libvlc_video_get_height(pPlayer);
    printf("Stream Duration: %ds\n", length / 1000);
    printf("Resolution: %d x %d\n", width, height);
    //Let it play
    _sleep(length - wait_time);
    // Stop playing
    libvlc_media_player_stop(pPlayer);
    // Free the media_player
    libvlc_media_player_release(pPlayer);
    libvlc_release(pInstance);
    return  0;
//    return a.exec();
}

2. VLC-Qt(关键步骤)

VLC-Qt 下载地址
参考链接1:链接
参考链接2:链接
vlc开发,Qt,qt,音视频,VLC

  • v1.1.1版本仅提供源码
    vlc开发,Qt,qt,音视频,VLC
  • 采用 v1.1.0 版本 链接

vlc开发,Qt,qt,音视频,VLC

  • qmake 配置
#####################  VLC 库 ############################
INCLUDEPATH += $$PWD/../vlc_qt/include
LIBS += -L$$PWD/../vlc_qt/lib
CONFIG(debug, debug|release){
    LIBS += -lVLCQtCored
    LIBS += -lVLCQtWidgetsd
}
else{
    LIBS += -lVLCQtCore
    LIBS += -lVLCQtWidgets
}

############ 设置输出路径、文件名、加载的链接库 ###############
CONFIG(debug, debug|release){
    DESTDIR =$$PWD/../bin_Debug # 输出目录
    TARGET = QVLCDemod  # 输出文件名
}
else{
    DESTDIR =$$PWD/../bin_Release
    TARGET = QVLCDemo
}

抽帧

libVLC

参考链接1
参考链接2文章来源地址https://www.toymoban.com/news/detail-520188.html

/**
 *  mp:媒体播放器
 *  lock:回调以锁定视频内存(不能为 NULL)
 *  unlock:回调以解锁视频内存(如果不需要,则为 NULL)
 *  display:回调以显示视频(如果不需要,则为 NULL)
 *  opaque:这三个回调的私有指针(作为第一个参数)
 */
void libvlc_video_set_callbacks( libvlc_media_player_t *mp,
                                 libvlc_video_lock_cb lock,
                                 libvlc_video_unlock_cb unlock,
                                 libvlc_video_display_cb display,
                                 void *opaque );

// 当需要解码新的视频帧时,就会调用 lock 回调。
typedef void *(*libvlc_video_lock_cb)(void *opaque, void **planes);

// 当视频帧解码完成后,将调用 unlock 回调。
typedef void (*libvlc_video_unlock_cb)(void *opaque, void *picture,
                                       void *const *planes);

// 当视频帧需要显示时,将调用 display 回调。
typedef void (*libvlc_video_display_cb)(void *opaque, void *picture);
#include 
#include 
#include 
#include 
#include 

// 定义输出视频的分辨率
#define VIDEO_WIDTH   640
#define VIDEO_HEIGHT  480

struct Context {
    QMutex mutex;
    uchar *pixels;
};

static void *lock(void *opaque, void **planes)
{
    struct Context *ctx = static_cast(opaque);
    ctx->mutex.lock();

    // 告诉 VLC 将解码的数据放到缓冲区中
    *planes = ctx->pixels;

    return nullptr;
}

// 获取 argb 图片并保存到文件中
static void unlock(void *opaque, void *picture, void *const *planes)
{
    Q_UNUSED(picture);

    struct Context *ctx = static_cast(opaque);
    unsigned char *data = static_cast<unsigned char *>(*planes);
    static int frameCount = 1;

    QImage image(data, VIDEO_WIDTH, VIDEO_HEIGHT, QImage::Format_ARGB32);
    image.save(QString("frame_%1.png").arg(frameCount++));

    ctx->mutex.unlock();
}

static void display(void *opaque, void *picture)
{
    Q_UNUSED(picture);

    (void)opaque;
}

int main()
{
    const char *localMrl = "Sample.mkv";

    struct Context ctx;
    ctx.pixels = new uchar[VIDEO_WIDTH * VIDEO_HEIGHT * 4];
    memset(ctx.pixels, 0, VIDEO_WIDTH * VIDEO_HEIGHT * 4);

    libvlc_instance_t *instance;
    libvlc_media_player_t *player;
    libvlc_media_t *media;

    instance = libvlc_new(0, nullptr);
    media = libvlc_media_new_path(instance, localMrl);
    player = libvlc_media_player_new_from_media(media);

    // 设置回调,用于提取帧或者在界面上显示。
    libvlc_video_set_callbacks(player, lock, unlock, display, &ctx);
    libvlc_video_set_format(player, "RGBA", VIDEO_WIDTH, VIDEO_HEIGHT, VIDEO_WIDTH * 4);

    libvlc_media_player_play(player);

    QThread::sleep(10);

    libvlc_media_release(media);
    libvlc_media_player_release(player);
    libvlc_release(instance);

    return 0;
}

到了这里,关于用VLC开发视频播放器/组件(两种方式:libVLC / VLC-Qt)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 移动端开源播放器对比与选型(ExoPlayer/ijkplayer/VLC/GStreamer/SmarterPlayer)

    ExoPlayer 是 Google 推出的开源播放器,主要是集成了Android 提供的一套解码系统来解析视频和音频,将 MediaCodec 封装地非常完善,并加入了对 DASH 和 HLS 等直播协议的支持,形成了一个性能优越,播放稳定性较好的一个开发播放器。 Github : https://github.com/google/ExoPlayer star fork iss

    2024年02月08日
    浏览(49)
  • 播放器开发(五):视频帧处理并用SDL渲染播放

    VideoOutPut 模块 1、初始化【分配缓存、读取信息】 2、开始线程工作【从队列读帧-缩放-发送渲染信号到窗口】 VideoWidget 自定义Widget类 1、定义内部变量 2、如果使用SDL,需要进行初始化 3、接收到信号后需要执行槽函数进行渲染 分配缓存 执行缩放 创建SDL窗口纹理渲染器 SDL渲

    2024年01月22日
    浏览(47)
  • Unity零基础到进阶 ☀️| 视频播放器 Video Player组件 详解

    🎬 博客主页:

    2024年02月13日
    浏览(52)
  • 【Harmony OS】【ArkUI】ets开发 简易视频播放器

    前言:这一次我们来使用ets 的Swiper 组件、List 组件和Video 组件制作一个简易的视频播放器。本篇是以HarmonyOS 官网的codelab 简易视频播放器(eTS )为基础进行编写。本篇最主要的内容就是一个主界面包括顶部的视频海报轮播,中部的视频播放列表,以及点击海报和播放列表进

    2023年04月27日
    浏览(40)
  • Qt音视频开发41-文件推流(支持网页和播放器播放并切换进度)

    本功能最初也是有一些人提过类似的需求,就是能不能将本地的音视频文件,通过纯Qt程序推流出去,然后用户可以直接在网页上播放,也可以用各种播放器播放,然后还可以任意切换播放进度,其实说白了就是个文件服务器,用户通过网络地址访问以后,告诉对方当前是媒

    2024年02月01日
    浏览(73)
  • vue自定义h5video视频播放器进度条组件,可拖拽、跳转、倍速、全屏

    一个进度条组件控制多个视频的播放、进度调整。视频可点击全屏观看,唯一的进度条是某个指定视频的视频信息。 全屏 点击进度条跳转 拖动滑块 在菜鸟教程上有以下几个参数的详细解说,这张图忘记哪里看的了,如有认领可评论我贴链接 倍速 // 倍速 handleChangeSpeed(item)

    2024年02月12日
    浏览(120)
  • 038-第三代软件开发-简易视频播放器-自定义Slider (二)

    : Qt 、 Qml 、 3 、 4 、 5 欢迎来到我们的 QML C++ 项目!这个项目结合了 QML(Qt Meta-Object Language)和 C++ 的强大功能,旨在开发出色的用户界面和高性能的后端逻辑。 在项目中,我们利用 QML 的声明式语法和可视化设计能力创建出现代化的用户界面。

    2024年02月07日
    浏览(39)
  • opencv+ffmpeg+QOpenGLWidget开发的音视频播放器demo

        本篇文档的demo包含了 1.使用OpenCV对图像进行处理,对图像进行置灰,旋转,抠图,高斯模糊,中值滤波,部分区域清除置黑,背景移除,边缘检测等操作;2.单纯使用opencv播放显示视频;3.使用opencv和openGL播放显示视频;4.在ffmpeg解码后,使用opencv显示视频,并支持对视

    2024年02月12日
    浏览(70)
  • 用Qt开发的ffmpeg流媒体播放器,支持截图、录像,支持音视频播放,支持本地文件播放、网络流播放

    本工程qt用的版本是5.8-32位,ffmpeg用的版本是较新的5.1版本。它支持TCP或UDP方式拉取实时流,实时流我采用的是监控摄像头的RTSP流。音频播放采用的是QAudioOutput,视频经ffmpeg解码并由YUV转RGB后是在QOpenGLWidget下进行渲染显示。本工程的代码有注释,可以通过本博客查看代码或者

    2024年02月03日
    浏览(105)
  • QT软件开发-基于FFMPEG设计视频播放器-软解图像(一)

    QT软件开发-基于FFMPEG设计视频播放器-CPU软解视频(一) https://xiaolong.blog.csdn.net/article/details/126832537 QT软件开发-基于FFMPEG设计视频播放器-GPU硬解视频(二) https://xiaolong.blog.csdn.net/article/details/126833434 QT软件开发-基于FFMPEG设计视频播放器-解码音频(三) https://xiaolong.blog.csdn.

    2023年04月08日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包