Используйте libvlc для создания видеоплеера
Используйте libvlc для создания видеоплеера

1. Введение в libvlc

VLC — это проигрыватель, о котором практически все (если речь идет о разработке программного обеспечения) слышали и использовали. Я не буду вдаваться в подробности о его мощных функциях. Веб-сайт медиаплеера VLC: https://www.videolan.org/

Исходный код libvlc и адрес загрузки файла библиотеки: http://ftp.heanet.ie/pub/videolan/vlc/

Вот сводка адресов загрузки для всех версий libvlc.

Если вы хотите разработать собственный видеоплеер, первая библиотека, которая приходит на ум, — это ffmpeg. Если вы хотите сразу начать работу, не разбираясь в нижнем уровне аудио и видео, и быстро разработать плеер, то прямой вызов libvlc — это очень хорошо. выбор.

Если вы примете метод встраивания окон, вы сможете разработать обычный видеоплеер с небольшим количеством кода. И libvlc также поддерживает кросс-платформенность. Основные платформы официально предоставляют файлы библиотек и исходный код. Встроенные платформы могут кросс-компилировать себя.

Далее будет представлено использование QT в качестве интерфейса пользовательского интерфейса и вызов libvlc для завершения разработки простого видеоплеера с использованием встроенного метода окна. Используемая версия VLC является последней на момент публикации.

2. Реализуйте код

2.1 widget.cpp
Язык кода:javascript
копировать
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //Создаем и инициализируем экземпляр libvlc
    vlc_base=libvlc_new(0,nullptr);

    this->setWindowTitle("libvlcразработанныйвидеоплеер");
}


Widget::~Widget()
{
    delete ui;
}

//выбираем видео
void Widget::on_pushButton_open_clicked()
{
    /*Выбрать файл*/
    QString filename=QFileDialog::getOpenFileName(this,"Выберите файл для открытия","D:/",tr("*.*"));

    std::replace(filename.begin(), filename.end(), QChar('/'), QChar('\\'));
    qDebug()<<"медиа воспроизводилось:"<<filename;

    /*Создать носитель для определенного пути к файлу*/
    if(vlc_media)libvlc_media_release(vlc_media);
    vlc_media=libvlc_media_new_path(vlc_base,filename.toUtf8().data());
    if(vlc_media==nullptr)
    {
        qDebug()<<"libvlc_media_new_path Ошибка выполнения.";
        return;
    }

    /*Создаем объект проигрывателя на основе заданного медиа-объекта*/
    if(vlc_mediaPlayer)libvlc_media_player_release(vlc_mediaPlayer);
    vlc_mediaPlayer=libvlc_media_player_new_from_media(vlc_media);

    /*Устанавливаем дескриптор окна win32/win64, предоставленный медиаплееру для вывода мультимедиа*/
    libvlc_media_player_set_hwnd(vlc_mediaPlayer, (void *)ui->widget->winId());

    /*Воспроизведение медиафайлов*/
    if(vlc_mediaPlayer)libvlc_media_player_play(vlc_mediaPlayer);
}


//Пауза и продолжение
void Widget::on_pushButton_pause_clicked()
{
    if(vlc_mediaPlayer)libvlc_media_player_pause(vlc_mediaPlayer);
}

//останавливаться
void Widget::on_pushButton_stop_clicked()
{
    if(vlc_mediaPlayer)libvlc_media_player_stop(vlc_mediaPlayer);
}
2.2 widget.h
Язык кода:javascript
копировать
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <vlc/vlc.h>
#include <QDebug>
#include <QFileDialog>
#include <QMoveEvent>


QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_open_clicked();

    void on_pushButton_pause_clicked();

    void on_pushButton_stop_clicked();
private:
    Ui::Widget *ui;

    libvlc_instance_t *vlc_base=nullptr;
    libvlc_media_t *vlc_media=nullptr;
    libvlc_media_player_t *vlc_mediaPlayer=nullptr;

     Form *form;
};
#endif // WIDGET_H
2.3 файлы проекта pro
Язык кода:javascript
копировать
QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

INCLUDEPATH += $$PWD\VLC\sdk\include   Заголовочный файл #VLC включает каталог
INCLUDEPATH += $$PWD\VLC\sdk\include\vlc\plugins   Заголовочный файл #VLC включает каталог Необязательный
INCLUDEPATH += $$PWD\VLC\sdk\include\vlc   Заголовочный файл #VLC включает каталог Необязательный
LIBS +=$$PWD\VLC\sdk\lib\libvlc.lib    #Путь к файлу библиотеки VLC
LIBS +=$$PWD\VLC\sdk\lib\libvlccore.lib  #Необязательный

SOURCES += \
    main.cpp \
    widget.cpp

HEADERS += \
    widget.h

FORMS += \
    widget.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose