Перейти к содержимому

Как написать свой плеер на c

  • автор:

Видео плеер своими руками на C#

Всем привет. Хочу попробовать сделать видео плеер, который будет читать следующие форматы: AVI, WMV, MOV, MKV, 3gp и т.д. Подскажите, какие есть библиотеки, которые можно использовать бесплатно и которые позволят читать данные форматы? И если можно то дайте литературу в которой есть описание работы с данными библиотеками) Хочу разобраться как это работает на примере создания собственного видео плеера)

Отслеживать
задан 30 мая 2017 в 5:45
720 15 15 серебряных знаков 37 37 бронзовых знаков
Какой GUI ? UWP WPF WinForms консольный?
30 мая 2017 в 6:20

@codename0082016 либо WinForms, либо как вариант рассматриваю изучение WPF, дабы был привлекательный внешний вид)

30 мая 2017 в 6:21
На каких ОС должен запускаться? Мультиплатформенный?
30 мая 2017 в 6:23

@codename0082016 вообще не думал о мультиплатформенности, но думаю что было бы замечательно сделать его таковым)

30 мая 2017 в 6:24
тогда вышеперечисленное не подойдёт
30 мая 2017 в 6:25

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

а в качестве библиотеки можете спокойно использовать

using Microsoft.DirectX.AudioVideoPlayback; 

Посмотрите на эту реализацию в WinForms(хотя таких кодов множество на просторах инета):

private Video video; private string[] videoPaths; private string folderPath = @"C:\Users\Dell XPS\Desktop\Videos\"; private int selectedIndex = 0; private Size formSize; private Size pnlSize; public Form1() < InitializeComponent(); >private void Form1_Load(object sender, EventArgs e) < formSize = new Size(this.Width, this.Height); pnlSize = new Size(pnlVideo.Width, pnlVideo.Height); videoPaths = Directory.GetFiles(folderPath, "*.wmv"); if (videoPaths != null) < foreach (string path in videoPaths) < string vid = path.Replace(folderPath, string.Empty); vid = vid.Replace(".wmv", string.Empty); lstVideos.Items.Add(vid); >> lstVideos.SelectedIndex = selectedIndex; > private void lstVideos_SelectedIndexChanged(object sender, EventArgs e) < try < video.Stop(); video.Dispose(); >catch < >int index = lstVideos.SelectedIndex; selectedIndex = index; video = new Video(videoPaths[index], false); video.Owner = pnlVideo; pnlVideo.Size = pnlSize; video.Play(); tmrVideo.Enabled = true; btnPlayPause.Text = "Pause"; video.Ending += Video_Ending; lblVideo.Text = lstVideos.Text; > private void Video_Ending(object sender, EventArgs e) < Task.Factory.StartNew(() => < System.Threading.Thread.Sleep(2000); if (InvokeRequired) < this.Invoke(new Action(() =>< NextVideo(); >)); > >); > private void NextVideo() < int index = lstVideos.SelectedIndex; index++; if (index >videoPaths.Length - 1) index = 0; selectedIndex = index; lstVideos.SelectedIndex = index; > private void btnNext_Click(object sender, EventArgs e) < NextVideo(); >private void btnPrevious_Click(object sender, EventArgs e) < PreviousVideo(); >private void PreviousVideo() < int index = lstVideos.SelectedIndex; index--; if (index == -1) index = videoPaths.Length - 1; selectedIndex = index; lstVideos.SelectedIndex = index; >private void btnPlayPause_Click(object sender, EventArgs e) < if (!video.Playing) < video.Play(); tmrVideo.Enabled = true; btnPlayPause.Text = "Pause"; >else if (video.Playing) < video.Pause(); tmrVideo.Enabled = false; btnPlayPause.Text = "Play"; >> private void btnFullscreen_Click(object sender, EventArgs e) < FormBorderStyle = FormBorderStyle.None; WindowState = FormWindowState.Maximized; video.Owner = this; >private void Form1_KeyDown(object sender, KeyEventArgs e) < if (e.KeyCode == Keys.Escape) < //exit full screen when escape is pressed FormBorderStyle = FormBorderStyle.Sizable; WindowState = FormWindowState.Normal; this.Size = formSize; video.Owner = pnlVideo; pnlVideo.Size = pnlSize; >> private void trackVolume_Scroll(object sender, EventArgs e) < video.Audio.Volume = trackVolume.Value; >private void btnVolume_Click(object sender, EventArgs e) < trackVolume.Visible = !trackVolume.Visible; >private void tmrVideo_Tick(object sender, EventArgs e) < int currentTime = Convert.ToInt32(video.CurrentPosition); int maxTime = Convert.ToInt32(video.Duration); lblVideoPosition.Text = string.Format("::", currentTime / 3600, (currentTime / 60) % 60, currentTime % 60) + " / " + string.Format("::", maxTime / 3600, (maxTime / 60) % 60, maxTime % 60); > 

