天道酬勤,学无止境

video gets stuck when its seeked back (C++) (QT) (libvlc)

I am using libvlc to play video on my GUI Application using QT 4. When I seek forward the video it works fine, but when I seek back the video, it gets stuck I mean frame doesn't change and my callback function which is videopostrender doesn't get any call.

    void videoPrerender(void *p_video_data,
                    uint8_t **pp_pixel_buffer,
                    int size)
{
    // Locking
    //printf("cbVideoPrerender %i\n",size);
    //printf("vtest: %lld\n",(long long int)p_video_data);
    VLCPlayer* player = reinterpret_cast<VLCPlayer*>(p_video_data);
    player->m_mutex.lock();
    if ((size > player->m_videoBufferSize) || !player->m_videoBuffer)
    {
        printf("Reallocate raw video buffer\n");
        if(player->m_videoBuffer) free(player->m_videoBuffer);
        player->m_videoBuffer = (uint8_t *)malloc(size);
        player->m_videoBufferSize = size;
    }
    *pp_pixel_buffer = player->m_videoBuffer;
}

void videoPostrender(void *p_video_data,
                     uint8_t *p_pixel_buffer,
                     int width,
                     int height,
                     int pixel_pitch,
                     int size,
                     int64_t pts)
{
    Q_UNUSED(p_pixel_buffer)
    Q_UNUSED(size)
    //printf("cbVideoPostrender %i\n",size);
    // Unlocking
    VLCPlayer* player = reinterpret_cast<VLCPlayer*>(p_video_data);
    player->m_mutex.unlock();
    player->m_frameWidth = width;
    player->m_frameHeight = height;
    player->m_framePixelPitch = pixel_pitch;
    player->m_framePts = pts;
    if(player)
    {            
        player->m_frameImage = QImage((uchar*)player->m_videoBuffer,
                         width, height,
                         QImage::Format_ARGB32_Premultiplied);
        if(player->isLocalFile())
        {
            // Need not use timer based playing mechanism for local files.
            int interval = 100 / player->videoFPS();
            while(!player->m_elapsedTimer.hasExpired(interval))
                qApp->processEvents();

            player->m_elapsedTimer.restart();
        }

        if(player->record_state() == VLCPlayer::Playing)
        {
            player->emitRecorderTimeChanged();
        }

        qDebug()<<player->m_framePts;
        emit player->frameReady(player->m_frameImage);
    }
}

