如何使用 libvlc 播放 yuv 原始数据?

问题描述

我正在处理一个使用 vlc-3.0.12-win64 的视频处理项目。

我们项目中的另一个模块将生成 yuv 原始数据,现在我们需要渲染 yuv 数据。

但目前还没有解决方案。

因为我们已经使用过 libvlc,所以我们不喜欢使用其他技术知识,例如 D11 或 SDL。

我们知道下面的命令行可以在 VLC 播放器中播放 yuv 文件

vlc --rawvid-fps 25 --rawvid-width 1920 --rawvid-height 1080 --rawvid-chroma I420 input.yuv

问题是我们可以让 libvlc 做同样的事情吗?

我的测试源代码

int open_callback(void* opaque,void** datap,uint64_t* sizep)
{
    ifstream* file = (ifstream*)(opaque);
    file->seekg(0,file->beg);
    *sizep = file->tellg();
    *datap = opaque;
    return 0;
}

ssize_t read_callback(void* opaque,unsigned char* buf,size_t len)
{
    ifstream* file = (ifstream*)(opaque);
    file->read((char*)(buf),len);

    return file->gcount();
}

int seek_callback(void* opaque,uint64_t offset)
{
    ((ifstream*)(opaque))->seekg(offset);
    return 0;                         
}

void close_callback(void* opaque)
{
    ((ifstream*)(opaque))->close();
}

void testVLC()
{
    libvlc_instance_t* Instance;
    libvlc_media_player_t* mp;

    Instance = libvlc_new(0,NULL);

    //const TCHAR* FilePath = L"C:\\Users\\abc\\Desktop\\1.mp4"; //vidoe can be shown if we enable this line.
    const TCHAR* FilePath = L"C:\\Users\\abc\\Desktop\\2.yuv";

    ifstream* FileStream = new std::ifstream(FilePath,std::ios::binary | std::ios::ate);

    libvlc_media_t* media = libvlc_media_new_callbacks(
        Instance,open_callback,read_callback,seek_callback,close_callback,FileStream);

    mp = libvlc_media_player_new_from_media(media);

    libvlc_media_release(media);
    libvlc_media_player_play(mp);
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...