Мультиплатформенный аудио плеер на C++ и OpenAL

Так сложилось, что большую часть жизни я пользовался Windows и привык воспроизводить аудио файлы с помощью Winamp. Он очень удобно интегрируется с командной строкой — запустил любой аудио файл и готово. После перехода на Linux и OS X (в основном по работе, но Mac использую и дома вместе с виндой) возникла острая необходимость найти альтернативу. Перепробывал большое количестко крафических плееров. Основная их проблема — это отсутствие нормальной интеграции с командной строкой и часто поддержка только одной из платформ: либо Linux, либо OS X. С консольными плеерами ситуация получше: mpg123 и mpg321 практически идеально делают именно то, что надо. Вот только появилось одно большое «но». Они не умеют играть .ogg и трекерную музыку (.it, .mod, .xm, .s3m и прочие), которой тоже накопилось достаточно и расставаться с ней совершенно не хотелось.

Дело в том, что за свою программистскую карьеру мне пришлось написать пару мультиплатформных аудио систем для игровых движков: для Linderdaum Engine и для Blippar и ещу одну небольшую для вот этой книжки. Почему бы не применить накопленный опыт, чтобы самому написать проигрыватель? Требования для плеера получились вот такими:

  • работать на Windows, Linux и OS X;
  • проигрывать MP3, Vorbis, WAV и максимальное разумное кол-во модульных аудио форматов;
  • удобная интеграция с командной строкой;
  • использовать максимум сторонних библиотех, чтобы не превращать проект в долгострой;

Плеер задумывался как модульный возможностью быстрого расширения для проигрывания других форматов и для использования разных бэк-эндов. В основе всего интерфейс источника звука, абстрактный класс iAudioSource, и интерфейс аудиосистему iAudioSubsystem.

class iAudioSource < public: iAudioSource() : m_Looping( false ) <>virtual void BindDataProvider( const std::shared_ptr& Provider ) = 0; virtual void Play() = 0; virtual void Stop() = 0; virtual bool IsPlaying() const = 0; virtual bool IsLooping() const < return m_Looping; >virtual void SetLooping( bool Looping ) < m_Looping = Looping; >private: bool m_Looping; >; 
class iAudioSubsystem < public: virtual ~iAudioSubsystem() <>; virtual void Start() = 0; virtual void Stop() = 0; virtual std::shared_ptr CreateAudioSource() = 0; virtual void SetListenerGain( float Gain ) = 0; >; 

Единственные реализации этих интерфейсов используют OpenAL для вывода звука, поскольку поддержка это API на всех трех платформах вполне достойная.

Чтобы декодировать различные форматы в PCM создаем интерфейс iWaveDataProvider.

class iWaveDataProvider < public: virtual ~iWaveDataProvider() <>; virtual const sWaveDataFormat& GetWaveDataFormat() const = 0; virtual const uint8_t* GetWaveData() const = 0; virtual size_t GetWaveDataSize() const = 0; virtual bool IsStreaming() const < return false; >virtual bool IsEndOfStream() const < return false; >virtual void Seek( float Seconds ) <> virtual size_t StreamWaveData( size_t Size ) < return 0; >>; 

И для удобства вот такую фабрику:

std::shared_ptr CreateWaveDataProvider( const char* FileName, const std::shared_ptr& Data ); 

Различные реализации iWaveDataProvider используют сторонние библиотеки для декодирования аудио форматов. Получилось весьма компактно и пригодно для дальнейшего расширения функциональности.

Возможно однажды добавлю поддержку FLAC, но пока совершенно нет стимула — в домашней коллекции файлов такого формата нет.

Поддержка FLAC теперь тоже есть.

Как создать плеер для сайта на HTML5 и JavaScript

Контент на сайте можно разнообразить с помощью видео или аудио. Учим использовать HTML5 video- и audio-плееры и работать с ними на JS.

Евгений Кучерявый

Евгений Кучерявый

Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.

Уже прошли те времена, когда для воспроизведения аудио или видео на сайте нужно было подключать сторонний плеер на Flash — в Adobe решили больше не поддерживать эту технологию, а значит, мы можем вздохнуть с облегчением, потому что HTML5 позволяет создавать плееры с помощью тегов и .

Как использовать audio и video в HTML5

Чтобы создать плеер, достаточно такого кода для аудио:

