Okay, so I was successful with getting libVLC to play a video in full screen in just a few lines of code. This was a great success. However, when using a play list, each item is shown in a window.
Tonight I haven’t the time to set up a full screen window and attach libVLC to it, so I will try that tomorrow. There’s tons of Linux windowing API’s I can use. Just a standard X11 window will be fine as there will be no user input at all.
It’s no use having a black background as a desktop as some videos will end with a different coloured background.
Ah well. Plod on tomorrow. Almost there.
If I fail then it will be a minimal build of ffmpeg or maybe just the OGV libraries and I will write a player myself which will take a tad longer than I wanted.
Sample C code on Linux:
#include <X11/X.h> #include <X11/Xlib.h> #include <strings.h> #include <memory.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> extern "C" { #include <vlc/vlc.h> } const char *files[] = { "/media/wlgfx/WLGfx/WLGfxMedia/2017July/WLGfxJul/wlgfx.ogv", "/media/wlgfx/WLGfx/WLGfxMedia/2017July/sample1/sample.ogv" }; const int files_count = 2; void play_media(libvlc_instance_t *inst, const char *uri, uint32_t win) { libvlc_media_t *m = libvlc_media_new_path(inst, uri); libvlc_media_player_t *mp = libvlc_media_player_new_from_media(m); libvlc_set_fullscreen(mp, 1); libvlc_media_player_set_xwindow(mp, win); libvlc_media_player_play(mp); sleep(1); // enough time to start while (libvlc_media_get_state(m) == libvlc_Playing) usleep(200); libvlc_media_release(m); libvlc_media_player_release(mp); } int main() { Display* dis = XOpenDisplay(NULL); Window win = XCreateSimpleWindow(dis, RootWindow(dis, 0), 0, 0, 10, 10, 0, BlackPixel (dis, 0), BlackPixel(dis, 0)); Screen *screen; // get screen size screen = ScreenOfDisplay(dis, 0); int dwid = screen->width; int dhgt = screen->height; Window root; // position mouse to bottom left (hide it) root = XRootWindow(dis, 0); XSelectInput(dis, root, KeyReleaseMask); XWarpPointer(dis, None, root, 0, 0, 0, 0, dwid, dhgt); XFlush(dis); XInitThreads(); Atom wm_state = XInternAtom(dis, "_NET_WM_STATE", False); Atom fullscreen = XInternAtom(dis, "_NET_WM_STATE_FULLSCREEN", False); XEvent xev; memset(&xev, 0, sizeof(xev)); xev.type = ClientMessage; xev.xclient.window = win; xev.xclient.message_type = wm_state; xev.xclient.format = 32; xev.xclient.data.l[0] = 1; xev.xclient.data.l[1] = fullscreen; xev.xclient.data.l[2] = 0; XMapWindow(dis, win); XSendEvent (dis, DefaultRootWindow(dis), False, SubstructureRedirectMask | SubstructureNotifyMask, &xev); XFlush(dis); printf("XWindow initialised with threading enabled\n"); libvlc_instance_t *vlc_instance = libvlc_new(0, NULL); printf("Playing media files in vlc attached to window\n"); uint32_t id = (uint32_t) win; play_media(vlc_instance, files[0], id); play_media(vlc_instance, files[1], id); play_media(vlc_instance, files[0], id); play_media(vlc_instance, files[1], id); libvlc_release(vlc_instance); printf("Hopefully all was successful\n"); return 0; }