LibVLC SampleCode Thumbnailer: Difference between revisions
Jump to navigation
Jump to search
Pdherbemont (talk | contribs) warn around sleep(1), we'd better wait for a status change |
No edit summary |
||
| Line 21: | Line 21: | ||
libvlc_exception_clear (&ex); | libvlc_exception_clear (&ex); | ||
} | } | ||
#define TEMP "/tmp/vlc-video-thumbnailer.png" | |||
#define usage() \ | #define usage() \ | ||
fprintf( stderr, \ | fprintf( stderr, \ | ||
"Usage: %s input output\n" \ | "Usage: %s input output\n" \ | ||
"input being any video VLC can read, and output a png file" \ | "input being any video VLC can read, and output a png file\n" \ | ||
, argv[0] ) | , argv[0] ) | ||
int main( int argc, const char **argv ) | int main( int argc, const char **argv ) | ||
{ | { | ||
if( argc != 3 ) | if( argc != 3 && argc != 5 ) | ||
{ | { | ||
usage(); | usage(); | ||
| Line 41: | Line 43: | ||
const char *input = argv[1]; | const char *input = argv[1]; | ||
const char *output = argv[2]; | const char *output = argv[2]; | ||
int i_width = 0; | |||
int i_height = 0; | |||
if( argc == 5 ) | |||
{ | |||
if( memcmp( argv[1], "-s", 3 ) != 0 ) | |||
{ | |||
usage(); | |||
return 1; | |||
} | |||
i_width = atoi( argv[2] ); | |||
input = argv[3]; | |||
output = argv[4]; | |||
} | |||
libvlc_exception_init( &ex ); | libvlc_exception_init( &ex ); | ||
| Line 82: | Line 98: | ||
sleep(1); /* TODO: wait for a status change */ | sleep(1); /* TODO: wait for a status change */ | ||
libvlc_video_take_snapshot( mi, | libvlc_video_take_snapshot( mi, TEMP, i_width, i_height, &ex ); | ||
catch(); | catch(); | ||
sleep(1); | |||
/* We use a destination snapshot with a .png extension, since libvlc use the extension to detect the encoder used */ | |||
char *mv; | |||
if( asprintf( &mv, "mv %s %s", TEMP, output ) == -1 ) | |||
return 1; | |||
system( mv ); | |||
free( mv ); | |||
libvlc_media_instance_stop( mi, &ex ); | libvlc_media_instance_stop( mi, &ex ); | ||
Revision as of 20:04, 4 December 2007
This sample code will generate a thumbnail from any media.
/* Copyright Rafael Carre (licence WTFPL) */
#include <stdio.h>
#include <vlc/libvlc.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
static libvlc_exception_t ex;
static void catch (void)
{
if (libvlc_exception_raised (&ex))
{
fprintf (stderr, "Exception: %s\n",
libvlc_exception_get_message (&ex));
exit(1);
}
libvlc_exception_clear (&ex);
}
#define TEMP "/tmp/vlc-video-thumbnailer.png"
#define usage() \
fprintf( stderr, \
"Usage: %s input output\n" \
"input being any video VLC can read, and output a png file\n" \
, argv[0] )
int main( int argc, const char **argv )
{
if( argc != 3 && argc != 5 )
{
usage();
if( argc == 2 && ( !strcmp( argv[1], "-h" ) || strcmp( argv[1], "--help") ) )
return 0;
else
return 1;
}
const char *input = argv[1];
const char *output = argv[2];
int i_width = 0;
int i_height = 0;
if( argc == 5 )
{
if( memcmp( argv[1], "-s", 3 ) != 0 )
{
usage();
return 1;
}
i_width = atoi( argv[2] );
input = argv[3];
output = argv[4];
}
libvlc_exception_init( &ex );
const char* const args[] = {
"-I", "dummy", /* no interface */
"--vout", "dummy", /* we don't want video */
"--no-audio", /* we don't want audio */
"--verbose=1", /* show only errors & warnings */
"--no-media-library", /* don't want that */
"--services-discovery", "", /* nor that */
"--no-video-title-show", /* nor the filename displayed */
"--no-sub-autodetect", /* don't want subtitles */
"--control", "", /* don't want interface */
"--extraintf", "" /* AT ALL ! */
};
int nargs = sizeof(args) / sizeof(args[0]);
libvlc_instance_t *libvlc = libvlc_new( nargs, args, &ex );
catch();
libvlc_media_instance_t *mi;
libvlc_media_descriptor_t *md;
md = libvlc_media_descriptor_new( libvlc, input, &ex );
catch();
mi = libvlc_media_instance_new_from_media_descriptor( md, &ex );
catch();
libvlc_media_descriptor_release( md );
libvlc_media_instance_play( mi, &ex );
catch();
/* go to position 30% to avoid introductions */
libvlc_media_instance_set_position( mi, 0.30, &ex );
catch();
/* leave vlc some time to start playing */
sleep(1); /* TODO: wait for a status change */
libvlc_video_take_snapshot( mi, TEMP, i_width, i_height, &ex );
catch();
sleep(1);
/* We use a destination snapshot with a .png extension, since libvlc use the extension to detect the encoder used */
char *mv;
if( asprintf( &mv, "mv %s %s", TEMP, output ) == -1 )
return 1;
system( mv );
free( mv );
libvlc_media_instance_stop( mi, &ex );
catch();
libvlc_media_instance_release( mi );
libvlc_release( libvlc, &ex );
catch();
return 0;
}