用libvlc 抓取解码后的帧数据

vlc是一套优秀的开源媒体库,其特点是提供了完整的流媒体框架, 用它可以非常方便的实现抓取解码帧的功能。

与此功能有关的关键API为

libvlc_video_set_callbacks  /*设置回调,用来抓取解码后的帧*/
 libvlc_video_set_format    /*设置解码帧的格式 yuv or rgba ?*/

这个函数将三个函数指针作为参数

/*callback function, lock the shared memory, and tell vlc
where to put the output frame data*/
static void *lock(void *data, void **p_pixels);

/*##get the out frame data AND u can save it to file, or sent it
to a next module*/
static void unlock(void *data, void *id, void *const *p_pixels);

/*how to display the result frame data, u can let vlc do not pop out the displaying gui via this fuction.  */
static void display(void *data, void *id);

下面是完整示例子:

#include "stdafx.h"
#include <Windows.h>
#include "vlc/vlc.h"
#include <vector>
#include <qmutex>
#include <sstream>
#include <qimage>

QMutex g_mutex;
bool   g_isInit = false;
int IMG_WIDTH = 640;
int IMG_HEIGHT = 480;
char in_buffer[640*480*4];
char out_buffer[640*480*4];
FILE *local;
int frameNum = 0;

const char*  TestFile = "b040_20170106.dat";
//////////////////////////////////////////////////////////////////////////
static void *lock(void *data, void **p_pixels)
{
    g_mutex.lock();
    *p_pixels = out_buffer;  /*tell VLC to put decoded data to this buffer*/
    return 0; /* picture identifier, not needed here */
}

/*##get the argb picture AND save to file*/
static void unlock(void *data, void *id, void *const *p_pixels)
{
    QImage image((unsigned char*)out_buffer,640,480,QImage::Format_ARGB32);
    std::ostringstream oss;
    oss << "d:/img"
        << frameNum
        << ".jpg";
    frameNum++;
    image.save(oss.str().c_str());
    g_mutex.unlock();
}

static void display(void *data, void *id)
{
    /* do not display the video */
    (void) data;
}

//////////////////////////////////////////////////////////////////////////
int main(int argc, char* argv[])
{
    libvlc_instance_t * inst;
    libvlc_media_player_t *mp;
    libvlc_media_t *m;  

    libvlc_time_t length;
    int wait_time=5000;  

 /* Load the VLC engine */
    inst = libvlc_new (int(options.size()), options.data());  

    // Configure any transcoding or streaming
    // options for the media source.
    options.clear();

    //Create a new item
    //Method 1:
    //m = libvlc_media_new_location (inst, "file:///F:\\movie\\cuc_ieschool.flv");
    //Screen Capture
    //m = libvlc_media_new_location (inst, "screen://");
    //Method 2:
        m = libvlc_media_new_path (inst, "D:\\warehouse\\data\\615\\haze.mp4");
/* Create a media player playing environment */
    mp = libvlc_media_player_new_from_media (m);  

    /* No need to keep the media now */
    libvlc_media_release (m);  

    /*##comment the followint 2 lines , if you want the out frame display in screen*/
    libvlc_video_set_callbacks(mp, lock, unlock, display, 0);
    libvlc_video_set_format(mp, "RGBA", IMG_WIDTH, IMG_HEIGHT,IMG_WIDTH*4);

    // play the media_player
    libvlc_media_player_play (mp);  

    //wait until the tracks are created
    _sleep (wait_time);
    length = libvlc_media_player_get_length(mp);
    IMG_WIDTH = libvlc_video_get_width(mp);
    IMG_HEIGHT = libvlc_video_get_height(mp);
    printf("Stream Duration: %ds\n",length/1000);
    printf("Resolution: %d x %d\n",IMG_WIDTH,IMG_HEIGHT);  

    //Let it play
    _sleep (length-wait_time);

    // Stop playing
    libvlc_media_player_stop (mp);  

    // Free the media_player
    libvlc_media_player_release (mp);  

    libvlc_release (inst);  

    return 0;
} 
时间: 2024-11-06 15:21:34

用libvlc 抓取解码后的帧数据的相关文章

抓取登录后的数据

