微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何使用 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 举报,一经查实,本站将立刻删除。