【发布时间】:2014-05-30 08:26:42
【问题描述】:
[更新了部分答案]
这是我的代码:
void cbVideoPrerender(void *p_video_data, uint8_t **pp_pixel_buffer, int size) {
// Locking
imageMutex.lock();
videoBuffer = (uint8_t *)malloc(size);
*pp_pixel_buffer = videoBuffer;
}
void cbVideoPostrender(void *p_video_data, uint8_t *p_pixel_buffer
, int width, int height, int pixel_pitch, int size, int64_t pts) {
// Unlocking
imageMutex.unlock();
Mat img = Mat(Size(width,height), CV_8UC3, p_pixel_buffer);
//cvtColor(img,img,CV_RGB2BGR);
}
int main(int argc, char ** argv)
{
libvlc_instance_t * inst;
char smem_options[1000];
sprintf(smem_options
, "#transcode{vcodec=RV24}:smem{"
"video-prerender-callback=%lld,"
"video-postrender-callback=%lld,"
"video-data=%lld,"
"no-time-sync},"
, (long long int)(intptr_t)(void*)&cbVideoPrerender
, (long long int)(intptr_t)(void*)&cbVideoPostrender //This would normally be useful data, 100 is just test data
, (long long int)200 //Test data
);
const char * const vlc_args[] = {
"-I", "dummy", // Don't use any interface
"--ignore-config", // Don't use VLC's config
"--extraintf=logger", // Log anything
"--verbose=1", // Be verbose
"--sout", smem_options // Stream to memory
};
// We launch VLC
inst = libvlc_new(sizeof(vlc_args) / sizeof(vlc_args[0]), vlc_args);
...
return 0;
}
问题已更新
我检查了我的两个回调函数似乎正确执行。
_RV32究竟输出什么样的数据?它是否适合 CV_8U3C(此处需要无符号 8 位 int 3 通道?
_我需要在我的 Mat 类中添加一个步骤吗? (步骤 - 每个矩阵行占用的字节数)
UPDATED2
我将 RV32 更改为 RV24,这更有意义。我添加了 cvtColor,因为 Mat 矩阵似乎需要 BGR 像素而不是 RGB,但图像仍然无法正确显示。
_是否有一个 vcodec 可以给我一个 YUV 格式作为输出,这样我就可以在尝试输出 opencv::Mat img 之前测试像素数据?
[EDIT OUTPUT IMG](通过更改 vlc输入 CV_8UC4 四通道(不知道为什么)我们几乎可以看到框架,但质量真的很差,为什么会这样?
[解决方案]
我发现我视频开头的图像质量很差,这就是为什么我的 Mat imshow() 向我展示了这么丑陋的东西,上面的代码现在应该可以工作了(显然不需要 cvtColor)
【问题讨论】:
-
afaik,像素在 p_pixel_buffer 中,而不是在 p_video_data 中。另外,unlock() 不应该在 设置 Mat 的像素之后执行吗?
-
我也有这个想法,但是如何将我的像素数组提供给 Mat 构造函数?
-
以同样的方式,你现在就做。只需更改 varnames
-
忍耐一下,我上次使用 vlc 已经很久了(也没有使用 smem),但我必须用
libvlc_video_set_format( mp, "RV24", W,H, W * 3 );明确指定 rgb 格式> -
好的,我更改了像素缓冲区指针,没有更多致命错误,但图像输出真的很奇怪(黑色带有一些彩色点我现在将尝试使用格式)
标签: c++ opencv image-processing libvlc mat