使用LibVlc解决视频播放中的部分问题

2023-11-06

使用LibVlc解决视频播放中的部分问题

标签(空格分隔): libvlc


简介libvlc

vlc是一个开源的、跨平台的视频播放器。VLC支持大量的音视频传输、封装和编码格式.详情可访问 http://www.videolan.org 了解。
libVLC :VLC核心模块,被广泛做为多媒体库进行二次封装和开发。

安装包

以前在Windows下使用libVLC 时都是直接到官网下VLC安装包,安装后目录下有个SDK文件夹。最近要用到新版的SDK,安装完最新VLC后没看到目录下有SDK文件夹。后来找了下,在另一个地方可以下载到。

下载地址:http://download.videolan.org/pub/videolan/vlc/

在这个地址可以下载到各个版本的VLC,点击进入某个版本,下载windows下7z格式压缩包,解压即可得到相应的SDK。

使用libvlc 解决自定义流播放问题

两个常用播流接口

  1. LIBVLC_API libvlc_media_t *libvlc_media_new_location(
    libvlc_instance_t *p_instance,
    const char * psz_mrl );
    常用于特定的给定媒体资源位置, 列如有效的URL,rtm,onvif等。

  2. LIBVLC_API libvlc_media_t *libvlc_media_new_path(
    libvlc_instance_t *p_instance,
    const char *path );
    常用于本地多媒体文件的播放。

  3. LIBVLC_API libvlc_media_t *libvlc_media_new_callbacks(
    libvlc_instance_t *instance,
    libvlc_media_open_cb open_cb,
    libvlc_media_read_cb read_cb,
    libvlc_media_seek_cb seek_cb,
    libvlc_media_close_cb close_cb,
    void *opaque );
    除上述俩种常见的播放方式外,安防行业一般会使用私有协议的自定义流。而对自定义流进行 解封装、解密等操作后,将处理后的流再次进行播放和控制是一个相对麻烦的处理过程。使用libvlc的对应接口 可以减少对应处理和控制流程,降低开发难度。
    里面的主要回调包含:
    typedef int (*libvlc_media_open_cb)(void *opaque, void **datap,
    uint64_t *sizep);
    typedef ssize_t (*libvlc_media_read_cb)(void *opaque, unsigned char *buf,
    size_t len);
    typedef int (*libvlc_media_seek_cb)(void *opaque, uint64_t offset);
    typedef void (*libvlc_media_close_cb)(void *opaque);

其中 当多路自定义流回放时候 opaque 可以用于区分或标识对应的自定义流。
自定义流播放的重点typedef ssize_t (*libvlc_media_read_cb)(void *opaque, unsigned char *buf,size_t len);
buf缓冲区的起始地址,用于将数据读入(相当于vlc 从这个buf里接收我们输入的自定义媒体内容)
len (buf的长度)

注意事项:
1.如果没有立即可用的数据,则回调应休眠。 例如 Sleep(20);
2.避免死锁情况。
3.特别是,如果播放停止,则回调应返回错误; return -1
如果不返回,则libvlc_media_player_stop()将永远不会返回

使用libvlc 解决流转文件存储问题

由于libvlc 并没直接封装录像接口,所以在解决流的文件存储问题时 我使用的是
利用libvlc_media_add_option 和vlc的命令结合的笨方式 解决流文件的存储问题。
QString parm = QString(":sout=#duplicate{dst=display,dst=std{access=file,mux=mp4,dst=%1}").arg(m_recordPath);
libvlc_media_add_option(vlc_media, parm.toStdString().c_str());

部分libvlc参数调优

