Опубликован: 22.12.2015 | Уровень: для всех | Доступ: платный
Лекция 29:

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

< Лекция 28 || Лекция 29 || Лекция 30 >

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

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

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


< Лекция 28 || Лекция 29 || Лекция 30 >