我正在尝试使用LibVLC解码video文件并将其渲染为纹理。
打开和开始播放的代码工作,音频播放完美,但像素缓冲区始终填充0xCD。 我尝试在VLC上渲染的video,甚至在C#实现中我都做到了,但是CI中的这个新代码无法让它工作……
我正在使用x64版本的vlc库,如果这有任何区别,程序将编译为x64。
这是我的代码:
#include "stdafx.h" #include "video.h" #include #include #include #include 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”色度模式和它的分辨率硬编码libvlc_video_set_format,那么,我是否错误地理解了libvlc_video_set_format_callbacks的作用? 根据格式设置回调的文档,可以更改params以启用转码,但即使我只是保留格式,每当我设置格式设置回调时,它都不起作用…
好吧,问题是极其愚蠢的。 首先,必须将节距和线设置为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/c++开发分享LibVLC空图像相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/519056.html