使用libvlc

时间:2015-07-26 07:16:39

标签: c++ qt memory vlc libvlc

我想在libvlc中播放一个缓冲区,该缓冲区由另一个线程的信号/插槽填充。我已经使用了libvlc的read_callbacks但它可以用mingw编译并且为msvc编译它是一个很难的过程(see here)。(我想在msvc2012中编译我的程序)。所以我想使用imem选项,我写了下面的代码,但它崩溃了,没有显示任何内容。

#include <QMainWindow>
#include <QFile>

#include <vlc/vlc.h>
#include <vlc/libvlc_media_player.h>
#include <vlc/libvlc_media.h>
using namespace std ;


const int  len = (820 * 600 * 4) + 31;

int imemGetCallback (void *data, const char *cookie,int64_t *dts, int64_t *pts,unsigned *flags, size_t * bufferSize, void ** buffer);

int imemReleaseCallback (void *data, const char *cookie, size_t bufferSize, void * buffer);


int main(){

    char smem_options1[2000];
    char venc_options[1000];

    sprintf(venc_options,"bframes=6,ref=6");

    char str_imem_get[100], str_imem_release[100],str_imem_data[100];
    sprintf(str_imem_get, "--imem-get=%ld", imemGetCallback);
    sprintf(str_imem_release, "--imem-release=%ld", imemReleaseCallback);

    const char * const vlc_args[] = {
        "-I","dummy",
        "--ignore-config",
        "--demux","rawvideo",
        "--rawvid-fps","30",
        "--rawvid-width","820",
        "--rawvid-height","600",
        "--rawvid-chroma","RV24",
        "--imem-channels=1",
        "--imem-data=0",
        "--imem-cat=4",
        "--imem-fps=30",
        "--imem-codec=none",


        str_imem_get,
        str_imem_release

    };

    libvlc_instance_t * inst_broadcast =libvlc_new(sizeof(vlc_args) / sizeof(vlc_args[0]), vlc_args);;// libvlc_new(vlc_argc, vlc_argv);


    libvlc_media_t  * m = libvlc_media_new_location(inst_broadcast, "imem://");


   auto  _vlcmp = libvlc_media_player_new_from_media(m);

    libvlc_media_player_play(_vlcmp);


}

int imemGetCallback (void *data, const char *cookie,int64_t *dts, int64_t *pts,unsigned *flags, size_t * bufferSize, void ** buffer)
{
    int64_t uS = 33333; // 30 fps
    static int index=0;
    *bufferSize = len; 
    *buffer = buf;
    *dts = *pts = 33333;
    return 1;
}


int imemReleaseCallback (void *data, const char *cookie, size_t bufferSize, void * buffer)
{
    return 0;
}

我如何使用imem选项来完成这项工作?

0 个答案:

没有答案