文章目录

  • 前言
  • 一、应用场景
  • 二、API介绍
    • 1. libvlc_video_set_callbacks ()
    • 2. libvlc_video_set_format ()
    • 3. libvlc_video_set_format_callbacks ()
  • 二、逐帧提取
    • 1. 开发者设置帧格式
    • 2. 回调设置帧格式
  • 总结

前言

提示:libvlc_video_set_format_callbacks

在LibVLC对视频媒体的逐帧提取开发中,void libvlc_video_set_format () 通常被开发者用来设置视频的格式,但是不同视频的格式是不同的,所以该函数是应用于用户已知媒体视频的格式,用户进行手动设置。接下来我将介绍由libvlc提供的void libvlc_video_set_format_callbacks () 回调设置视频的原始帧格式,该函数也可以帮助开发者在视频媒体播放前获取到帧格式。


提示:以下是本篇文章正文内容,下面案例可供参考

一、应用场景

当开发者需要对视频媒体的帧进行处理、保存帧图像、实现多屏播放等应用场景时,逐帧提取是一个关键的技术。libvlc帮我们实现了逐帧提取的相关API,理解这些API是实现上述场景的核心。

二、API介绍

您可在https://videolan.videolan.me/vlc/group__libvlc__media__player.html#ga612605f2e5c638d9f4ed59021d714bf0查看这些API。

1. libvlc_video_set_callbacks ()

void libvlc_video_set_callbacks  (   // 设置回调,将解码后的帧渲染并存储到内存中的自定义区域。libvlc_media_player_t  *   mp,libvlc_video_lock_cb         lock,libvlc_video_unlock_cb         unlock,libvlc_video_display_cb  display,void                    *   opaque
)

2. libvlc_video_set_format ()

void libvlc_video_set_format (   // 配置帧的解码格式libvlc_media_player_t    *   mp, const char              *   chroma, unsigned                    width, unsigned                     height, unsigned                    pitch
)

3. libvlc_video_set_format_callbacks ()

版本:LibVLC 2.0.0 or later

libvlc_video_set_format_callbacks (  // 设置回调,配置帧的解码格式libvlc_media_player_t    *   mp, libvlc_video_format_cb      setup, libvlc_video_cleanup_cb  cleanup
)

二、逐帧提取

1. 开发者设置帧格式

因为我看到很多的平台都由相关的 libvlc_video_set_format () 使用介绍,所以在此我不再赘述。如果有需要,可以参考https://jishuin.proginn.com/p/763bfbd2afc3。

2. 回调设置帧格式

代码如下(示例):
因为本人是在Qt + VLC的开发环境下,所以会使用部分Qt的工具,如果你是纯C++开发者,你可以用C++相应的工具替换它们。
本人的开发环境:Linux、Qt、C++

#include <QDebug>
#include <QMutex>
#include <QThread>struct Context {QMutex  mutex;int     width;int     height;uchar * pixels;
};static Context *g_pContxt = nullptr;static void *lock(void */*opaque*/, void **planes)
{g_pContxt->mutex.lock();*planes = g_pContxt->pixels;return NULL;
}static void unlock(void */*opaque*/, void */*picture*/, void *const *planes)
{unsigned char *data = (unsigned char *)*planes; // planes即为帧数据/*处理帧数据data*/g_pContxt->mutex.unlock();
}static void display(void *opaque, void *picture)
{(void)opaque;
}static unsigned setup(void** /*opaque*/, char* chroma, unsigned *width, unsigned *height, unsigned *pitches, unsigned *lines)
{qDebug() << "chroma:" << QString(chroma) << "width:" << *width << ", height:" << *height;/* 开辟存放图像数据的内存块 */if (g_pContxt){if (g_pContxt->pixels){delete[] g_pContxt->pixels;g_pContxt->pixels = NULL;}delete g_pContxt;g_pContxt = NULL;}int w = *width;int h = *height;g_pContxt = new Context;g_pContxt->pixels = new uchar[w * h * 4]; // 申请大小也为4通道的像素memset(g_pContxt->pixels, 0, g_pContxt->width * g_pContxt->height * 4);memcpy(chroma, "RV32", 4);g_pContxt->width = w;g_pContxt->height = h;*pitches= w * 4;*lines= h;return 1;
}int main()
{const char *fileName= "1.mp4";                                          // 设置你自己的媒体文件路径名libvlc_instance_t *m_pVlcInst = libvlc_new(0, NULL);libvlc_media_t *pMedia = libvlc_media_new_path(m_pVlcInst, fileName);     // 媒体libvlc_media_player_t *m_pVlcPlayer = libvlc_media_player_new_from_media(pMedia);libvlc_media_release(pMedia);   // 释放媒体对象pMedia = nullptr;/* 设置逐帧提取 */libvlc_video_set_callbacks(m_pVlcPlayer, lock, unlock, display, NULL);    // 设置帧回调,用来抓取解码后的帧libvlc_video_set_format_callbacks(m_pVlcPlayer, setup, NULL);          // 设置格式回调,用来设置解码后的帧格式/* 播放和停止媒体 */libvlc_media_player_play(m_pVlcPlayer);QThread::sleep(100);libvlc_media_player_stop(m_pVlcPlayer);/* 释放资源 */libvlc_media_player_release(m_pVlcPlayer);m_pVlcPlayer = nullptr;libvlc_release(m_pVlcInst);m_pVlcInst = nullptr;if (g_pContxt){if (g_pContxt->pixels){delete[] g_pContxt->pixels;g_pContxt->pixels = nullptr;}delete g_pContxt;g_pContxt = nullptr;}
}

总结

