SDL2.0 VLC ubuntu安装和黑屏问题

开发环境安装:

1,执行:"sudo apt-get build-dep libsdl1.2",确定依赖库都装全了。

sdl2.0没有正式发布到ubuntu,使用下面方法安装:

https://launchpad.net/~zoogie/+archive/sdl2-snapshots

 sudo apt-add-repository ppa:zoogie/sdl2-snapshots 

sudo apt-get update

sudo apt-get install libsdl2 libsdl2-dbg libsdl2-dev libsdl2-image libsdl2-image-dev libsdl2-ttf libsdl2-ttf-dev libsdl2-mixer  libsdl2-mixer-dev

(在ubuntu 13.10 中,依赖库: sudo apt-get build-dep libsdl2)

 2, vlc的安装

 sudo apt-get install libvlc-dev

3,运行示例代码

// libSDL and libVLC sample code.
// License: [http://en.wikipedia.org/wiki/WTFPL WTFPL]

#include <stdio.h>
#include <stdint.h>
#include <math.h>
#include <stdlib.h>
#include <assert.h>

#include "SDL/SDL.h"
#include "SDL/SDL_mutex.h"

#include "vlc/vlc.h"

#define WIDTH 640
#define HEIGHT 480

#define VIDEOWIDTH 320
#define VIDEOHEIGHT 240

struct context {
    SDL_Renderer *renderer;
    SDL_Texture *texture;
    SDL_mutex *mutex;
    int n;
};

// VLC prepares to render a video frame.
static void *lock(void *data, void **p_pixels) {

    struct context *c = (context *)data;

    int pitch;
    SDL_LockMutex(c->mutex);
    SDL_LockTexture(c->texture, NULL, p_pixels, &pitch);

    return NULL; // Picture identifier, not needed here.
}

// VLC just rendered a video frame.
static void unlock(void *data, void *id, void *const *p_pixels) {

    struct context *c = (context *)data;

    uint16_t *pixels = (uint16_t *)*p_pixels;

    // We can also render stuff.
    int x, y;
    for(y = 10; y < 40; y++) {
        for(x = 10; x < 40; x++) {
            if(x < 13 || y < 13 || x > 36 || y > 36) {
                pixels[y * VIDEOWIDTH + x] = 0xffff;
            } else {
                // RV16 = 5+6+5 pixels per color, BGR.
                pixels[y * VIDEOWIDTH + x] = 0x02ff;
            }
        }
    }

    SDL_UnlockTexture(c->texture);
    SDL_UnlockMutex(c->mutex);
}

// VLC wants to display a video frame.
static void display(void *data, void *id) {

    struct context *c = (context *)data;

    SDL_Rect rect;
    rect.w = VIDEOWIDTH;
    rect.h = VIDEOHEIGHT;
    rect.x = (int)((1. + .5 * sin(0.03 * c->n)) * (WIDTH - VIDEOWIDTH) / 2);
    rect.y = (int)((1. + .5 * cos(0.03 * c->n)) * (HEIGHT - VIDEOHEIGHT) / 2);

    SDL_SetRenderDrawColor(c->renderer, 0, 80, 0, 255);
    SDL_RenderClear(c->renderer);
    SDL_RenderCopy(c->renderer, c->texture, NULL, &rect);
    SDL_RenderPresent(c->renderer);
}

static void quit(int c) {
    SDL_Quit();
    exit(c);
}

