|
|
| (12 intermediate revisions by 3 users not shown) |
| Line 1: |
Line 1: |
| This sample code will generate a thumbnail from any media.
| | {{Lowercase}} |
| It can be used by nautilus instead of totem-video-thumbnailer
| | Moved [http://git.videolan.org/?p=vlc.git;a=blob;f=doc/libvlc/vlc-thumb.c]. |
| /* Copyright [[User:Funman|Rafaël Carré]] (licence [http://en.wikipedia.org/wiki/WTFPL WTFPL]) */
| |
| <pre>
| |
| #include <stdio.h>
| |
| #include <vlc/libvlc.h>
| |
| #include <stdlib.h>
| |
| #include <string.h>
| |
| #include <unistd.h>
| |
|
| |
|
| static libvlc_exception_t ex;
| | [[Category:libVLC]] |
| | |
| 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;
| |
| }
| |
| </pre>
| |