Используйте 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
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.