如果用户需要对不同视频媒体进行逐帧提取时,用户需要重复设置不同的帧格式。因为保持相同的帧格式应用在不同的视频媒体上,往往会带来帧的横向或纵向的拉伸。而回调设置帧格式的方法很好的解决了开发者手动设置帧格式的繁琐和弊端。
希望您能仔细阅读,因为发现和指正文章中的不足之处,是对我莫大的提升,谢谢!

【C/C++】LibVLC库在逐帧提取的开发中回调设置帧格式相关推荐

  1. 如何把视频分解成图片?怎么逐帧提取视频中的图片?

    在工作中遇到需要将一段视频逐帧分解成图片该怎么做?小编在这这里给大家分享一款视频提取图片(https://www.yasuoshipin.com工具,一起来了解一下吧. 在所有功能中,选择视频提取图片 ...

  2. html逐帧动画,谈谈网页中实现逐帧动画

    前言 我们在网页中经常需要一些动画效果,假如你的动画效果需要人为控制停止或者播放,我们一般就不会用gif来实现了!这里,就引出了我们今天讲到的逐帧动画!今天主要讲解几种方式来实现逐帧动画!大家可以根据 ...

  3. 批量跨帧提取人脸视频中的脸部区域帧图像python

    代码实现功能 1.所有人脸视频在一个文件夹中. 2.跨帧提取帧图像. 3.截取帧图像的脸部区域. 3.将截取到的所有脸部图像保存到新文件夹中. 代码语言:python3.6 #这个代码实现了批量跨帧提 ...

  4. 基于 ffmpeg + Webassembly 实现前端视频帧提取

    作者:jordiwang  https://juejin.im/post/6854573219454844935 现有的前端视频帧提取主要是基于 canvas + video 标签的方式,在用户本地选 ...

  5. 常用工具分享1-视频逐帧转图片保存

    视频逐帧提取并保存 基于python 的cv2进行视频转图片 使用说明 基于python 的cv2进行视频转图片 今天在使用中,需要将视频中的每一帧进行提取并保存在文件夹下面.因为包含多个视频,手动提 ...

  6. android 张口逐帧动画,Android中实现一个简单的逐帧动画(附代码下载)

    场景 Android中的逐帧动画,就是由连续的一张张照片组成的动画. 效果 注: 实现 首先准备一组不同表情的照片,放在res/drawable下,然后在此目录下新建动画资源文件fairy.xml 这 ...

  7. [css3动画教程]:逐帧自适应精灵图

    一.animation属性设置 要启用css3动画,就要先了解 animation 属性, animation 属性是一个简写属性,用于设置六个动画属性: animation-name 规定 @key ...

  8. iOS 动画原理与实现--帧动画、逐帧动画、CALayer

    这篇文章不会教大家如何实现一个具体的动画效果,我会从动画的本质出发,来说说 iOS 动画的原理与实现方式. 什么是动画 动画,顾名思义,就是能"动"的画. 人的眼睛对图像有短暂的记 ...

  9. Android案例(逐帧动画和属性动画)

    1.实现效果 2.布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmln ...

  10. (转译)用FFmpeg和SDL写播放器--01视频帧提取

    指导1:制作视频帧提取 概要 电影文件有很多基本的组成部分.首先,文件本身被称为容器Container,容器的类型决定了信息 被存放在文件中的位置.AVI和Quicktime就是容器的例子.接着,你有 ...

最新文章

  1. Java语法基础-序列化
  2. 《预训练周刊》第40期: 量子预训练、千层BERT与GPT
  3. 组建元宇宙军团!「谷歌实验室」重生,超700人神秘团队都有谁?
  4. AppBox升级进行时 - 拥抱Entity Framework的Code First开发模式
  5. 夺命雷公狗---微信开发57----微网站之jquery_mobile之入门案例
  6. 上周热点回顾(7.1-7.7)
  7. 比特币的超能力:永恒不变
  8. css实现浏览历史小块
  9. 文件 图片 上传 及少许正则校验
  10. 菜鸟也学hadoop(1)_搭建单节点的hadoop
  11. Python全栈之路系列----之-----守护进程\进程锁\队列\生产者消费者模式\数据共享\进程池(同步,异步)\回调函数\concurrent.futures模块...
  12. 使用CXF开发WebService程序的总结(七):Spring+CXF+Mybatis+Mysql共同打造的服务端示例...
  13. Java并发编程:Lock(上)
  14. C++Builder 2010深入TForm类之窗口与窗体
  15. 将txt文件编码改为utf-8格式
  16. CR渲染器全景图如何渲染颜色通道_3d Max设计师们的“偷懒”小技巧——云渲染篇...
  17. php统计图移动端,移动端可视化视图、统计图表集合(持续更新综合案例)原型...
  18. 循环群的子群必然还是循环群
  19. python摄像头识别快递单号,python 人脸识别以及条码识别(快递出库软件)
  20. 暂时性死区(TDZ)

热门文章

  1. GO语言开发天天生鲜项目第四天 商品后台管理
  2. 中州韵输入法 linux 小鹤双拼,‎App Store 上的“iRime输入法-小鹤双拼五笔郑码输入法”...
  3. 使用wePE安装系统
  4. 使用javascript、Ajax制作前端拟态风格天气预报功能
  5. 目前比较好的跨境电商ERP软件有哪些?这5款打死也要收藏!
  6. 9、java常用 设计模式
  7. Appium desktop下载安装
  8. 小爱音箱mini系统故障怎么办_Win7蓝牙连接小爱音箱mini的详细教程
  9. 【LeetCode】题解合集(JavaScript版)
  10. tcp keeplive