int main(int argc, char *argv[]) {

    libvlc_instance_t *libvlc;
    libvlc_media_t *m;
    libvlc_media_player_t *mp;
    char const *vlc_argv[] = {

        "--no-audio", // Don't play audio.
        "--no-xlib", // Don't use Xlib.

        // Apply a video filter.
        //"--video-filter", "sepia",
        //"--sepia-intensity=200"
    };
    int vlc_argc = sizeof(vlc_argv) / sizeof(*vlc_argv);

    SDL_Event event;
    int done = 0, action = 0, pause = 0, n = 0;

    struct context context;

    if(argc < 2) {
        printf("Usage: %s <filename>
", argv[0]);
        return EXIT_FAILURE;
    }

    // Initialise libSDL.
    if(SDL_Init(SDL_INIT_VIDEO) < 0) {
        printf("Could not initialize SDL: %s.
", SDL_GetError());
        return EXIT_FAILURE;
    }

    // Create SDL graphics objects.
    SDL_Window * window = SDL_CreateWindow(
            "Fartplayer",
            SDL_WINDOWPOS_UNDEFINED,
            SDL_WINDOWPOS_UNDEFINED,
            WIDTH, HEIGHT,
            SDL_WINDOW_SHOWN|SDL_WINDOW_RESIZABLE);
    if (!window) {
        fprintf(stderr, "Couldn't create window: %s
", SDL_GetError());
        quit(3);
    }

    context.renderer = SDL_CreateRenderer(window, -1, 0);
    if (!context.renderer) {
        fprintf(stderr, "Couldn't create renderer: %s
", SDL_GetError());
        quit(4);
    }

    context.texture = SDL_CreateTexture(
            context.renderer,
            SDL_PIXELFORMAT_BGR565, SDL_TEXTUREACCESS_STREAMING,
            VIDEOWIDTH, VIDEOHEIGHT);
    if (!context.texture) {
        fprintf(stderr, "Couldn't create texture: %s
", SDL_GetError());
        quit(5);
    }

    context.mutex = SDL_CreateMutex();

    // If you don't have this variable set you must have plugins directory
    // with the executable or libvlc_new() will not work!
    printf("VLC_PLUGIN_PATH=%s
", getenv("VLC_PLUGIN_PATH"));

    // Initialise libVLC.
    libvlc = libvlc_new(vlc_argc, vlc_argv);
    if(NULL == libvlc) {
        printf("LibVLC initialization failure.
");
        return EXIT_FAILURE;
    }

    m = libvlc_media_new_path(libvlc, argv[1]);
    mp = libvlc_media_player_new_from_media(m);
    libvlc_media_release(m);

    libvlc_video_set_callbacks(mp, lock, unlock, display, &context);
    libvlc_video_set_format(mp, "RV16", VIDEOWIDTH, VIDEOHEIGHT, VIDEOWIDTH*2);
    libvlc_media_player_play(mp);

    // Main loop.
    while(!done) {

        action = 0;

        // Keys: enter (fullscreen), space (pause), escape (quit).
        while( SDL_PollEvent( &event )) {

            switch(event.type) {
                case SDL_QUIT:
                    done = 1;
                    break;
                case SDL_KEYDOWN:
                    action = event.key.keysym.sym;
                    break;
            }
        }

        switch(action) {
            case SDLK_ESCAPE:
            case SDLK_q:
                done = 1;
                break;
            case ' ':
                printf("Pause toggle.
");
                pause = !pause;
                break;
        }

        if(!pause) { context.n++; }

        SDL_Delay(1000/10);
    }

    // Stop stream and clean up libVLC.
    libvlc_media_player_stop(mp);
    libvlc_media_player_release(mp);
    libvlc_release(libvlc);

    // Close window and clean up libSDL.
    SDL_DestroyMutex(context.mutex);
    SDL_DestroyRenderer(context.renderer);

    quit(0);

    return 0;
}

  

显示上是黑屏。没有视频显示。

后修改代码测试:

将struct context context; 放到全局。在display回调里面用全局render fill rect。在main循环里面也用同样的代码画方框。结果main中的方框可以画出。从vlc回调回的display画方框无法显示。

#include <stdio.h>
#include <stdint.h>
#include <math.h>
#include <stdlib.h>
#include <assert.h>

#include <SDL2/SDL.h>
#include <SDL2/SDL_mutex.h>

#include <vlc/vlc.h>

#define WIDTH 640
#define HEIGHT 480

#define VIDEOWIDTH 320
#define VIDEOHEIGHT 240

struct context {
	SDL_Renderer *renderer;
	SDL_Texture *texture;
	SDL_mutex *mutex;
	int n;
};

struct context context;

// VLC prepares to render a video frame.
static void *lock(void *data, void **p_pixels) {

	struct context *c = &context;

	int pitch;
	SDL_LockMutex(c->mutex);
	SDL_LockTexture(c->texture, NULL, p_pixels, &pitch);

	return NULL ; // Picture identifier, not needed here.
}

// VLC just rendered a video frame.
static void unlock(void *data, void *id, void * const *p_pixels) {

	struct context *c = &context;

	uint16_t *pixels = (uint16_t *) *p_pixels;

	/*
	 // We can also render stuff.
	 int x, y;
	 for (y = 10; y < 40; y++) {
	 for (x = 10; x < 40; x++) {
	 if (x < 13 || y < 13 || x > 36 || y > 36) {
	 pixels[y * VIDEOWIDTH + x] = 0xffff;
	 } else {
	 // RV16 = 5+6+5 pixels per color, BGR.
	 pixels[y * VIDEOWIDTH + x] = 0x02ff;
	 }
	 }
	 }
	 */

	SDL_UnlockTexture(c->texture);
	SDL_UnlockMutex(c->mutex);
}

void draw(SDL_Rect *rect) {
	SDL_SetRenderDrawColor(context.renderer, rand() % 240, rand() % 240, rand() % 240, 0);
//    SDL_RenderClear(context.renderer);
//    SDL_RenderCopy(context.renderer, context.texture, NULL, rect);
	SDL_RenderFillRect(context.renderer, rect);

}

// VLC wants to display a video frame.
static void display(void *data, void *id) {

	printf("================================
");
	SDL_Rect rect;
	rect.w = VIDEOWIDTH;
	rect.h = VIDEOHEIGHT;
	rect.x = 0;
	rect.y = 0;
	draw(&rect);
	SDL_RenderPresent(context.renderer);
	SDL_Delay(3000);
}

static void quit(int c) {
	SDL_Quit();
	exit(c);
}

int main(int argc, char *argv[]) {

	libvlc_instance_t *libvlc;
	libvlc_media_t *m;
	libvlc_media_player_t *mp;
	char const *vlc_argv[] = { "-vvv", "--no-audio", // Don't play audio.
			"--no-xlib", // Don't use Xlib.

			// Apply a video filter.
			//"--video-filter", "sepia",
			//"--sepia-intensity=200"
			};
	int vlc_argc = sizeof(vlc_argv) / sizeof(*vlc_argv);

	SDL_Event event;
	int done = 0, action = 0, pause = 0, n = 0;

//    if(argc < 2) {
//        printf("Usage: %s <filename>
", argv[0]);
//        return EXIT_FAILURE;
//    }

	// Initialise libSDL.
	if (SDL_Init(SDL_INIT_VIDEO) < 0) {
		printf("Could not initialize SDL: %s.
", SDL_GetError());
		return EXIT_FAILURE;
	}

	// Create SDL graphics objects.
	SDL_Window * window = SDL_CreateWindow("Fartplayer", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WIDTH, HEIGHT,
			SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);
	if (!window) {
		fprintf(stderr, "Couldn't create window: %s
", SDL_GetError());
		quit(3);
	}

	context.renderer = SDL_CreateRenderer(window, 1, 0);
	if (!context.renderer) {
		fprintf(stderr, "Couldn't create renderer: %s
", SDL_GetError());
		quit(4);
	}

	context.texture = SDL_CreateTexture(context.renderer, SDL_PIXELFORMAT_BGR565, SDL_TEXTUREACCESS_STREAMING, VIDEOWIDTH, VIDEOHEIGHT);
	if (!context.texture) {
		fprintf(stderr, "Couldn't create texture: %s
", SDL_GetError());
		quit(5);
	}

	context.mutex = SDL_CreateMutex();

	// If you don't have this variable set you must have plugins directory
	// with the executable or libvlc_new() will not work!
	printf("VLC_PLUGIN_PATH=%s
", getenv("VLC_PLUGIN_PATH"));

	// Initialise libVLC.
	libvlc = libvlc_new(vlc_argc, vlc_argv);
	if (NULL == libvlc) {
		printf("LibVLC initialization failure.
");
		return EXIT_FAILURE;
	}

	m = libvlc_media_new_path(libvlc, "./test.mp4");
	mp = libvlc_media_player_new_from_media(m);
	libvlc_media_release(m);

	libvlc_video_set_callbacks(mp, lock, unlock, display, &context);
	libvlc_video_set_format(mp, "RV16", VIDEOWIDTH, VIDEOHEIGHT, VIDEOWIDTH * 2);
	libvlc_media_player_play(mp);

	// Main loop.
	while (!done) {

		action = 0;

		// Keys: enter (fullscreen), space (pause), escape (quit).
		while (SDL_PollEvent(&event)) {

			switch (event.type) {
			case SDL_QUIT:
				done = 1;
				break;
			case SDL_KEYDOWN:
				action = event.key.keysym.sym;
				break;
			}
		}

		switch (action) {
		case SDLK_ESCAPE:
		case SDLK_q:
			done = 1;
			break;
		case ' ':
			printf("Pause toggle.
");
			pause = !pause;
			break;
		}
		if (!pause) {
			context.n++;
		}

		SDL_Rect rect;
		rect.w = VIDEOWIDTH;
		rect.h = VIDEOHEIGHT;
		rect.x = VIDEOWIDTH;
		rect.y = VIDEOHEIGHT;
		draw(&rect);
		SDL_RenderPresent(context.renderer);

		SDL_Delay(3000);
	}

	// Stop stream and clean up libVLC.
	libvlc_media_player_stop(mp);
	libvlc_media_player_release(mp);
	libvlc_release(libvlc);

	// Close window and clean up libSDL.
	SDL_DestroyMutex(context.mutex);
	SDL_DestroyRenderer(context.renderer);

	quit(0);

	return 0;
}

  

单步跟踪后,发现render infor里面是opengl。将

context.renderer = SDL_CreateRenderer(window, -1, 0);

改成context.renderer = SDL_CreateRenderer(window, 1, 0);后,可以正常播放。

 可以打印出所有 render 信息:


int nRenderDrivers = SDL_GetNumRenderDrivers();
int i = 0;
for (; i < nRenderDrivers; i++) {
SDL_RendererInfo info;
SDL_GetRenderDriverInfo(i, &info); //d3d
printf("====info name %d: %s ===== ", i, info.name);
printf("====max_texture_height %d ===== ", i, info.max_texture_height);
printf("====max_texture_width %d ===== ", i, info.max_texture_width);

}

————————————————————————————

When you build SDL2, make sure that when you run the initial cmake 
step that all the video options are marked as ON, including 
VIDEO_OPENGL and VIDEO_X11_*. 

A quick way to make sure you've got all the dependencies you need is 
to run "sudo apt-get build-dep libsdl1.2"; this installs the list of 
build prerequisites for Ubuntu's SDL 1.2 package, which are more or 
less unchanged for SDL2. I believe it's libgl1-mesa-dev which contains 
the OpenGL headers.


 *** remove unity ****
sudo apt-get purge unity unity-2d unity-2d-common unity-2d-panel unity-2d-shell unity-2d-spread unity-asset-pool unity-common unity-lens-applications unity-lens-files unity-lens-music unity-lens-video unity-scope-musicstores unity-scope-video-remote unity-services indicator-messages indicator-status-provider-mc5 appmenu-qt appmenu-gtk appmenu-gtk3 lightdm unity-greeter overlay-scrollbar zeitgeist zeitgeist-core zeitgeist-datahub activity-log-manager-common activity-log-manager-control-center

ensure that SDL2 has full OpenGL and X support

 sudo apt install build-essential xorg-dev libudev-dev libts-dev libgl1-mesa-dev libglu1-mesa-dev libasound2-dev libpulse-dev libopenal-dev libogg-dev libvorbis-dev libaudiofile-dev libpng12-dev libfreetype6-dev libusb-dev libdbus-1-dev zlib1g-dev libdirectfb-dev
 

VLC 源码编译参考:
 
sudo apt-get install git libtool build-essential pkg-config autoconf
sudo apt-get build-dep vlc

原文地址:https://www.cnblogs.com/bigben0123/p/3305731.html