qq_40959271 2023-03-11 20:09 采纳率: 0%
浏览 80
已结题

c++上可以利用vlc播放已经转成BYTE*的视频数据吗

在c++上可以读取本地视频文件成BYTE数据,我们可以利用vlc播放这些数据吗?可以的话该如何播放。因为我想实时播放通过socket网络从服务端获取到的BYTE*视频数据。(请先运行下自己的代码能不能跑再发上来,因为太多人代码有问题了。)

  • 写回答

7条回答 默认 最新

  • CodeBytes 2023-03-11 20:14
    关注

    该回答引用ChatGPT

    如有疑问,可以回复我!

    实现方法:

    1、使用C++中的文件流读取本地视频文件。可以使用 std::ifstream 类来读取文件。例如:

    std::ifstream inputFileStream("path/to/video/file.mp4", std::ios::binary);
    
    

    2、将文件数据读入缓冲区。可以使用 std::vector 来存储缓冲区数据。例如:

    std::vector<unsigned char> buffer(std::istreambuf_iterator<char>(inputFileStream), {});
    
    

    3、将缓冲区数据作为输入传递给VLC。可以使用libVLC库来播放视频。以下是一个使用libVLC播放缓冲区数据的示例:

    
    // 初始化libVLC
    libvlc_instance_t* libvlcInstance = libvlc_new(0, NULL);
    
    // 创建VLC播放器
    libvlc_media_player_t* mediaPlayer = libvlc_media_player_new(libvlcInstance);
    
    // 创建内存输入流
    libvlc_media_t* media = libvlc_media_new_callbacks(
        libvlcInstance,
        [](void* data, void* buffer, size_t length, int64_t* /*dts*/, int64_t* /*pts*/) -> ssize_t {
            // 复制缓冲区数据到VLC输入缓冲区
            auto* bufferPtr = static_cast<unsigned char*>(buffer);
            auto* dataPtr = static_cast<std::vector<unsigned char>*>(data);
            auto bytesRead = std::min(length, dataPtr->size());
            std::copy(dataPtr->begin(), dataPtr->begin() + bytesRead, bufferPtr);
            dataPtr->erase(dataPtr->begin(), dataPtr->begin() + bytesRead);
            return bytesRead;
        },
        [](void* data) {
            // 删除内存输入流数据
            auto* dataPtr = static_cast<std::vector<unsigned char>*>(data);
            delete dataPtr;
        },
        [](void* /*data*/, void* /*media*/) -> int {
            return 0;
        },
        new std::vector<unsigned char>(std::move(buffer))
    );
    
    // 设置媒体源并播放
    libvlc_media_player_set_media(mediaPlayer, media);
    libvlc_media_player_play(mediaPlayer);
    
    // 等待播放完成
    libvlc_media_player_wait_until_playing(mediaPlayer);
    
    // 释放资源
    libvlc_media_player_release(mediaPlayer);
    libvlc_media_release(media);
    libvlc_release(libvlcInstance);
    
    

    在这个示例中,我们使用 libvlc_media_new_callbacks() 函数创建了一个内存输入流,该流将缓冲区数据作为输入传递给VLC。我们还使用 libvlc_media_player_set_media() 函数将媒体源设置为内存输入流,使用 libvlc_media_player_play() 函数开始播放视频,并使用 libvlc_media_player_wait_until_playing() 函数等待视频播放完成。最后,我们释放了所有资源。

    评论

报告相同问题?

问题事件

  • 系统已结题 3月19日
  • 修改了问题 3月12日
  • 创建了问题 3月11日

悬赏问题

  • ¥20 IDEA ssm项目 跳转页面报错500
  • ¥20 系统直接进入应急模式了,请教一下,人要裂开了
  • ¥15 页面初次加载时,JS调用对象可以调用成功,但是一旦跳转到另一个页面,再跳转回来后这个对象就显示undefind了,调用也调用不了了,什么原因?
  • ¥15 来个厉害的程序开发的,安排点活给你做
  • ¥15 rexroth indramotion MTX micro系统轴耦合编程
  • ¥100 springboot2.7.x 整合 sharding 的问题
  • ¥15 如何通过命令行操作统信360安全浏览器?
  • ¥15 upload-labs-master第三关
  • ¥15 关于LT3758反激式负压电源,功率三极管烧毁的问题
  • ¥20 aruba ap305 CAP转IAP