Разработка нативных приложений Tizen

Воспроизведение видео

Показывать лекцию целиком

Создание экрана

С помощью плеера можно воспроизводить аудио и видео. Для воспроизведения видео требуется экран. Для работы с плеером мы создадим объект image.

Создайте новый проект ‘VideoPlayerSample.’ Скопируйте в папку /res три видеофайла "1.3gp", "1.mp4", "2.mp4".

Для создания экрана потребуется выполнить следующие действия:

  • Создать объект EVAS
  • Создать объект image
  • Указать какой объект image будет дисплеем для плеера
  • Откройте файл исходного кода внесите следующие изменения в начале файла.

    #include "videoplayersample.h"
    #include <player.h>
    typedef struct appdata {
    Evas_Object *win;
    Evas_Object *conform;
    Evas_Object *label;
    player_h player;
    Evas_Object *video_rect;
    } appdata_s;
    const char* file_name[] = { "1.3gp", "1.mp4", "2.mp4" };
    

    player_h — это структура Player, которая воспроизводит медиа файлы, такие, как аудио и видео .

    video_rect — это объект image, в котором отображается видео.

    file_name[] - это массив строк, в котором хранятся названия файлов.

    Добавьте следующий код выше функции create_base_gui() function.

    static void
    my_table_pack(Evas_Object *table, Evas_Object *child, int x, int y, int w, int h)
    {
    evas_object_size_hint_align_set(child, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(child, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    elm_table_pack(table, child, x, y, w, h);
    evas_object_show(child);
    }
    

    Затем добавьте код а функцию create_base_gui().

    /* Conformant */
    /*ad->conform = elm_conformant_add(ad->win);
    elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
    elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE);
    evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    elm_win_resize_object_add(ad->win, ad->conform);
    evas_object_show(ad->conform);*/
    /* Label*/
    /*ad->label = elm_label_add(ad->conform);
    elm_object_text_set(ad->label, "<align=center>VideoPlayer Sample</align>");
    evas_object_size_hint_weight_set(ad->label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    elm_object_content_set(ad->conform, ad->label);*/
    Evas_Object *bg, *btn;
    /* Background */
    bg = elm_bg_add(ad->win);
    elm_bg_color_set(bg, 0, 0, 0);
    elm_win_resize_object_add(ad->win, bg);
    evas_object_show(bg);
    {
    /* Box to put the table in so we can bottom-align the table
    * window will stretch all resize object content to win size */
    Evas_Object *box = elm_box_add(ad->win);
    evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    elm_win_resize_object_add(ad->win, box);
    evas_object_show(box);
    /* Table */
    Evas_Object *table = elm_table_add(ad->win);
    /* Make table homogenous - every cell will be the same size */
    elm_table_homogeneous_set(table, EINA_TRUE);
    /* Set padding of 10 pixels multiplied by scale factor of UI */
    elm_table_padding_set(table, 10 * elm_config_scale_get(), 10 * elm_config_scale_get());
    /* Let the table child allocation area expand within in the box */
    evas_object_size_hint_weight_set(table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    /* Set table to fiill width but align to bottom of box */
    evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL);
    elm_box_pack_end(box, table);
    evas_object_show(table);
    {
    /* Container: standard table */
    Evas_Object *tbl = elm_table_add(ad->win);
    evas_object_size_hint_weight_set(tbl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_align_set(tbl, EVAS_HINT_FILL, EVAS_HINT_FILL);
    elm_object_content_set(ad->conform, tbl);
    evas_object_show(tbl);
    /* The video object */
    ad->video_rect = video_rect_add(tbl);
    my_table_pack(table, ad->video_rect, 0, 0, 3, 3);
    }
    }
    /* Show window after base gui is set up */
    evas_object_show(ad->win);
    

    Мы создали контрол Bg для того, чтобы фоновый цвет стал черным. Добавьте две функции выше create_base_gui().

    // Get full path of resource file
    static inline const char *get_resource_path(const char *file_path)
    {
    static char absolute_path[PATH_MAX] = {'\0'};
    static char *res_path_buff = NULL;
    if(res_path_buff == NULL)
    {
    res_path_buff = app_get_resource_path();
    }
    snprintf(absolute_path, PATH_MAX, "%s%s", res_path_buff, file_path);
    return absolute_path;
    }
    // Create Image for screen
    static Evas_Object *
    video_rect_add(Evas_Object *parent)
    {
    Evas *evas = evas_object_evas_get(parent);
    Evas_Object *image = evas_object_image_filled_add(evas);
    evas_object_size_hint_weight_set(image, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_align_set(image, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_show(image);
    return image;
    }
    

    Функция get_resource_path возвращает полные пути файлов, хранящихся в папке /res. Они нам понадобятся при загрзке аудиофайлов.

    Функция video_rect_add() создает объекты Evas и Image в области экрана.

    Запустите экран. Вся его площадь будет черной.

    Загрузка видеофайла

    При запуске приложения автоматически создается объект Player и загружается первый видеофайл. Добавьте код в конце функции create_base_gui().

    /* Show window after base gui is set up */
    evas_object_show(ad->win);
    // Create Player
    ad->player = create_player();
    // Load audio file to Player
    prepare_player(ad, 0);
    }
    

    Функция create_player() создает объект Player, в то время как функция prepare_player() загружает видеофайл. Добавьте пять функций выше create_base_gui() function. Здесь все очень похоже на процесс создания аудиоплеера.

    // Get player state
    static player_state_e
    get_player_state(player_h player)
    {
    player_state_e state;
    player_get_state(player, state);
    return state;
    }
    // Play completed event function
    static void
    on_player_completed(player_h* player)
    {
    if(player)
    player_stop(player);
    }
    // Create player
    static player_h
    create_player()
    {
    player_h player;
    player_create(player);
    player_set_sound_type(player, SOUND_TYPE_MEDIA);
    player_set_volume(player, 1.0, 1.0);
    player_set_looping(player, false);
    player_set_completed_cb(player, on_player_completed, player);
    return player;
    }
    // Stop play
    static void
    stop_player(void *data, Evas_Object *obj, void *event_info)
    {
    appdata_s *ad = data;
    if( get_player_state(ad->player) == PLAYER_STATE_PLAYING || get_player_state(ad->player) == PLAYER_STATE_PAUSED)
    player_stop(ad->player);
    }
    // Load video file to Player
    static void
    prepare_player(appdata_s* ad, int index)
    {
    player_stop(ad->player);
    // Close file
    player_unprepare(ad->player);
    const char* file = file_name[index];
    // Get full path of resource file
    const char *res_path = get_resource_path(file);
    // Load file
    player_set_uri(ad->player, res_path);
    player_set_display(ad->player, PLAYER_DISPLAY_TYPE_EVAS, GET_DISPLAY(ad->video_rect));
    player_set_display_mode(ad->player, PLAYER_DISPLAY_MODE_FULL_SCREEN);
    // Prepare play
    int result = player_prepare(ad->player);
    dlog_print(DLOG_INFO, "tag", "File load : %d", result);
    }
    

    Функция get_player_state() возвращает текущее состояние плеера.

    player_get_state(player_h, player_state_e) - это API, который возвращает текущее состояние плеера.

    player_stop(player_h) - это API, который останавливает воспроизведение.

    Функция create_player() создает объект Player .

    player_create(player_h *) - это API, который создает Player object.

    Воспроизведение видео

    Добавьте код в конце функции create_base_gui().

    /* Table */
    ~
    elm_box_pack_end(box, table);
    evas_object_show(table);
    {
    
    /* Play Button */
    btn = elm_button_add(ad->win);
    elm_object_text_set(btn, "Play");
    evas_object_smart_callback_add(btn, "clicked", start_player, (void*)ad);
    my_table_pack(table, btn, 0, 3, 1, 1);
    
    /* Container: standard table */
    Evas_Object *tbl = elm_table_add(ad->win);
    evas_object_size_hint_weight_set(tbl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_align_set(tbl, EVAS_HINT_FILL, EVAS_HINT_FILL);
    elm_object_content_set(ad->conform, tbl);
    evas_object_show(tbl);
    

    Добавим обработчик событий для кнопки. Введите следующий код выше функции create_base_gui().

    // Start play
    static void
    start_player(void *data, Evas_Object *obj, void *event_info)
    {
    appdata_s *ad = data;
    if( get_player_state(ad->player) != PLAYER_STATE_PLAYING)
    player_start(ad->player);
    }
    

    Функция start_player() запускае воспроизведение видео.

    player_start(player_h) - это API, который запускае воспроизведение видео.

    Запустите проект

    Пауза и остановка воспроизведения

    Добавим код кнопок Pause и Stop в функцию create_base_gui() .

    /* Play Button */
    btn = elm_button_add(ad->win);
    elm_object_text_set(btn, "Play");
    evas_object_smart_callback_add(btn, "clicked", start_player, (void*)ad);
    my_table_pack(table, btn, 0, 3, 1, 1);
    
    /* Pause Button */
    btn = elm_button_add(ad->win);
    elm_object_text_set(btn, "Pause");
    evas_object_smart_callback_add(btn, "clicked", pause_player, (void*)ad);
    my_table_pack(table, btn, 1, 3, 1, 1);
    
    /* Stop Button */
    btn = elm_button_add(ad->win);
    elm_object_text_set(btn, "Stop");
    evas_object_smart_callback_add(btn, "clicked", stop_player, (void*)ad);
    my_table_pack(table, btn, 2, 3, 1, 1);
    
    /* Container: standard table */
    Evas_Object *tbl = elm_table_add(ad->win);
    evas_object_size_hint_weight_set(tbl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_align_set(tbl, EVAS_HINT_FILL, EVAS_HINT_FILL);
    elm_object_content_set(ad->conform, tbl);
    evas_object_show(tbl);
    

    Теперь нам потребуются обработчики событий. Добавьте код выше create_base_gui().

    // Pause play
    static void pause_player(void *data, Evas_Object *obj, void *event_info)
    {
    appdata_s *ad = data;
    if( get_player_state(ad->player) == PLAYER_STATE_PLAYING )
    player_pause(ad->player);
    }
    

    Функция start_player() делает паузу в воспроизведении.

    player_start(player_h) - это API, который делает паузу в воспроизведении.

    Запустите пример.

    Смена видеофайлов

    Добавьте код в функции create_base_gui() function.

    /* Stop Button */
    btn = elm_button_add(ad->win);
    elm_object_text_set(btn, "Stop");
    evas_object_smart_callback_add(btn, "clicked", stop_player, (void*)ad);
    my_table_pack(table, btn, 2, 3, 1, 1);
    
    /* File Load-1 Button */
    btn = elm_button_add(ad->win);
    elm_object_text_set(btn, "File-1");
    evas_object_smart_callback_add(btn, "clicked", btn_load_file1, (void*)ad);
    my_table_pack(table, btn, 0, 4, 3, 1);
    
    /* File Load-2 Button */
    btn = elm_button_add(ad->win);
    elm_object_text_set(btn, "File-2");
    evas_object_smart_callback_add(btn, "clicked", btn_load_file2, (void*)ad);
    my_table_pack(table, btn, 0, 5, 3, 1);
    
    /* Container: standard table */
    Evas_Object *tbl = elm_table_add(ad->win);
    evas_object_size_hint_weight_set(tbl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_align_set(tbl, EVAS_HINT_FILL, EVAS_HINT_FILL);
    elm_object_content_set(ad->conform, tbl);
    evas_object_show(tbl);
    

    Добавьте обработчики событий кнопок выше функции create_base_gui().

    static void
    btn_load_file1(void *data, Evas_Object *obj, void *event_info)
    {
    appdata_s *ad = data;
    // Load file to Player
    prepare_player(ad, 0);
    }
    static void
    btn_load_file2(void *data, Evas_Object *obj, void *event_info)
    {
    appdata_s *ad = data;
    // Load file to Player
    prepare_player(ad, 1);
    }
    

    Запустите пример

    Вернуться к учебному плану