记录一次对Qt vlc 在android下进行硬件解码的实验(结果失败了)

6 篇文章 0 订阅
3 篇文章 0 订阅

最近想实现写一个Qt程序运行在android上,并且可以利用rk3288强大的硬件解码器进行解码并且实时播放rtsp流,选来选去我把目光停留在了vlc上,但是在qt on android上使用vlc有一个问题,那就是没法像常见的指定窗体的方式进行开发,比如

只能使用callback方式进行开发

这样是可以进行的但是重大问题在于完全工作在软解码模式下,效率非常低。这明显不是我们想要的。

可是无论设置什么参数到vlc中都没法使用上硬件解码器。

所以只能采用另一个方法,使用android studio 调用 vlc-android的API试一下,说不定能找到什么启示呢。

在Android Studio中开发vlc APP非常简单

一 将编译出来的aar放到app/libs文件夹里面

二 在Gradle中添加红框中的内容

三 在onCreate上添加了这些内容

编译运行,轻松随意的就实现了硬件解码rtsp流并播放。

但这里我陷入了沉思,究竟这几行JAVA代码做了什么,才能调用硬件解码器。

问题的关键在于

这个API是用来使能或不使能硬件解码器的,那他究竟做了什么呢。

我认为实质上也就是合成指令,然后addOptions指令,经过我在3288上的测试,实质上写入的指令是

然后查看一下addOptions这个在vlc源码中可以看到是一个c++的JNI调用,源码如下

可以看到实质上也就是调用了我们熟悉的libvlc_media_add_option函数。看到这里我笑了,也就是说在Qt代码中加上

就可以实现了,所以我兴冲冲的加上了这一句。

结果没有任何区别!

我想也许结论就是callback模式下硬件解码无论如何都没法用,能做的只有,手动取出帧数据以后,用opengl进行渲染。

这里我不确定,如果大佬们发现我的错误了,希望能指正我,谢谢,本人QQ 1564049340

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在 ARM 架构下使用 Qt 实现基于 VLC 的方式通过 RTSP 对海康网络摄像头进行视频流获取,可以按照以下步骤进行: 1. 在 Qt 项目中添加 VLC 的头文件和库文件,可以在项目配置中添加以下内容: ``` INCLUDEPATH += /usr/include/vlc LIBS += -lvlc ``` 2. 在 Qt 项目中添加 RTSP 地址输入框、播放按钮和视频显示窗口等控件。 3. 在 Qt 项目中编写 C++ 代码,实现 RTSP 视频流的获取和显示。以下是一个简单的示例代码: ```c++ #include <QtWidgets/QApplication> #include <QtWidgets/QHBoxLayout> #include <QtWidgets/QLineEdit> #include <QtWidgets/QPushButton> #include <QtWidgets/QWidget> #include <vlc/vlc.h> int main(int argc, char *argv[]) { QApplication a(argc, argv); // 创建 libvlc 实例 libvlc_instance_t *inst = libvlc_new(0, NULL); // 创建 media player 对象 libvlc_media_player_t *mp = libvlc_media_player_new(inst); // 创建视频显示窗口 QWidget *videoWidget = new QWidget(); QLayout *layout = new QHBoxLayout(videoWidget); layout->setMargin(0); layout->addWidget(QWidget::createWindowContainer((QWidget*) videoWidget)); // 创建 RTSP 地址输入框和播放按钮 QLineEdit *rtspEdit = new QLineEdit(); QPushButton *playButton = new QPushButton("Play"); // 连接播放按钮的点击事件 QObject::connect(playButton, &QPushButton::clicked, [=]() { // 创建 media 对象 libvlc_media_t *m = libvlc_media_new_location(inst, rtspEdit->text().toStdString().c_str()); // 设置 media player 的 media 对象 libvlc_media_player_set_media(mp, m); libvlc_media_release(m); // 设置 media player 的显示窗口 libvlc_media_player_set_nsobject(mp, videoWidget->winId()); // 开始播放 libvlc_media_player_play(mp); }); // 创建主窗口,并添加 RTSP 地址输入框、播放按钮和视频显示窗口 QWidget window; QVBoxLayout *mainLayout = new QVBoxLayout(&window); mainLayout->addWidget(rtspEdit); mainLayout->addWidget(playButton); mainLayout->addWidget(videoWidget); window.show(); // 运行 Qt 应用程序 int ret = a.exec(); // 释放资源 libvlc_media_player_stop(mp); libvlc_media_player_release(mp); libvlc_release(inst); return ret; } ``` 以上就是使用 Qt 实现基于 VLC 的方式通过 RTSP 对海康网络摄像头进行视频流获取和显示的方法。需要注意的是,为了保证流畅度和稳定性,建议在 ARM Linux 上使用硬件加速方式进行视频解码和渲染。可以在程序中设置 libvlc 的选项来启用硬件加速,例如: ```c++ // 设置选项 const char *vout = "opengl"; const char *chroma = "RV24"; const char *hwaccel = "mmal"; const char *avcodec = "mmal"; const char *avformat = "mmal"; const char *caching = "1000"; const char *network_caching = "1000"; const char *clock_jitter = "500"; const char *clock_synchro = "1"; const char *rtsp_transport = "tcp"; const char *udp_port = "0"; libvlc_video_set_output_callbacks(mp, NULL, NULL); libvlc_video_set_output(mp, vout); libvlc_video_set_format(mp, chroma, 0); libvlc_video_set_hw_decoder(mp, hwaccel, avcodec, avformat); libvlc_media_add_option(m, caching); libvlc_media_add_option(m, network_caching); libvlc_media_add_option(m, clock_jitter); libvlc_media_add_option(m, clock_synchro); libvlc_media_add_option(m, rtsp_transport); libvlc_media_add_option(m, udp_port); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值