首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LibVLC空像

LibVLC空像
EN

Stack Overflow用户
提问于 2016-11-01 17:27:46
回答 1查看 1.1K关注 0票数 1

我试图使用LibVLC解码视频文件并将其呈现为纹理。

打开和开始播放的代码工作,音频播放完美,但像素缓冲区总是充满了0xCD。我试图在VLC上渲染的视频,甚至在一个C#实现中我也能工作,但是使用C中的新代码,我无法让它工作.

我正在使用x64版本的vlc库,如果这有任何区别的话,程序是为x64编译的。

这是我的代码:

代码语言:javascript
复制
#include "stdafx.h"
#include "video.h"
#include <string.h>
#include <vlc\libvlc.h>
#include <vlc\libvlc_media.h>
#include <vlc\libvlc_media_player.h>

libvlc_instance_t* instance;
libvlc_media_t* media;
libvlc_media_player_t* player;

struct videoContext
{
    unsigned char *pixeldata;
    unsigned char currentFrame;
    int width;
    int height;
};

struct videoContext mainContext;

bool gotData = false;
int width;
int height;

static void *lock(void *data, void **p_pixels)
{

    videoContext* context = (videoContext*)data;
    *p_pixels = context->pixeldata;


    return NULL;
}

static void unlock(void *data, void *id, void *const *p_pixels)
{
    mainContext.currentFrame++;
    //If I check here mainContext.pixeldata is filled with 0xCD
}

static void display(void *data, void *id)
{

}

static unsigned int formatSetup(void **opaque, char *chroma, unsigned *w, unsigned *h, unsigned *pitches, unsigned *lines)
{
    chroma = "RV24";
    width = *w;
    height = *h;

    mainContext.pixeldata = (unsigned char*)malloc(width * height * 3);

    mainContext.width = width;
    mainContext.height = height;

    return 1;
}

void getVideoSize(int* w, int* h, int* bpp)
{
    *w = width;
    *h = height;
    *bpp = 3 * 8;


}

videoContext* initVideo(const char* fileName)
{
    mainContext.pixeldata = 0;

    instance = libvlc_new(0, NULL);
    media = libvlc_media_new_location(instance, fileName);
    player = libvlc_media_player_new_from_media(media);
    libvlc_video_set_callbacks(player, lock, unlock, display, &mainContext);
    libvlc_video_set_format_callbacks(player, formatSetup, NULL);
    libvlc_media_player_play(player);

    return &mainContext;
}

更新:

似乎没有任何东西被写入缓冲区,因为我设置的任何东西都留在那里。

UPDATE2:

如果我删除格式设置回调,并用"RV24“色度模式对RV24进行硬编码,以及它的分辨率,那么,我是否错误地理解了libvlc_video_set_format_callbacks的功能呢?根据有关格式设置回调的文档,可以更改params以启用转码,但是即使我只是像设置格式设置回调那样保留格式,它也不起作用.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-01 18:13:02

好吧,所以,这个问题太愚蠢了。首先,必须将音高和线条设置为libvlc,以了解所分配的大小。第二,不能仅仅用const char分配色度,似乎const char在末尾有一个额外的"\0x00“,liblvc计数它,然后找不到解码器。

最后的回调是:

代码语言:javascript
复制
static unsigned int formatSetup(void **opaque, char *chroma, unsigned *w, unsigned *h, unsigned *pitches, unsigned *lines)
{
    memcpy(chroma, "RV24", sizeof("RV24") - 1);

    width = *w;
    height = *h;

    *pitches = width * 3;
    *lines = height;

    mainContext.pixeldata = (unsigned char*)malloc(width * height * 4);

    mainContext.width = width;
    mainContext.height = height;

    return 1;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40365353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档