EDIT 1 - Adding more code for better understanding

    VLCPlayer::VLCPlayer(const QStringList &args, QObject *parent)
    : QObject(parent),
      m_frameWidth(0),
      m_frameHeight(0),
      m_framePixelPitch(0),
      m_framePts(0),
      m_videoBuffer(0),
      m_audioBuffer(0),
      m_videoBufferSize(0),
      m_audioBufferSize(0)
{
    d = new VLCPlayerData;

    qRegisterMetaType<VLCPlayer::VLCPlayerState>("VLCPlayer::VLCPlayerState");

    char **argv = (char **)malloc(sizeof(char **) * args.count());
    for (int i = 0; i < args.count(); ++i)
        argv[i] = (char *)qstrdup(args.at(i).toUtf8().data());

    // VLC options
    char smem_options[1000];
    sprintf_s(smem_options
            , "#transcode{vcodec=RV32,acodec=s16l}:smem{"
            "video-prerender-callback=%lld,"
            "video-postrender-callback=%lld,"
            "audio-prerender-callback=%lld,"
            "audio-postrender-callback=%lld,"
            "audio-data=%lld,"
            "video-data=%lld},"
            , (long long int)(intptr_t)(void*)&videoPrerender
            , (long long int)(intptr_t)(void*)&videoPostrender
            , (long long int)(intptr_t)(void*)&audioPrerender
            , (long long int)(intptr_t)(void*)&audioPostrender
            , (long long int)(intptr_t)(void*)this //This would normally be useful data, 100 is just test data
            , (long long int)(intptr_t)(void*)this); //Test data

    const char * const vlc_args[] = {
        "-I", "dummy", // Don't use any interface
        "--sout-x264-preset=ultrafast",
        "--file-caching=100",
        "--disc-caching=100",
        "--live-caching=100",
        "--network-caching=300",
        "ffmpeg-hw",
        //        "--ignore-config", // Don't use VLC's config
        //        "--extraintf=logger", // Log anything
        //        "--verbose=1", // Be verbose
        //        argv,
        "--sout", smem_options // Stream to memory
    };

    d->libvlcInstance = libvlc_new(sizeof(vlc_args) / sizeof(vlc_args[0]), vlc_args);

    d->libvlcMediaPlayer = libvlc_media_player_new(d->libvlcInstance);

    d->libvlcEventManager = libvlc_media_player_event_manager(d->libvlcMediaPlayer);




void VLCPlayer::setPosition(float position)
{
    if(!d->libvlcMediaPlayer)
            return;

        libvlc_media_player_set_position(d->libvlcMediaPlayer, position);
    }

    void VLCPlayer::updatePlayingState()
    {
        qDebug()<<"updatePlayingState";
        this->setState(VLCPlayer::Playing);
        QMetaObject::invokeMethod(this, "updateStateTimer", Qt::QueuedConnection);
    }
void VLCPlayer::emitPositionChanged()
{
    if(!d->libvlcMediaPlayer)
        return;

    qDebug()<<"emitPositionChanged";
    emit positionChanged(libvlc_media_player_get_position(d->libvlcMediaPlayer));
}


void VLCPlayer::libvlc_callback(const libvlc_event_t *event,
                                void *data)
{
    VLCPlayer* player = (VLCPlayer*) data;
    if(!player)
        return;

    switch(event->type)
    {
    case libvlc_MediaPlayerMediaChanged:
        break;
    case libvlc_MediaPlayerNothingSpecial:
        break;
    case libvlc_MediaPlayerOpening:
        player->setState(VLCPlayer::Opening);
        break;
    case libvlc_MediaPlayerBuffering:
        player->setState(VLCPlayer::Buffering);
        break;
    case libvlc_MediaPlayerPlaying:
        player->updatePlayingState();
        break;
    case libvlc_MediaPlayerPaused:
        player->setState(VLCPlayer::Paused);
        break;
    case libvlc_MediaPlayerStopped:
        player->setState(VLCPlayer::Stopped);
        break;
    case libvlc_MediaPlayerForward:
        break;
    case libvlc_MediaPlayerBackward:
        break;
    case libvlc_MediaPlayerEndReached:
        player->setState(VLCPlayer::EndReached);
        break;
    case libvlc_MediaPlayerEncounteredError:
        player->setState(VLCPlayer::Stopped);
        break;
    case libvlc_MediaPlayerTimeChanged:
        player->updatePlayingState();
        player->emitTimeChanged();
        break;
    case libvlc_MediaPlayerPositionChanged:
        player->updatePlayingState();
        player->emitPositionChanged();
        break;
    case libvlc_MediaPlayerSeekableChanged:
        break;
    case libvlc_MediaPlayerPausableChanged:
        break;
    case libvlc_MediaPlayerTitleChanged:
        break;
    case libvlc_MediaPlayerSnapshotTaken:
        break;
    case libvlc_MediaPlayerLengthChanged:
        player->emitLengthChanged();
        break;
    case libvlc_MediaPlayerVout:
        break;
    default:
        player->setState(VLCPlayer::Unknown);
        break;
    }
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 使用 VLC imem 从内存播放 h264 视频文件,但收到错误“主流错误:无法预填充缓冲区”(Using VLC imem to play an h264 video file from memory but receiving error “main stream error: cannot pre fill buffer”)
    问题 我有一个加载到内存中的 h264 视频文件,我尝试使用参数“imem-cat=4”使用 imem 播放它,以便 vlc 将使用访问模块来解复用视频,并且 vlc 启动并接收我的 imem参数成功: [0x7f38a0000e28] access_imem demux debug: Using get(0x404e1d), release(0x404e91), data(0x7fff5b4a9430), cookie("IMEM") 这个类别也意味着我不必提供 DTS 和 PTS。 VLC 的 imem 模块没有很好的文档记录,但我在几个地方找到了提示,例如 https://forum.videolan.org/viewtopic.php?t=111917 https://forum.videolan.org/viewtopic.php?f=32&t=93842 在 python 中使用 libVLC 从内存播放视频 我的 imem-get 函数只是在第一次调用时将缓冲区指针设置为视频数据,返回 0,在任何进一步调用中,它返回 1 以指示没有更多数据: int MyImemGetCallback (void *data, const char *cookie, int64_t *dts, int64_t *pts, unsigned *flags, size_t *
  • Playing multiple video using libvlc and Qt
    I have created a sample application in Qt where i have to display camera stream in a 2x2 grid. I am using libvlc to play the stream and i am able to display the video as well. But i am facing few issues Vlc is creating a separate window to render the video. Its not displayed on the area provided by Qt Application. Here is my code void playerView::createPlayer() { const char *const vlc_args[] = { "--avcodec-hw=any", "--plugin-path=C:\QtSDK\vlc-2.2.1\plugins" }; vlcinstance = libvlc_new(sizeof(vlc_args) / sizeof(vlc_args[0]), vlc_args); const char* url = "rtsp://<camera ip>/cam0_0"; /* Create a
  • 使用 libvlc 和 Qt 播放多个视频(Playing multiple video using libvlc and Qt)
    问题 我在 Qt 中创建了一个示例应用程序,我必须在其中以 2x2 网格显示相机流。 我正在使用 libvlc 播放流,我也可以显示视频。 但我面临的问题很少 Vlc 正在创建一个单独的窗口来呈现视频。 它没有显示在 Qt 应用程序提供的区域中。 这是我的代码 void playerView::createPlayer() { const char *const vlc_args[] = { "--avcodec-hw=any", "--plugin-path=C:\QtSDK\vlc-2.2.1\plugins" }; vlcinstance = libvlc_new(sizeof(vlc_args) / sizeof(vlc_args[0]), vlc_args); const char* url = "rtsp://<camera ip>/cam0_0"; /* Create a new LibVLC media descriptor */ media = libvlc_media_new_location(vlcinstance, url); // Create a media player playing environement vlcmp = libvlc_media_player_new(vlcinstance); libvlc_media_player_set
  • libvlc_media_player_set_hwnd 不适用于 QWidget 句柄(libvlc_media_player_set_hwnd doesn't work with QWidget Handle)
    问题 我正在使用 Qt4.8 Windows 版本开发一个应用程序来使用 libvlc 2.2.1 流式传输视频。 当我使用libvlc_media_player_set_hwnd()在我的 QWidget 上渲染视频时,它会创建一个单独的窗口来显示视频。 libvlc_media_player_set_hwnd(m_player, (void*)videoWidget->winId()); 我已经尝试了所有版本的 libvlc 以及所有与 Qt 相关的 libvlc 示例。 还遵循 https://wiki.videolan.org/LibVLC_SampleCode_Qt/ 中给出的步骤 但我不确定我是否遗漏了什么。 看起来好像libvlc_media_player_set_hwnd()无法获取 QWidget WinId 并创建自己的窗口。 然而(void*)videoWidget->winId()似乎是一个有效的值。 (我得到的值为 0x65)。 如果我遗漏了什么,请告诉我。 回答1 您首先需要确保正确配置了 VLC 实例,以便它使用虚拟接口,例如: /* Load the VLC engine */ std::vector<const char*> options; options.push_back("--intf=dummy"); return libvlc_new
  • 如何在 Qt 5 中使用 LibVLC(How to use LibVLC with Qt 5)
    问题 我正在尝试在 Qt 5 程序中使用 LibVLC 打开 VLC 实例并播放视频。 以下代码来自 https://wiki.videolan.org/LibVLC_Tutorial/ 我使用的是 Linux。 .pro : TEMPLATE = app TARGET = projectLoic INCLUDEPATH += . vlc QT += widgets # Input HEADERS += SOURCES += main.cpp LIBS +=-lvlc 主要的 : #include <vlc/vlc.h> #include <QApplication> int main(int argc, char* argv[]) { QApplication app(argc, argv); libvlc_instance_t * inst; libvlc_media_player_t *mp; libvlc_media_t *m; // Load the VLC engine inst = libvlc_new(0, NULL); // Create a new item m = libvlc_media_new_path (inst, "/home/........mp3"); // Create a media player playing environement mp
  • Qt 5 and LibVLC
    I'm working on a project which involves receive, display and rebroadcast several local network video streams. LibVLC seems to be the way to go, I'd like to use it within Qt Creator/C++/OSX 10.12.1 and I also need the project to be compilable on some Windows 10 machines where I have Qt installed. I successfully tested some functionalities by installing the offical QT-LibVLC wrapper from projects.tano.si/vlc-qt. Unfortunately the wrapper lacks many LibVLC methods which are essential to my project, so I decided to install full LibVLC. For now I'm stuck on how to make LibVLC work. I followed all
  • Qt 5 和 LibVLC(Qt 5 and LibVLC)
    问题 我正在从事一个项目,该项目涉及接收、显示和转播多个本地网络视频流。 LibVLC 似乎是要走的路,我想在 Qt Creator/C++/OSX 10.12.1 中使用它,并且我还需要在安装了 Qt 的某些 Windows 10 机器上编译该项目。 我通过从 projects.tano.si/vlc-qt 安装官方 QT-LibVLC 包装器成功地测试了一些功能。 不幸的是,包装器缺少许多对我的项目至关重要的 LibVLC 方法,因此我决定安装完整的 LibVLC。 现在我被困在如何使 LibVLC 工作上。 我按照 https://wiki.videolan.org/OSXCompile/#Apple_Software 上的所有说明进行安装和库构建,一切顺利。 然后我在 QT 中开始了一个新项目,尝试添加 INCLUDEPATH += 。 vlc 和 LIBS +=-lvlc 路径到 Qt 中的 .pro 文件,但它不起作用。 此外,将路径添加到 VLC 构建文件夹的“框架”文件夹也不起作用。 有谁知道魔术的方法吗? 对不起,我知道我有点天真,但就是这样......提前感谢您的任何回答! 更新: 感谢 eyllanesc 的建议,这个结构现在适用于编译器: QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT +=
  • 使用 Qt MultiMedia 和 Widgets 播放网络流视频(Playing a network streaming video using Qt MultiMedia and Widgets)
    问题 我正在尝试构建一个简单的 qt 应用程序,它将播放实时视频流。 流媒体视频未在我的应用中播放。 我已经使用 qt 播放了本地文件,但无法播放实时视频流。 我找到了这个链接,但他们没有帮助我:- 使用 Qt 播放实时视频流 Qt Stream IP 摄像机视频 这是代码:- #include <QApplication> #include <QtMultimediaWidgets/QVideoWidget> #include <QtMultimedia/QMediaPlayer> int main(int argc, char *argv[]) { QApplication a(argc, argv); QMediaPlayer *player = new QMediaPlayer; QMediaContent *mc=new QMediaContent(QUrl("http://192.168.42.129:8080/video")); player->setMedia(*mc); player->setVolume(50); QVideoWidget *videoWidget = new QVideoWidget; videoWidget->resize(700,700); videoWidget->show(); player->setVideoOutput
  • 在Ubuntu下编译VLC并实现播放视频
    在Ubuntu下编译VLC并实现播放视频 一、下载VLC源码二、安装VLC依赖的库三、VLC编译与安装1、编译与安装2、库文件3、头文件 四、调用VLC实现播放视频1、添加头文件、库路径2、封装播放器类VLCPlayer3、测试代码 五、报错解决1、报错(You must put some ‘source’ URIs in your sources.list)2、报错(error: “You cannot build VLC with Qt-5.5.0. You need to backport I78ef29975181ee22429c9bd4b11d96d9e68b7a9c”) VLC官网:https://www.videolan.org/ VLC Github:https://github.com/videolan/vlc 测试环境:Ubuntu 16.04 64位系统,Qt Creator + GCC 一、下载VLC源码 下载地址:http://download.videolan.org/pub/videolan/vlc/2.2.4/vlc-2.2.4.tar.xz 二、安装VLC依赖的库 输入如下命令,安装依赖库: sudo apt-get build-dep vlc 报错:You must put some ‘source’ URIs in your sources
  • 无法在 LibVLC 使用的 QWidget 上覆盖透明的 Qlabel(Can not overlay a transparent Qlabel on a QWidget that LibVLC uses)
    问题 我对 LibVLC 用户有一个问题,我一直在苦苦挣扎,但还没有找到解决方案,所以想向您寻求帮助。 我有一个使用 LibVLC 播放视频、视频流的 Qt 应用程序。 您可能知道,LibVLC 使用 Qt 小部件通过仅获取 Qwidget 的 WinID 来呈现视频帧,并自行处理其余部分。 我有一个 Qwidget 用 LibVLC 渲染视频,我想在这个小部件上覆盖一个透明的 Qlabel,但是当小部件开始显示视频时,标签不能是透明的,并保持背景与它在之前叠加的最后一件事视频开始播放。 这对我来说是一个 LibVLC 问题,我确信有一个解决方案,但到目前为止无法在网上找到解决方法。 任何建议为什么会发生这种情况以及如何避免? 提前致谢。 回答1 将这些属性和标志添加到所需的 Qlabel 解决了我的问题。 labelCamName->setWindowFlags(Qt::Window | Qt::FramelessWindowHint); labelCamName->setAttribute(Qt::WA_TranslucentBackground);
  • 在 python 中使用 libVLC 从内存播放视频(Play video using libVLC from memory in python)
    问题 我正在尝试使用 libVLC python 绑定在将文件读入内存后播放它们。 我有以下代码将有效的视频文件读入内存。 我现在需要直接从内存中播放视频。 import vlc File1 = open('vid.webm','rb') Axel = File1.read() 现在我需要在 Axel 中播放内容,我该怎么做。 有关如何在 C、Java 等中执行此操作的信息也可以提供帮助。 编辑:明白我将不得不使用 imem 模块,但找不到关于如何完成它的任何帮助。 回答1 为此,您必须使用 libvlc 的 imem 模块。 这可能真的很令人困惑,因为它现在不是公开记录的 API。 但是,我在此处和 VideoLan 论坛上关注了一些与此相关的其他帖子。 下面是我今天在 C++ 中使用的一些示例代码,它使用加载到内存中的 JPEG 图像来创建视频流。 您可以遵循类似的步骤,但您只需要更改内存中数据的编解码器(请参阅 imem-codec=RV24 行)。 // Local file/media source. std::string IMEM_SOURCE_FOLDER = "settings/rvideo/samples/bigdog"; class MyImemData { public: MyImemData() : mFrame(0), mDts(0), mPts(0)
  • Can not overlay a transparent Qlabel on a QWidget that LibVLC uses
    I have a question to LibVLC users that I have been struggling all day but couldn't come to a solution yet, so wanted to ask you for help. I have a Qt application that uses LibVLC to play videos, video streams. As you may know, LibVLC uses Qt widgets to render video frames by getting only the WinID of the Qwidget and handles the rest itself. I have a Qwidget to render video with LibVLC and I want to overlay a transparent Qlabel on this widget but when the widget starts showing the video, the label can not be transparent and stays with a background with the very last thing it was overlaying
  • libvlc_media_player_set_hwnd doesn't work with QWidget Handle
    I am using Qt4.8 Windows version to develope an application to stream video using libvlc 2.2.1. When I use libvlc_media_player_set_hwnd() to render the video on my QWidget, its rather creating a separate window to display the video. libvlc_media_player_set_hwnd(m_player, (void*)videoWidget->winId()); I have tried all versions of libvlc and all the examples related to libvlc with Qt. Also followed the steps given in https://wiki.videolan.org/LibVLC_SampleCode_Qt/ But I am not sure if I m missing anything. It looks like as if libvlc_media_player_set_hwnd() is not able to take the QWidget WinId
  • 如何在基于GStreamer的Qt中实现视频小部件?(How to implement a video widget in Qt that builds upon GStreamer?)
    问题 我想使用Qt创建一个可以播放本地视频文件的简单GUI应用程序。 我可以使用Phonon来完成幕后的所有工作,但是我需要更多的控制权。 我已经成功地使用encodebin和autovideosink元素实现了GStreamer管道。 现在,我想使用Qt小部件将输出引导到。 有没有人成功做到这一点? (我想是这样,因为有一些基于Qt的视频播放器是建立在GStreamer上的。)有人可以为我指出正确的方法吗? 注意:此问题与我先前发布的有关如何将Qt与传入RTP流连接的问题类似。 这似乎很有挑战性。 我认为这个问题会更容易回答。 更新1 Patrice关于使用libVLC的建议已经非常有用。 这是在VLC网站上找到的代码的更简洁的版本:Qt + libVLC的示例。 但是,我最初的问题仍然存在:如何将GStreamer连接到Qt小部件? 更新2 经过一些实验,我最终得到了这个工作样本。 它取决于我自己的小GstSupport库中的GstWidget.h和GstWidget.cpp。 但是,请注意,目前仅在Mac版本的Qt上进行了测试。 回答1 要将Gstreamer与QWidget连接,需要使用QWidget::winId()获取窗口句柄,并将其传递给gst_x_overlay_set_xwindow_id(); 粗略的示例代码: sink = gst_element
  • 在Windows下编译VLC并实现播放视频
    在Windows下编译VLC并实现播放视频 一、编译Win版的VLC真麻烦二、获取VLC的SDK1、下载VLC播放器2、库文件3、头文件 三、调用VLC实现播放视频1、拷贝头文件和库文件2、修改pro文件3、封装播放器类VLCPlayer4、测试代码 VLC官网:https://www.videolan.org/ VLC Github:https://github.com/videolan/vlc 测试环境:Win10 64位系统 一、编译Win版的VLC真麻烦 博主第一反应就是,使用VS来进行编译,但是官方说不支持,好,那就放弃吧。 看看官网编译指导,是如何介绍的:https://wiki.videolan.org/Win32Compile/ 可以看到,在Windows平台下编译,有3种方法: MinGW on Linux,推荐首选Linux交叉编译的方法,在运行Microsoft Windows的计算机上,虚拟机中运行Linux,在Linux中使用交叉编译工具链进行编译;MSYS+MinGW on Windows,MSYS是一个最小的构建环境,可以在Microsoft Windows上直接编译unix风格的项目,这不是VideoLAN官方支持的,祝好运;Cygwin on Windows,Cygwin模拟POSIX环境在Microsoft Windows上进行编译
  • Playing a network streaming video using Qt MultiMedia and Widgets
    I am trying to build a simple qt application which will play a live video stream. The streaming video is not playing in my app. I have played a local file using qt but i can't play the live video stream. I have found this links but they didn't help me :- Play a Live video Stream using Qt Qt Stream IP Camera Video Here is the code:- #include <QApplication> #include <QtMultimediaWidgets/QVideoWidget> #include <QtMultimedia/QMediaPlayer> int main(int argc, char *argv[]) { QApplication a(argc, argv); QMediaPlayer *player = new QMediaPlayer; QMediaContent *mc=new QMediaContent(QUrl("http://192.168
  • 对“libvlc_new”的未定义引用但链接正确?(Undefined reference to 'libvlc_new" but linked correctly?)
    问题 我想在使用 C++ 的基于 ROS 的项目中使用 VLC 库。 我使用 QT Creator 作为代码编辑器。 我试着按照下面的教程来实现一个mp3文件的简单播放:A simple C program to play mp3 using libvlc Since then I'm getting the following exceptions: undefined reference to `libvlc_new' undefined reference to `libvlc_media_new_path' undefined reference to `libvlc_media_player_new_from_media' undefined reference to `libvlc_media_release' undefined reference to `libvlc_media_player_play' undefined reference to `libvlc_media_player_stop' undefined reference to `libvlc_media_player_release' undefined reference to `libvlc_release' collect2: ld returned 1 exit status make
  • How to use LibVLC with Qt 5
    I'm trying to use LibVLC in a Qt 5 program to open a VLC instance and play a video. The following code comes from https://wiki.videolan.org/LibVLC_Tutorial/ I'm using Linux. .pro : TEMPLATE = app TARGET = projectLoic INCLUDEPATH += . vlc QT += widgets # Input HEADERS += SOURCES += main.cpp LIBS +=-lvlc main : #include <vlc/vlc.h> #include <QApplication> int main(int argc, char* argv[]) { QApplication app(argc, argv); libvlc_instance_t * inst; libvlc_media_player_t *mp; libvlc_media_t *m; // Load the VLC engine inst = libvlc_new(0, NULL); // Create a new item m = libvlc_media_new_path (inst, "
  • Libvlc 媒体播放器端达到奇怪的行为(Libvlc media player end reached weird behavior)
    问题 我正在使用带有 Qt 的 libvlc,我注意到当媒体播放器到达视频末尾时,它不再响应窗口大小调整或“播放”以重新启动视频,它只是停止工作,仅此而已。 如果我在媒体播放器播放结束时尝试调整大小,就会发生这种情况: 玩游戏时的行为: 结束后的行为达到: 它不会仅在库中的常规 Vlc 中发生。 有没有我遗漏的配置,或者他们在那种情况下做了一些我不知道的事情? 回答1 已解决:我观看了 VLC 行为以了解它在视频播放结束时的工作方式,我注意到它只是播放视频,就像按下停止一样,所以我设法在事件libvlc_MediaPlayerEndReached上调用了 stop 。 它在我之前不起作用,因为我使用 lambdas 作为连接的回调,我只是用真实的方法替换了它们,它工作得很好。
  • Get frame from video with libvlc smem and convert it to opencv Mat. (c++)
    [UPDATED WITH PARTIAL ANSWER] Here is my code: void cbVideoPrerender(void *p_video_data, uint8_t **pp_pixel_buffer, int size) { // Locking imageMutex.lock(); videoBuffer = (uint8_t *)malloc(size); *pp_pixel_buffer = videoBuffer; } void cbVideoPostrender(void *p_video_data, uint8_t *p_pixel_buffer , int width, int height, int pixel_pitch, int size, int64_t pts) { // Unlocking imageMutex.unlock(); Mat img = Mat(Size(width,height), CV_8UC3, p_pixel_buffer); //cvtColor(img,img,CV_RGB2BGR); } int main(int argc, char ** argv) { libvlc_instance_t * inst; char smem_options[1000]; sprintf(smem_options