Воспроизведение видео
Создание экрана
С помощью плеера можно воспроизводить аудио и видео. Для воспроизведения видео требуется экран. Для работы с плеером мы создадим объект 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); }
Запустите пример