gpt4 book ai didi

c++ - LibVLC 空图像

转载 作者:行者123 更新时间:2023-11-30 16:55:12 26 4
gpt4 key购买 nike

我正在尝试使用 LibVLC 解码视频文件并将其渲染为纹理。

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

我使用的是 x64 版本的 vlc 库,并且该程序是针对 x64 编译的(如果这有什么区别的话)。

这是我的代码:

#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;
}

更新:

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

更新2:

如果我删除格式设置回调,并使用“RV24”色度模式及其工作分辨率对 libvlc_video_set_format 进行硬编码,那么,我是否错误地理解了 libvlc_video_set_format_callbacks 的作用?根据格式设置回调的文档,可以更改参数以启用转码,但即使我在设置格式设置回调时将格式保留为原样,它也不起作用...

最佳答案

好吧,所以这个问题非常愚蠢。首先,必须设置音高和线,以便 libvlc 知道分配的大小。其次,不能只用 const char 分配色度,似乎 const char 末尾有一个额外的“\0x00”,liblvc 对其进行计数,然后找不到解码器。

最终的回调是这样的:

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;
}

关于c++ - LibVLC 空图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40365353/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com