使用libvlc进入缓冲区的视频流

时间:2015-01-20 05:14:40

标签: streaming video-streaming libvlc

我正在努力从文件到我的缓冲区,以便我可以通过我的自定义端口/协议发送它,我面临几个问题,所以请帮助我

我在哪里:

  • 从wiki.videolan.org/Stream_to_memory_(smem)_tutorial/阅读教程后,我能够编译并运行
  • 我已经对smem选项进行了以下更改以使用视频(请参阅最后提到的完整代码)

    sprintf(smem_options, "#transcode{vcodec=RV32}:smem{video-postrender-callback=%lld,video-prerender-callback=%lld}",
    // We are using transcode because smem only support raw audio and video formats
    (long long int)(intptr_t)(void*)&handleStream, (long long int)(intptr_t)(void*)&prepareRender);
    
  • 我可以看到正在调用prerender和postrender并且正在提供数据

myProblems:

  • 目前要测试输出我将缓冲区直接转储到文件中,有些东西比如[code] fwrite(p_pixel_buffer,sizeof(char),i_size,myfile); [/码] 但vlc播放器或任何其他流媒体播放器都没有读取转储文件所以我确定我在这里缺少一些东西,因为如果我要求vlc播放器通过提供完整的转码值直接写入文件,那么事情就好了

    sprintf(smem_options,
        "#transcode{vcodec=theo,vb=800,acodec=vorb,ab=128,channels=2,samplerate=44100}:file{dst=stream-output.ogg}"
    );
    

myQuestions

  • 从缓冲区读取是否正确?因为我读了
  

首先,快速警告:从VLC2.2开始(当前的git版本,到   即将发布),size参数是size_t。没有API   涂抹(然而?希望这会改变),这很糟糕,所以这会   默默地打破你的申请。

来自Get frame from video with libvlc smem and convert it to opencv Mat. (c++)

如果是的话       *有没有其他API我可以挂钩并获取缓冲区?

如果不是那么     *我做错了什么以及为完成这项工作我还需要做些多少工作?

任何指针/示例程序都会很有帮助

PS:

  • 这是我正在运行的完整代码pastebin.com/Dp8rSHuM&
  • 日志文件输出pastebin.com/z5iVD0Jb 问候, 拉吉夫

2 个答案:

答案 0 :(得分:0)

您的代码和过程看起来是正确的,但您可能无法打开结果数据的原因是因为您将原始图像数据写入缓冲区,该缓冲区只是BGR或其他像素数据而非视频文件VLC会打开的。使用SMEM接口,您基本上可以告诉VLC将哪种输出格式转换为内存,因此在您为OpenCV链接的示例中,它们转码为BGR或其他可以在cv :: Mat结构中使用的其他格式。

答案 1 :(得分:0)

您还可以在C ++中检查为smem模块编写的this sample code。它不保存缓冲区,但至少提供了一种方便的方式来访问视频和音频的缓冲区。

并且必须说当前的VLC 2.2.4在与smem模块一起转码流时会出现问题。最新3.0.0每晚建立接缝以克服这个问题。

或者,您可以使用libvlc_video_set_callbacks,libvlc_video_set_format_callbacks,libvlc_audio_set_callbacks和libvlc_audio_set_format_callbacks函数来访问数据。有关详细信息,请参阅sample codea discussion