LibVLC 空图像
LibVLC empty image
我正在尝试使用 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;
}
我正在尝试使用 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;
}