这次是应一个客户需要,抓取另外一个网站的数据,包括数据提交.这些操作需要在登录之后完成.技术上没有什么难点.关键都是用fiddler找到参数和url. 记住登录状态 HttpClient能够记住登录状态的,登录完了可以讲Httpclient保存起来. private HttpClient _client; public HttpClient HttpClient { get { if (_client == null) { if (Session["Client"]!= null) {

HDOJ Guess the number 3337【神题-抓取杭电后台输出数据】

Guess the number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7077    Accepted Submission(s): 1626 Problem Description AekdyCoin is the most powerful boy in the group ACM_DIY, whose signatur

Hawk: 20分钟无编程抓取大众点评17万数据

1. 主角出场:Hawk介绍 Hawk是沙漠之鹰开发的一款数据抓取和清洗工具,目前已经在Github开源.详细介绍可参考:http://www.cnblogs.com/buptzym/p/5454190.html,强烈建议先读这篇文章,该文介绍了详细原理和抓取链家二手房的攻略,以此为基础,才能较好的理解整个操作. 本文将讲解通过本软件,获取大众点评的所有美食数据,可选择任一城市,也可以很方便地修改成获取其他生活门类信息的爬虫. 本文将省略原理,一步步地介绍如何在20分钟内完成爬虫的设计,基本不需

用PHP抓取百度贴吧邮箱数据

注:本程序可能非常适合那些做百度贴吧营销的朋友. 去逛百度贴吧的时候,经常会看到楼主分享一些资源,要求留下邮箱,楼主才给发. 对于一个热门的帖子,留下的邮箱数量是非常多的,楼主需要一个一个的去复制那些回复的邮箱,然后再粘贴发送邮件,不是被折磨死就是被累死.无聊至极写了一个抓取百度贴吧邮箱数据的程序,需要的拿走. 程序实现了一键抓取帖子全部邮箱和分页抓取邮箱两个功能,界面懒得做了,效果如下: 老规矩,直接贴源码 <?php $url2=""; $page="";

使用burpsuite等代理工具抓取docker容器中的数据包

使用burpsuite等代理工具抓取docker容器中的数据包,下面是详细的教程. 以docker中的某个漏洞平台(bwapp)为例,展示如何抓包. 1.首先使用docker下载bwapp: # docker pull raesene/bwapp 2.然后运行bwapp (使用命令   --env HTTP_PROXY="http://192.168.43.14:8080"   来进行代理设置,这里设置的是burpsuite中的ip地址以及端口) # docker run -d --n

Java学习-046-日志抓取合并后排序问题解决方案之 --- log4j 二次定制,实现日志输出添加延时10ms

自3月25至今,已经好久没有写学习日志了,今天在写日志抓取合并的小方法,发现抓取后的日志并米有依据系统执行的日志顺序排序.日志抓取排列逻辑如下: 通过日志标识,从各个日志文件(例如 use.log,error.log 等)中获取所需日志列表 合并日志列表 升序排序 输出日志报告 结果最后获取日志信息后,发现实际产出结果与预期结果不相符,如下所示: 1 2016-04-10 22:54:23,042 - INFO - [main] [cn.ffp.autotest.api.report.Repor

利用Abot 抓取博客园新闻数据

1. 引言 相比于Java而言,基于C#的开源爬虫就少了很多.入行这么多年也从未接触过爬虫.出于兴趣今天给大家介绍一个C# 的爬虫工具Abot. 需要使用可以通过Nuget获取.Abot本身就支持多线程的爬取, 内部使用CsQuery来解析爬取到的Html文档.熟悉jQuery的同学肯定能快速上手CsQuery, 它就是一个C#版本的jQuery. 这里以爬取博客园当天的新闻数据为例,看看如何使用Abot. 2. 博客园新闻页面 http://news.cnblogs.com/ 这是博客园的新闻

python抓取百度彩票的双色球数据

最近在学习<机器学习实战>这本书,在学习的过程中不免要自己去实践,写些练习.这写练习的第一步就需要收集数据,所以为了写好自己的练习程序,我得先学会收集一些网络数据.了解到用python抓取网页数据的一些方法后,我就根据别人的demo,自己实践了一下,学着从百度彩票网站上抓取双色球的历史数据.以下我就介绍一下自己的小程序. 大致思路如下 找到相关url和其参数 找出页面上你要抓取的数据的位置,也就是说这个数据在那些标签下 将每页中学要的数据取下来按一定格式存放在自己本地 需要的环境: pytho

浅谈如何使用python抓取网页中的动态数据

我们经常会发现网页中的许多数据并不是写死在HTML中的,而是通过js动态载入的.所以也就引出了什么是动态数据的概念, 动态数据在这里指的是网页中由Javascript动态生成的页面内容,是在页面加载到浏览器后动态生成的,而之前并没有的. 在编写爬虫进行网页数据抓取的时候,经常会遇到这种需要动态加载数据的HTML网页,如果还是直接从网页上抓取那么将无法获得任何数据. 今天,我们就在这里简单聊一聊如何用python来抓取页面中的JS动态加载的数据. 给出一个网页:豆瓣电影排行榜,其中的所有电影信息都