libvlc_media_add_option(vlc_media, ":rtsp=tcp"); //连接方式
libvlc_media_add_option(vlc_media, ":codec=ffmpeg");
libvlc_media_add_option(vlc_media, ":avcodec-threads=1");
libvlc_media_add_option(vlc_media, ":avcodec-hw=any"); //硬件解码
libvlc_media_add_option(vlc_media, ":network-caching=200"); //缓存
libvlc_media_add_option(vlc_media, ":prefetch-buffer-size=1024");  //预装取缓冲大小512K
libvlc_media_add_option(vlc_media, ":prefetch-read-size=65535");   //预装取读取大小64K
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用LibVlc解决视频播放中的部分问题 的相关文章

  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • BitLocker恢复获取密钥官方操作指南

    下载驱动安装禁用签名 进入Bios一堆骚操作出现下图问题 BitLocker恢复 下面的识别密钥是不能直接用 真正的恢复密钥是一串四十多位的数字序列 第一步 用另一台电脑浏览器进入aka ms myrecoverykey这个网址 就是图里那
  • unity游戏重新开始,退出,停止,继续按钮及打包发布

    一 游戏退出按钮 脚本Out 分为编辑状态下退出和打包编译后退出 这两种都要写上 using System Collections using System Collections Generic using UnityEngine usi
  • Flutter封装自定义按钮(过渡色、水波纹)

    Flutter封装自定义按钮 过渡色 水波纹 全局公用的按钮组件 用的时候不用写一大坨了 直接往里面传值就好了 注意 这里面的ScreenAdapter是我封装的适配方法 用的时候替换为自己的就好了 import package flutt
  • ES的安装使用(windows版)

    前言 Elasticsearch VS Java jdk 版本兼容性 Oracle OpenJDK AdoptOpenJDK 1 8 0 Oracle OpenJDK 9 Oracle OpenJDK 10 Oracle OpenJDK 1
  • HCIP 笔记

    1 交换基础 1 交换机启用过程 RAM 随机存储 当前配置文件 ROM 只读存储 自检程序 NVRAM 非易失性存储 保存配置 Flash 闪存 操作系统 2 交换机 二层基于MAC地址转发设备 依靠MAC地址表进行数据的转发 3 MAC
  • 线程管理之获取和设置线程信息

    获取和设置线程信息 Thread类的对象中保存了一些属性信息能够帮助我们来辨别每一个线程 知道它的状态 调整控制其优先级 这些属性是 ID 每个线程的独特标识 Name 线程的名称 Priority 线程对象的优先级 优先级别在1 10之间
  • Qt实现登录效果(超详细!超简单!)

    title Qt实现登录效果 超详细 超简单 date 2022 8 13 tags 学习 C Qt categories Qt tip 从一个界面按登录跳转到另一个界面 效果图 首先在登录界面输入正确的用户名和密码后点击登录 即可跳到第二
  • Electron项目打包

    文章目录 前置条件 配置 1 在vue config js 文件中增加配置项 2 根目录增加 scripts 文件夹 新建 installer nsi 文件 文件中具体脚本内容 可参考 3 执行打包指令 4 打包成功后会生成exe文件 5
  • 分享35个非常漂亮的单页网站设计案例

    单页网站是指只有一个页面的网站 这种形式的网站曾经非常流行 现在依然有很多人喜欢 不过 并不是每个网站都适合做成单页 一般都是内容比较少而且将来内容也不怎么增加的情况才适合这样做 另外 单页网站有个很大的特点就是导航都很新颖 大多是使用了锚
  • Kendo UI开发教程(3): 初始化Data 属性

    前面在介绍准备Kendo UI开发环境时我们使用jQuery的方法将一个HTML元素转换成一个Kendo UI控件 datepicker kendoDatePicker 除了使用jQuery插件的方法来初始化方法外 每个Kendo 控件还可
  • 序列两两比对算法_学会正确选择多序列比对(coding-sequences)软件

    前几天 实验室的师弟师妹通过本地blast获取一些没有基因组注释物种的蛋白编码序列 原本以为可以快速地进行下一步的选择压力分析 没想到却在多序列比对这一环节出现了棘手的问题 以前 我都是经过PRANK软件进行多序列比对 然后再使用Gbloc
  • TP调试记录

    1 USB tp触摸不准 项目中用到一款触摸屏显示是正常的就是TP不准 触摸的方向也是正确的就是触摸位置不准 屏幕中央触摸位置相对还好 越往边沿越不准 下面是当插上USB tp时抓到了logcat日志 03 06 03 23 18 449
  • 常用DOS命令

    文章目录 一 DOS介绍 二 常用命令 2 1 切换目录 2 2 查看目录 2 3 基本操作 2 4 其他命令 一 DOS介绍 DOS Disk Operating System 磁盘操作系统 二 常用命令 2 1 切换目录 命令 cd 目
  • ai模仿声音软件_浙大学霸本科生顶会研究!只需20分钟音频,AI就能逼真模仿你的声音...

    铜灵 发自 凹非寺量子位 出品 公众号 QbitAI AI精准模仿你的声音 需要多大规模的训练 浙江大学和微软的新研究证明 从0开始学习你的声音到准确逼真 AI只需要200个音频片段和相应标注 20分钟的素材就足够了 并且 这是一种近乎无监
  • 【uni-app教程】四、UniAPP 路由配置及页面跳转

    四 UniAPP 路由配置及页面跳转 1 路由配置 uni app页面路由为框架统一管理 开发者需要在pages json里配置每个路由页面的路径及页面样式 类似小程序在 app json 中配置页面路由一样 所以 uni app 的路由用
  • Qt实现在表格中添加气泡显示功能

    经常在项目中会使用到QTableWidget QTableView QTreeWidget等这类的表格 其中的Item中显示的内容较多 如果设置Item过宽的话 就会导致出现横向滚动条很难看 所以为了解决上述问题 可以采用气泡的形式 当鼠标
  • c语言基础(6)-----逗号运算及数据类型转换

    逗号运算符 表达式1 表达式2 逗号右边的表达式作为运算结果 4 数据类型的转换 4 1 自动类型转换 当用一种数据类型的数据赋值给另一数据类型的变量时 int a 1 1 int i a char 97 char a float f 0
  • 小程序蓝牙通信

    蓝牙通信能力封装 一开始是根据uniapp提供的蓝牙api写的蓝牙方法 之后发现复用性 以及一些状态的监听存在缺陷 之后整理成了类 这样复用性以及状态监听的问题就解决了 蓝牙组件 创建蓝牙组件的类 单例模式是为了保证蓝牙长连接 只有一个蓝牙
  • vue2中使用wangEditor(JS引入)

    本文讲的不是npm安装 是下载js本地引入哦 想了解vue2和vue3的npm安装的 去这里 用于 Vue React wangEditor 为了防止内网无法使用 咱不用cdn引入 直接下载js放入本地使用 第一步 下载wangEditor
  • 使用LibVlc解决视频播放中的部分问题

    使用LibVlc解决视频播放中的部分问题 标签 空格分隔 libvlc 简介libvlc vlc是一个开源的 跨平台的视频播放器 VLC支持大量的音视频传输 封装和编码格式 详情可访问 http www videolan org 了解 li