Нас пока не интересует красивое оформление, но в этом варианте есть всё необходимое:

  • кнопка старта и паузы;
  • текущее время (в том числе и на прогресс-баре);
  • общая длительность;
  • кнопка отключения звука;
  • шкала громкости;
  • выбор скорости;
  • кнопка скачивания.

Теперь нужно написать функции, которые будут отдавать команды плееру. Начнем с получения объектов, запуска и паузы:

Заключение

Встроенный плеер на HTML5 — это лучшее решение, которое доступно современному веб-разработчику. Больше не нужно мучиться с Flash и другими подключаемыми плеерами, потому что есть более удобный вариант, который еще и хорошо оптимизирован и не требует скачивания сторонних приложений.

Читайте также:

  • JavaScript: главный инструмент frontend-разработчиков
  • Может ли компания претендовать на весь написанный разработчиком код
  • Учимся верстать: что такое CSS

Как добавить свой плеер

Каталог плееров в InstantVideo расположен по пути /components/video/players/. В данной директории каждый плеер находится в своей одноименной папке с управляющим файлом player.php.

В корне директории /components/video/players/ находится файл player.class.php — это базовый класс для всех плееров, классы самих плееров наследуются от него.

Для добавления своего плеера необходимо:

Создать папку с именем плеера, например «uppod», т.е. полный путь будет выглядеть как » /components/video/players/uppod/».

В эту директорию скопировать все необходимые файлы добавляемого плеера — js и/или swf, причем важно, swf файл плеера должен иметь название player.swf.

Создать файл player.php, в котором необходимо написать класс с названием, идентичным названию директории плеера и унаследовать его от класса player, например:

class uppod extends player < protected function __construct() < $this->player_path = self::$players_path.__CLASS__; > >

Обратите внимание на конструктор класса, в нем нужно определить в свойство объекта класса параметр $player_path, в большинстве случаев можно оставить как в примере.

Далее необходимо написать (переопределить) protected метод setFlashvars(), который заполнит свойство flashvars массивом параметров для flash файла плеера и вернет сам объект. Обратите внимание, пути к файлам постер-картинок и файлам для воспроизведения должны быть абсолютными, с полным именем домена.

class uppod extends player < protected function __construct() < $this->player_path = self::$players_path.__CLASS__; > protected function setFlashvars() < $flashvars['comment'] = htmlspecialchars($this->m['title']); $flashvars['file'] = htmlspecialchars($this->m['path']); $flashvars['poster'] = htmlspecialchars(HOST.'/upload/video/thumbs/medium/'.$this->m['img']); if($this->model->config['autoplay']) < $flashvars['auto'] = 'play'; >$this->flashvars = $flashvars; return $this; > >

Отметим, что в свойстве объекта доступен массив переданного плееру видеоролика — $this->m. В большинстве случаев подход, описанный выше достаточен для работоспособности плеера. Базовый класс плееров всю остальную работу по формированию кода flash плеера выполнит сам.

Приведенный выше пример рассчитан на то, что ваш плеер может формироваться через swfobject.

Дополнительные параметры и нюансы

Система автоматически сформирует код плеера для воспроизведения и учтет все нюансы, если ваш плеер может формироваться через swfobject. Однако в частных случаях, например с плеером Jwplayer, описанный выше подход не будет работать.

В таких случаях можно в классе плеера переопределять необходимые методы (возвращают строковые переменные):

  • getPlayer() — формирует полный код ролика для инициализации посредством js;
  • getPlayerToShare() — формирует код ролика при помощи html тегов object и embed.

Назначение остальных переопределяемых методов и свойств объекта:

  • свойство объекта $supported_providers — это массив всех доступных провайдеров, ролики которых могут воспроизводиться в «наших» плеерах;
  • свойство объекта $m — массив данных, переданного плееру ролика;
  • свойство объекта $is_swf_link — флаг, определяющий, может ли плеер отдавать ссылку на swf файл с параметрами для воспроизведения, по умолчанию true;
  • свойство объекта $params — массив параметров для тегов object и embed;
  • свойство объекта $provider — объект класса провайдера;
  • свойство объекта $model — объект класса модели системы;
  • метод swfPlayerUrl() — возвращает полную ссылку на файл плеера с параметрами для воспроизведения;
  • метод setPlayerOpenGraphVideoTag() — устанавливает метатеги og:video и og:video:type;

Здесь описана наиболее полная структура плееров для InstantVideo, если у вас остались вопросы, пиши нам, поможем разобраться. И, разумеется, всегда можно посмотреть код текущих плееров на живом примере.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *