Воспроизведение многодорожечного файла/потока с использованием libvlc (ubuntu)

Я использую последнюю версию vlc, и не имеет значения, находятся ли они в одном окне или в нескольких окнах, если вы можете видеть их все одновременно.

Вот что я пытался:

int main(int argc, char **argv)
{
    libvlc_instance_t *inst;
    libvlc_media_player_t *mp;
    libvlc_media_t *m;

    inst = libvlc_new(0, NULL);
    m = libvlc_media_new_path(inst, "/tmp/mpt-smart-travels-classical-clip.ts");
    mp = libvlc_media_player_new_from_media(m);
    libvlc_media_release(m);
    libvlc_media_player_play(mp);


    libvlc_track_description_t *videoIDs = libvlc_video_get_track_description(mp); 
    int numberOfTracks = sizeof videoIDs;
    int count = 0;
    int id;
    while (count <= numberOfTracks) {
      id = videoIDs[count];
      libvlc_video_set_track(mp,id);
      count += 1;
      }

    sleep(10);

    libvlc_media_player_stop(mp);
    libvlc_media_player_release(mp);
    libvlc_release(inst);


    return 0;
}

$ gcc $(pkg-config --cflags libvlc) -c test.c -o test.o

$ gcc test.o -o test $(pkg-config --libs libvlc)

Указатель с именем p_next может потребоваться для получения идентификаторов следующего потока. videolan.org/developers/vlc/doc/doxyge/html/structlibvlc_трек_description__t.html


person John    schedule 03.07.2013    source источник


Ответы (1)


Можете ли вы более конкретно рассказать о том, что вы пытаетесь сделать?

Код в вопросе не компилируется, не может перечислить треки ни в одном потоке. Ниже приведены минимальные изменения для того, чтобы этот код стал осмысленным.

#include <vlc/vlc.h>
#include <unistd.h>
#include <stdlib.h>

int main( int argc, char **argv )
{
    libvlc_instance_t *inst;
    libvlc_media_player_t *mp;
    libvlc_media_t *m;

    if ( argc < 2 )
    {
        fprintf( stderr, "Please provide a file name to open.\n" );
        exit( 1 );
    }

    inst = libvlc_new( 0, NULL );
    m = libvlc_media_new_path( inst, argv[1] );
    mp = libvlc_media_player_new_from_media( m );
    libvlc_media_release( m );
    libvlc_media_player_play( mp );

    sleep( 1 );

    libvlc_track_description_t *track_desc = libvlc_video_get_track_description( mp );
    int numberOfTracks = libvlc_video_get_track_count( mp );

    fprintf( stderr, "numberOfTracks=%d\n", numberOfTracks );

    while ( track_desc != NULL )
    {
        int id = track_desc->i_id;

        if ( id == -1 )
        {
            fprintf( stderr, "Not switching to pseudo-track id=%d name=%s\n", id, track_desc->psz_name );
        }
        else
        {
            fprintf( stderr, "Switching to video track id=%d name=%s\n", id, track_desc->psz_name );
            libvlc_video_set_track( mp, id );
        }

        sleep( 1 );
        track_desc = track_desc->p_next;
    }

    fprintf( stderr, "Finished enumerating tracks. Waiting a little.\n" );

    sleep( 10 );

    libvlc_media_player_stop( mp );
    libvlc_media_player_release( mp );
    libvlc_release( inst );


    return 0;
}

Опять же, можете ли вы более конкретно указать, что вы пытаетесь сделать?

person Stéphane Gourichon    schedule 18.12.2014