Как переключить звуковую дорожку в Windows Media Player?
после этого список дорожек будет отображаться в WMP? k lite полезный так то. не охота удалять, может есть решение?
На активном окне WMP нажать на Alt и нажав в выпавшем окне — воспроизвести — выбрать дорожку
Похожие вопросы
Ваш браузер устарел
Мы постоянно добавляем новый функционал в основной интерфейс проекта. К сожалению, старые браузеры не в состоянии качественно работать с современными программными продуктами. Для корректной работы используйте последние версии браузеров Chrome, Mozilla Firefox, Opera, Microsoft Edge или установите браузер Atom.
Как переключать звук в фильмах
Почти все фильмы на этом сайте имеют 2 звуковые дорожки, английскую и русскую. Если повезёт, можете смотреть фильмы онлайн на своём гаджете. Будет английский язык и субтитры (стоит 1-й дорожкой). Для того, что бы переключать звуковые дорожки, надо скачать фильм на ПК. Переключить звуковую дорожку можно только у тех видео файлов, где есть эти две дорожки! Большинство популярных плэйеров (кроме стандартного Windows Media Player), делают переключение между дорожками легко, за 2-3 клика.
Логика везде простая. Надо найти в меню пункт Звук (Audio), затем выбрать, то есть поставить галочку на нужную Дорожку (Stream). Будьте внимательны, если выберете две дорожки, возможно пойдёт воспроизведение сразу двух каналов звука. Скачать плэйеры, можно где угодно. Большая часть из них бесплатна.
Windows Media Player
Это стандартный плэйер включённый в операционную систему Windows. Очень неудобный. Не советую смотреть видео-файлы в этом плеере, в большинстве случаев плеер просто не может переключать звуковые дорожки. Можете попытаться сделать это так, как показано на рисунке:

Light Alloy
Один из лучших. Для русскоязычных пользователей бесплатный. Надо только при регистрации, ответить правильно на загадку :).
Кликните правой кнопкой мыши и в появившемся меню выберите пункт Звук -> Переключение звуковой дорожки.
Или внизу, сразу после «Громкости» кликнуть значок звука и в появившейся панели выбрать нужную дорожку.

Media Player Classic
Зайдите в меню Play -> Audio -> и выберите нужную вам звуковую дорожку.

KMPlayer
Полный набор встроенных кодеков, удобное управление и полная бесплатность. Если вам нужно поменять звуковую дорожку, нажмите CTRL+X и звуковая дорожка поменяется.
Еще один способ — нажать правую кнопку и в появившемся меню выбрать звуковую дорожку, как это показано на рисунке.
VLC Media PlayerVLC Media Player
Отличный и лёгкий плэйер. Может воспроизводить потоковое видео. Его рекомендуют использовать в Sopcast. Зайдите в меню Аудио -> Аудио-дорожка и выберите нужную вам звуковую дорожку.

BSplayer
Кликните правой кнопкой, в появившемся меню выберите пункт Аудио -> Аудио потоки и кликните по нужной вам звуковой дорожке.
Как поменять звуковую дорожку в Media Player Classic

Особенности Media Player позволяют просматривать видео, используя разные аудиодорожки.
Добавление и смена аудидорожки в Медиа Классик
Добавление и смена нового звукового файла производится всего в несколько этапов, необходимость сменить дорожку бывает разная, поэтому каждый пользователь должен знать как это сделать.
Шаг 1: добавляем аудидорожку в проигрыватель
Как добавить аудидорожку? Необходимо:
- Открыть плеер.
- В левом верхнем углу выбрать «Файл» и в появившемся меню «Открыть файл». Если плеер на английском языке, будет указано «File» и «Open file». Вместо этого можно воспользоваться комбинацией клавиш Ctrl+O.

- Появившееся окно предложит открыть сразу 2 файла: видео и аудио. Можно выбирать в любой последовательности.

- Нажимаем «ОК».
Media Player Classic Home Cinema
Шаг 2: производим смену звука
Сразу после добавления проигрыватель будет воспроизводить звук, который записан на видео. Как поменять звуковую дорожку Media Player Classic? Необходимо:

- Выбрать вкладку «Воспроизведение» («Play»).
- В ниспадающем меню навести курсор на «Аудио» («Audio»).
- Появится еще одно небольшое окно с доступными для выбора аудиозаписями.
Точно также можно поменять дорожку, нажав правой кнопкой мыши по картинке.

Решаем проблему с одновременным звучанием двух дорожек
В некоторых случаях Медиа Классик может воспроизводить сразу две дорожки. Чтобы убрать эту ошибку необходимо:
- Зайти в меню «Пуск»-«Все программы»-« K-Lite Codec Pack»-«Codec Tweak Tool».

- Появится новое окно, где нужно нажать «Preffered splitters».

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

Обратите внимание, что здесь две колонки, в которых можно менять опции для разных операционных систем: 32 и 64 бита.
Элементы, списки воспроизведения и звуковые дорожки мультимедиа
В этой статье показано, как использовать класс MediaSource, предоставляющий универсальный способ обращения к данным мультимедиа и их воспроизведения из различных источников (например, из локальных или удаленных файлов) и универсальную модель получения доступа к данным мультимедиа независимо от их формата. Класс MediaPlaybackItem расширяет функциональные возможности класса MediaSource. Он позволяет выбирать необходимые дорожки звука, видео и метаданных в файле мультимедиа и управлять ими. Класс MediaPlaybackList позволяет создавать списки воспроизведения из одного или нескольких элементов воспроизведения мультимедиа.
Создание и воспроизведение MediaSource
Создайте новый экземпляр MediaSource, вызвав один из фабричных методов, которые предоставляются следующими классами:
Созданный экземпляр MediaSource можно воспроизводить с помощью класса MediaPlayer, задав свойство Источник. Начиная c Windows 10 версии 1607, можно назначить класс MediaPlayer классу MediaPlayerElement, вызвав метод SetMediaPlayer, чтобы отобразить содержимое проигрывателя мультимедиа на странице XAML. Этот метод является предпочтительным по сравнению с использованием класса MediaElement. Дополнительные сведения об использовании класса MediaPlayer см. в разделе Воспроизведение аудио и видео с помощью класса MediaPlayer.
В следующем примере показано, как воспроизвести выбранный пользователем файл мультимедиа в классе MediaPlayer с помощью MediaSource.
using Windows.Media.Core; using Windows.Media.Playback;
Объявите переменную типа MediaSource. В примерах этой статьи источник мультимедиа объявлен как член класса, чтобы к нему можно было получить доступ из разных расположений.
MediaSource _mediaSource;
Объявите переменную, чтобы сохранить объект MediaPlayer, и если требуется отобразить содержимое мультимедиа в XAML, добавьте на свою страницу элемент управления MediaPlayerElement.
MediaPlayer _mediaPlayer;
Чтобы пользователь мог выбрать файл мультимедиа для воспроизведения, используйте класс FileOpenPicker. С помощью объекта StorageFile, который был возвращен методом PickSingleFileAsync средства выбора файлов, инициализируйте новый объект MediaObject, вызвав метод MediaSource.CreateFromStorageFile. Наконец, установите источник мультимедиа в качестве источника воспроизведения для класса MediaElement, вызвав метод SetPlaybackSource.
//Create a new picker var filePicker = new Windows.Storage.Pickers.FileOpenPicker(); //make a collection of all video types you want to support (for testing we are adding just 3). string[] fileTypes = new string[] ; //Add your fileTypes to the FileTypeFilter list of filePicker. foreach (string fileType in fileTypes) < filePicker.FileTypeFilter.Add(fileType); >//Set picker start location to the video library filePicker.SuggestedStartLocation = PickerLocationId.VideosLibrary; //Retrieve file from picker StorageFile file = await filePicker.PickSingleFileAsync(); if (!(file is null))
По умолчанию MediaPlayer не начинает воспроизведение автоматически, когда задан источник мультимедиа. Можно начать воспроизведение вручную, вызвав метод Play.
_mediaPlayer.Play();
Кроме того, можно задать для свойства AutoPlay класса MediaPlayer значение true, чтобы проигрыватель начал воспроизведение, как только источник мультимедиа будет задан.
_mediaPlayer.AutoPlay = true;
Создание MediaSource из DownloadOperation
Начиная с Windows версии 1803, вы можете создать объект MediaSource из DownloadOperation.
StorageFile destinationFile = await KnownFolders.VideosLibrary.CreateFileAsync("file.mp4", CreationCollisionOption.GenerateUniqueName); var downloader = new BackgroundDownloader(); var downloadOperation = downloader.CreateDownload(new Uri("http://server.com/file.mp4"), destinationFile); MediaSource mediaSource = MediaSource.CreateFromDownloadOperation(downloadOperation);
Хоть вы и можете создать MediaSource из операции загрузки, не начав ее и не установив значение true для ее свойства IsRandomAccessRequired, обязательно помните, что вы должны выполнить оба этих действия перед привязкой MediaSource к MediaPlayer или к MediaPlayerElement для последующего воспроизведения мультимедиа.
downloadOperation.IsRandomAccessRequired = true; var startAsyncTask = downloadOperation.StartAsync().AsTask(); mediaPlayerElement.Source = mediaSource;
Обработка нескольких дорожек звука, видео и метаданных с помощью MediaPlaybackItem
Класс MediaSource удобно использовать для воспроизведения, поскольку он предоставляет универсальный способ воспроизведения мультимедиа из различных источников, однако класс MediaPlaybackItem, созданный на основе класса MediaSource, предоставляет более широкие возможности. К ним относится доступ к различным дорожкам звука, видео и данных в элементе мультимедиа и управление ими.
Объявите переменную для хранения объекта MediaPlaybackItem.
MediaPlaybackItem _mediaPlaybackItem;
Создайте объект MediaPlaybackItem, вызвав конструктор и передав ему инициализированный объект MediaSource.
Если ваше приложение поддерживает несколько дорожек звука, видео и данных в элементе мультимедиа, зарегистрируйте обработчики событий AudioTracksChanged, VideoTracksChanged или TimedMetadataTracksChanged.
Наконец, установите в качестве источника воспроизведения класса MediaElement или MediaPlayer элемент MediaPlaybackItem.
_mediaSource = MediaSource.CreateFromStorageFile(file); _mediaPlaybackItem = new MediaPlaybackItem(_mediaSource); _mediaPlaybackItem.AudioTracksChanged += PlaybackItem_AudioTracksChanged; _mediaPlaybackItem.VideoTracksChanged += MediaPlaybackItem_VideoTracksChanged; _mediaPlaybackItem.TimedMetadataTracksChanged += MediaPlaybackItem_TimedMetadataTracksChanged; _mediaPlayer = new MediaPlayer(); _mediaPlayer.Source = _mediaPlaybackItem; mediaPlayerElement.SetMediaPlayer(_mediaPlayer);
Класс MediaSource может быть связан только с одним классом MediaPlaybackItem. После создания объекта MediaPlaybackItem из источника попытка создать другой элемент воспроизведения из этого же источника приведет к ошибке. Кроме того, после создания класса MediaPlaybackItem из источника мультимедиа вы не сможете непосредственно задать объект MediaSource в качестве источника для MediaPlayer. Вместо него следует использовать класс MediaPlaybackItem.
Событие VideoTracksChanged возникает после того, как объект MediaPlaybackItem, содержащий несколько видеодорожек, назначается в качестве источника воспроизведения. Это событие может возникнуть повторно, если список видеодорожек меняется при изменении элемента мультимедиа. Обработчик этого события позволяет обновить пользовательский интерфейс, чтобы позволить пользователю переключаться между доступными дорожками. В этом примере для отображения доступных видеодорожек используется элемент управления ComboBox.
В обработчике события VideoTracksChanged циклически переберите все дорожки в списке VideoTracks каждого элемента воспроизведения. Для каждой дорожки создается новый элемент управления ComboBoxItem. Если у дорожки еще нет метки, она создается из индекса дорожки. Свойству Tag поля со списком присваивается значение индекса дорожки. Это позволит идентифицировать свойство позже. Наконец, элемент добавляется в поле со списком. Обратите внимание, что эти операции выполняются внутри вызова CoreDispatcher.RunAsync, поскольку все изменения пользовательского интерфейса следует осуществлять в потоке пользовательского интерфейса, а это событие создается в другом потоке.
private async void MediaPlaybackItem_VideoTracksChanged(MediaPlaybackItem sender, IVectorChangedEventArgs args) < await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>< videoTracksComboBox.Items.Clear(); for (int index = 0; index < sender.VideoTracks.Count; index++) < var videoTrack = sender.VideoTracks[index]; ComboBoxItem item = new ComboBoxItem(); item.Content = String.IsNullOrEmpty(videoTrack.Label) ? $"Track " : videoTrack.Label; item.Tag = index; videoTracksComboBox.Items.Add(item); > >); >
В обработчике события SelectionChanged в поле со списком индекс дорожки извлекается из свойства Tag выбранного элемента. Если установить значение свойства SelectedIndex для списка VideoTracks элемента воспроизведения мультимедиа, то MediaElement или MediaPlayer изменят активную видеодорожку на дорожку с указанным индексом.
private void videoTracksComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
Управление элементами мультимедиа с несколькими звуковыми дорожками осуществляется точно так же, как в случае с видеодорожками. Обработайте событие AudioTracksChanged, чтобы обновить пользовательский интерфейс и отобразить звуковые дорожки, имеющиеся в списке AudioTracks элемента воспроизведения. Когда пользователь выбирает звуковую дорожку, установите соответствующее значение для свойства SelectedIndex списка AudioTracks, чтобы MediaElement или MediaPlayer переключили активную звуковую дорожку на дорожку с указанным индексом.
private async void PlaybackItem_AudioTracksChanged(MediaPlaybackItem sender, IVectorChangedEventArgs args) < await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>< audioTracksComboBox.Items.Clear(); for (int index = 0; index < sender.AudioTracks.Count; index++) < var audioTrack = sender.AudioTracks[index]; ComboBoxItem item = new ComboBoxItem(); item.Content = String.IsNullOrEmpty(audioTrack.Label) ? $"Track " : audioTrack.Label; item.Tag = index; videoTracksComboBox.Items.Add(item); > >); >
private void audioTracksComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
Помимо звуковых дорожек и видеодорожек, в объекте MediaPlaybackItem могут присутствовать (или же отсутствовать) объекты TimedMetadataTrack. Синхронизированная дорожка метаданных может содержать текст субтитров или надписей, а также специальные данные, используемые в приложении. Синхронизированная дорожка метаданных содержит список подсказок, представленных объектами, которые унаследованы от IMediaCue, например DataCue или TimedTextCue. Каждая подсказка имеет время начала и длительность. Они определяют, когда подсказка должна активироваться и на какое время.
Так же, как и в случае со звуковыми дорожкам и видеодорожками, синхронизированные дорожки метаданных для элемента мультимедиа могут быть обнаружены с помощью обработки события TimedMetadataTracksChanged объекта MediaPlaybackItem. Однако пользователю может потребоваться включить несколько дорожек метаданных одновременно. Кроме того, в зависимости от сценария вашего приложения вы можете включать либо отключать дорожки метаданных автоматически, без вмешательства пользователя. В демонстрационных целях в этом примере добавляется ToggleButton для каждой дорожки метаданных в элементе мультимедиа, чтобы пользователь мог включать либо отключать дорожку. Свойству Tag каждой кнопки присваивается значение индекса связанной дорожки метаданных, чтобы при нажатии кнопки дорожку можно было идентифицировать.
private async void MediaPlaybackItem_TimedMetadataTracksChanged(MediaPlaybackItem sender, IVectorChangedEventArgs args) < await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>< for (int index = 0; index < sender.TimedMetadataTracks.Count; index++) < var timedMetadataTrack = sender.TimedMetadataTracks[index]; ToggleButton toggle = new ToggleButton() < Content = String.IsNullOrEmpty(timedMetadataTrack.Label) ? $"Track " : timedMetadataTrack.Label, Tag = (uint)index >; toggle.Checked += Toggle_Checked; toggle.Unchecked += Toggle_Unchecked; MetadataButtonPanel.Children.Add(toggle); > >); >
Так как одновременно могут быть активны несколько дорожек метаданных, нельзя просто установить активный индекс для списка дорожек метаданных. Вместо этого вызовите метод SetPresentationMode объекта MediaPlaybackItem, передав ему индекс дорожки, на которую нужно переключиться, а затем укажите значение из перечисления TimedMetadataTrackPresentationMode. Режим презентации, который вы выбираете, зависит от реализации приложения. В следующем примере при включении дорожке метаданных присваивается значение PlatformPresented. Для текстовых дорожек это означает, что система будет автоматически показывать текстовые подсказки в дорожке. При выключении переключателя режим презентации отключается, то есть текст не отображается и события подсказки не вызываются. События подсказок будут рассмотрены в этой статье ниже.
private void Toggle_Checked(object sender, RoutedEventArgs e) => _mediaPlaybackItem.TimedMetadataTracks.SetPresentationMode((uint)((ToggleButton)sender).Tag, TimedMetadataTrackPresentationMode.PlatformPresented);
private void Toggle_Unchecked(object sender, RoutedEventArgs e) => _mediaPlaybackItem.TimedMetadataTracks.SetPresentationMode((uint)((ToggleButton)sender).Tag, TimedMetadataTrackPresentationMode.Disabled);
При обработке дорожек метаданных можно получить доступ к набору подсказок, находящихся в дорожке, с помощью свойств Cues или ActiveCues. Это можно сделать, чтобы обновить ваш пользовательский интерфейс и отображать в нем расположения подсказок для элемента мультимедиа.
Обработка неподдерживаемых кодеков и неизвестных ошибок при открытии элементов мультимедиа
Начиная c Windows 10 версии 1607, можно проверить, поддерживается ли кодек, необходимый для воспроизведения элемента мультимедиа, полностью или частично на устройстве, на котором выполняется приложение. В обработчике событий для событий изменения дорожек MediaPlaybackItem, таких как AudioTracksChanged, сначала проверьте, не является ли изменение дорожки вставкой новой дорожки. Если это так, то можно получить ссылку на вставляемую дорожку, использовав индекс, переданный в параметре IVectorChangedEventArgs.Index с подходящей коллекцией дорожек из параметра MediaPlaybackItem, например, с коллекцией AudioTracks.
Получив ссылку на вставляемую дорожку, проверьте значение DecoderStatus свойства SupportInfo дорожки. Если установлено значение FullySupported, то соответствующий кодек, необходимый для воспроизведения дорожки, присутствует на устройстве. Если установлено значение Degraded, дорожку можно воспроизвести в системе, однако качество воспроизведения так или иначе ухудшится. Например, звуковая дорожка 5.1 может воспроизводиться как 2-канальное стерео. В этом случае имеет смысл обновить свой пользовательский интерфейс, чтобы оповестить пользователя об ухудшении качества воспроизведения. Если установлено значение UnsupportedSubtype или UnsupportedEncoderProperties, то с установленными на устройстве кодеками воспроизвести дорожку невозможно. Возможно, следует предупредить пользователя и пропустить воспроизведение элемента или внедрить пользовательский интерфейс, позволяющий загрузить нужный кодек. Метод GetEncodingProperties дорожки можно использовать для определения требуемого кодека для воспроизведения.
Наконец, можно зарегистрироваться для события дорожки OpenFailed, которое будет возникать, если дорожка поддерживается на устройстве, но открыть ее не удалось из-за неизвестной ошибки в конвейере.
private async void SnippetAudioTracksChanged_CodecCheck(MediaPlaybackItem sender, IVectorChangedEventArgs args) < if (args.CollectionChange == CollectionChange.ItemInserted) < var insertedTrack = sender.AudioTracks[(int)args.Index]; var decoderStatus = insertedTrack.SupportInfo.DecoderStatus; if (decoderStatus != MediaDecoderStatus.FullySupported) < if (decoderStatus == MediaDecoderStatus.Degraded) < ShowMessageToUser($"Track can play but playback will be degraded. "); > else < // status is MediaDecoderStatus.UnsupportedSubtype or MediaDecoderStatus.UnsupportedEncoderProperties ShowMessageToUser($"Track uses an unsupported media format."); > Windows.Media.MediaProperties.AudioEncodingProperties props = insertedTrack.GetEncodingProperties(); await HelpUserInstallCodec(props); > else < insertedTrack.OpenFailed += InsertedTrack_OpenFailed; >> >
В обработчике событий OpenFailed можно проверить, известен ли статус MediaSource. Если статус неизвестен, можно программными средствами выбрать другую дорожку для воспроизведения, разрешить пользователю выбрать другую дорожку или отказаться от воспроизведения.
private async void InsertedTrack_OpenFailed(AudioTrack sender, AudioTrackOpenFailedEventArgs args) < LogError(args.ExtendedError.HResult); if (sender.SupportInfo.MediaSourceStatus == MediaSourceStatus.Unknown) < await SelectAnotherTrackOrSkipPlayback(sender.PlaybackItem); >>
Задание свойств отображения, используемых системными элементами управления транспортировкой мультимедиа
Начиная с Windows 10 версии 1607 мультимедиа, воспроизводимые в классе MediaPlayer, автоматически интегрируются в системные элементы управления транспортировкой мультимедиа (SMTC) по умолчанию. Можно задать метаданные, которые будут отображаться в SMTC, обновив свойства воспроизведения для класса MediaPlaybackItem. Получите объект, представляющий свойства отображения для элемента, вызвав метод GetDisplayProperties. Укажите, относится ли элемент воспроизведения к музыке или видео, задав свойство Тип. Затем задайте значения свойств объекта VideoProperties или MusicProperties. Вызовите метод ApplyDisplayProperties для обновления свойств элемента согласно предоставленным вами значениям. Обычно приложение извлекает значения отображения из веб-службы динамически, но в следующем примере показано извлечение со значениями, заданными в коде.
MediaItemDisplayProperties props = mediaPlaybackItem.GetDisplayProperties(); props.Type = Windows.Media.MediaPlaybackType.Video; props.VideoProperties.Title = "Video title"; props.VideoProperties.Subtitle = "Video subtitle"; props.VideoProperties.Genres.Add("Documentary"); mediaPlaybackItem.ApplyDisplayProperties(props);
props = mediaPlaybackItem.GetDisplayProperties(); props.Type = Windows.Media.MediaPlaybackType.Music; props.MusicProperties.Title = "Song title"; props.MusicProperties.Artist = "Song artist"; props.MusicProperties.Genres.Add("Polka"); mediaPlaybackItem.ApplyDisplayProperties(props);
Добавление внешнего синхронизированного текста с помощью класса TimedTextSource
В некоторых случаях у вас могут быть внешние файлы, содержащие синхронизированный текст, который связан с элементом мультимедиа (например, отдельные файлы с субтитрами на разных языках). Для загрузки внешних файлов с синхронизированным текстом из потока или URI используйте класс TimedTextSource.
В этом примере в коллекции Dictionary хранится список источников синхронизированного текста для элемента мультимедиа. URI источника и объект TimedTextSource используются в качестве пары «ключ/значение», чтобы идентифицировать дорожки после их обработки.
Dictionary timedTextSourceMap;
Создайте объект TimedTextSource для каждого внешнего файла с синхронизированным текстом, вызвав метод CreateFromUri. Добавьте запись в коллекцию Dictionary для источника синхронизированного текста. Добавьте обработчик для события TimedTextSource.Resolved, чтобы обрабатывать ситуации, когда элемент не удалось загрузить либо, устанавливать для него дополнительные свойства после успешной загрузки.
Зарегистрируйте все объекты TimedTextSource в MediaSource, добавив их в коллекцию ExternalTimedTextSources. Обратите внимание, что внешние источники синхронизированного текста добавляются напрямую в MediaSource, а не в MediaPlaybackItem, созданный из источника. Чтобы отразить в пользовательском интерфейсе внешние текстовые дорожки, зарегистрируйте и обработайте событие TimedMetadataTracksChanged, как было описано выше.
// Create the TimedTextSource and add entry to URI map var timedTextSourceUri_En = new Uri("http://contoso.com/MyClipTimedText_en.srt"); var timedTextSource_En = TimedTextSource.CreateFromUri(timedTextSourceUri_En); timedTextSourceMap[timedTextSource_En] = timedTextSourceUri_En; timedTextSource_En.Resolved += TimedTextSource_Resolved; var timedTextSourceUri_Pt = new Uri("http://contoso.com/MyClipTimedText_pt.srt"); var timedTextSource_Pt = TimedTextSource.CreateFromUri(timedTextSourceUri_Pt); timedTextSourceMap[timedTextSource_Pt] = timedTextSourceUri_Pt; timedTextSource_Pt.Resolved += TimedTextSource_Resolved; // Add the TimedTextSource to the MediaSource _mediaSource.ExternalTimedTextSources.Add(timedTextSource_En); _mediaSource.ExternalTimedTextSources.Add(timedTextSource_Pt); _mediaPlaybackItem = new MediaPlaybackItem(_mediaSource); _mediaPlaybackItem.TimedMetadataTracksChanged += MediaPlaybackItem_TimedMetadataTracksChanged; _mediaPlayer = new MediaPlayer(); _mediaPlayer.Source = _mediaPlaybackItem; mediaPlayerElement.SetMediaPlayer(_mediaPlayer);
В обработчике события TimedTextSource.Resolved проверьте свойство Error класса TimedTextSourceResolveResultEventArgs, передаваемое обработчику, чтобы определить, не произошла ли в процессе загрузки синхронизированных текстовых данных ошибка. Если элемент был успешно найден, то этот обработчик можно использовать для обновления дополнительных свойств найденной дорожки. В этом примере для каждой дорожки добавляется метка на основе URI, сохраненного ранее в Dictionary.
private void TimedTextSource_Resolved(TimedTextSource sender, TimedTextSourceResolveResultEventArgs args) < var timedTextSourceUri = timedTextSourceMap[sender]; if (!(args.Error is null)) < // Show that there was an error in your UI ShowMessageToUser($"There was an error resolving track: "); return; > // Add a label for each resolved track var timedTextSourceUriString = timedTextSourceUri.AbsoluteUri; if (timedTextSourceUriString.Contains("_en")) < args.Tracks[0].Label = "English"; >else if (timedTextSourceUriString.Contains("_pt")) < args.Tracks[0].Label = "Portuguese"; >>
Добавление дополнительных дорожек метаданных
Вы можете динамически создавать пользовательские дорожки метаданных в коде и привязывать их к источнику мультимедиа. Создаваемые дорожки могут содержать текст субтитров или надписей либо специальные данные приложения.
Создайте объект TimedMetadataTrack, вызвав конструктор и указав идентификатор, идентификатор языка и значение из перечисления TimedMetadataKind. Зарегистрируйте обработчики для событий CueEntered и CueExited. Эти события возникают, когда достигнуто время начала подсказки и когда время действия подсказки истекло.
Создайте новый объект подсказки, подходящий для типа созданной дорожки метаданных, и задайте идентификатор, время начала и длительность дорожки. В этом примере создается дорожка данных, поэтому формируется набор объектов DataCue и для каждой подсказки предоставляется буфер, содержащий специальные данные приложения. Чтобы зарегистрировать новую дорожку, добавьте ее в коллекцию ExternalTimedMetadataTracks объекта MediaSource.
Начиная с Windows 10 версии 1703, свойство DataCue.Properties предоставляет набор PropertySet, который служит для хранения пользовательских свойств в парах «ключ/данные», извлекаемых из событий CueEntered и CueExited.
TimedMetadataTrack metadataTrack = new TimedMetadataTrack("ID_0", "en-us", TimedMetadataKind.Data); metadataTrack.Label = "Custom data track"; metadataTrack.CueEntered += MetadataTrack_DataCueEntered; metadataTrack.CueExited += MetadataTrack_CueExited; // Example cue data string data = "Cue data"; byte[] bytes = new byte[data.Length * sizeof(char)]; System.Buffer.BlockCopy(data.ToCharArray(), 0, bytes, 0, bytes.Length); Windows.Storage.Streams.IBuffer buffer = bytes.AsBuffer(); for (int i = 0; i < 10; i++) < DataCue cue = new DataCue(); cue.Id = "ID_" + i; cue.Data = buffer; cue.Properties["AdUrl"] = "http://contoso.com/ads/123"; cue.StartTime = TimeSpan.FromSeconds(3 + i * 3); cue.Duration = TimeSpan.FromSeconds(2); metadataTrack.AddCue(cue); >_mediaSource.ExternalTimedMetadataTracks.Add(metadataTrack);
Событие CueEntered возникает при достижении времени начала подсказки, если связанная дорожка имеет режим представления ApplicationPresented, Hidden или PlatformPresented. События подсказки не создаются для дорожек метаданных, а режим представления для дорожки — Отключено. Следующий пример просто выводит пользовательские данные, связанные с подсказкой, в окно отладки.
private void MetadataTrack_DataCueEntered(TimedMetadataTrack sender, MediaCueEventArgs args)
В следующем примере для добавления пользовательской текстовой дорожки при создании дорожки указывается значение TimedMetadataKind, а объекты TimedTextCue используются для добавления подсказок к дорожке.
TimedMetadataTrack metadataTrack = new TimedMetadataTrack("TrackID_0", "en-us", TimedMetadataKind.Caption); metadataTrack.Label = "Custom text track"; metadataTrack.CueEntered += MetadataTrack_TextCueEntered; for (int i = 0; i < 10; i++) < TimedTextCue cue = new TimedTextCue() < + i, StartTime = TimeSpan.FromSeconds(i * 3), Duration = TimeSpan.FromSeconds(2) >; cue.Lines.Add(new TimedTextLine() < Text = "This is a custom timed text cue." >); metadataTrack.AddCue(cue); > _mediaSource.ExternalTimedMetadataTracks.Add(metadataTrack);
private void MetadataTrack_TextCueEntered(TimedMetadataTrack sender, MediaCueEventArgs args)
Воспроизведение списка элементов мультимедиа с помощью MediaPlaybackList
Класс MediaPlaybackList позволяет создать список воспроизведения элементов мультимедиа, которые представлены объектами MediaPlaybackItem.
Примечание Элементы в MediaPlaybackList отрисовываются с помощью воспроизведения без пробелов. Система будет использовать предоставленные метаданные в файлах, закодированных в формате MP3 или AAC, чтобы определить задержку или компенсацию заполнения, необходимую для непрерывного воспроизведения. Если файлы, закодированные в формате MP3 или AAC не предоставляют этих данных, система определяет задержку и заполнение эвристически. В случае форматов без потери качества, таких как PCM, FLAC или ALAC система не предпринимает никаких действий, поскольку эти кодировщики не создают задержки или заполнения.
Сначала объявите переменную для хранения объекта MediaPlaybackList.
MediaPlaybackList _mediaPlaybackList;
Создайте объект MediaPlaybackItem для каждого элемента мультимедиа, который нужно добавить в список, с помощью процедуры, описанной выше. Инициализируйте объект MediaPlaybackList и добавьте в него элементы воспроизведения мультимедиа. Зарегистрируйте обработчик события CurrentItemChanged. Это событие позволяет обновить пользовательский интерфейс, чтобы отобразился элемент мультимедиа, который воспроизводится в данный момент. Также можно зарегистрировать событие ItemOpened, которое возникает при успешном открытии элемента в списке, и событие ItemFailed, которое возникает, когда не удается открыть элемент в списке.
Начиная с Windows 10 версии 1703, можно указать максимальное количество объектов MediaPlaybackItem в списке MediaPlaybackList. Этот список остается открытым после воспроизведения всех элементов, если задано свойство MaxPlayedItemsToKeepOpen. Когда список MediaPlaybackItem остается открытым, воспроизведение элемента начинается мгновенно, как только пользователь переходит к этому элементу. Это связано с тем, что элемент не требуется загружать повторно. Тем не менее, при открытом списке элементов приложение потребляет больше ресурсов памяти. Значение свойства нужно подбирать так, чтобы сохранялся баланс между потреблением памяти и быстродействием.
Чтобы включить воспроизведение списка, выберите в качестве источника воспроизведения для MediaPlayer ваш список MediaPlaybackList.
_mediaPlaybackList = new MediaPlaybackList(); var files = await filePicker.PickMultipleFilesAsync(); foreach (var file in files) < var mediaPlaybackItem = new MediaPlaybackItem(MediaSource.CreateFromStorageFile(file)); _mediaPlaybackList.Items.Add(mediaPlaybackItem); >_mediaPlaybackList.CurrentItemChanged += MediaPlaybackList_CurrentItemChanged; _mediaPlaybackList.ItemOpened += MediaPlaybackList_ItemOpened; _mediaPlaybackList.ItemFailed += MediaPlaybackList_ItemFailed; _mediaPlaybackList.MaxPlayedItemsToKeepOpen = 3; _mediaPlayer = new MediaPlayer(); _mediaPlayer.Source = _mediaPlaybackList; mediaPlayerElement.SetMediaPlayer(_mediaPlayer);
В обработчике события CurrentItemChanged обновите пользовательский интерфейс, чтобы отобразить воспроизводимый в настоящее время элемент, который можно получить с помощью свойства NewItem объекта CurrentMediaPlaybackItemChangedEventArgs, переданного данному событию. Помните, что если вы обновляете пользовательский интерфейс с помощью этого события, необходимо делать это в рамках вызова CoreDispatcher.RunAsync, чтобы эти обновления выполнялись в потоке пользовательского интерфейса.
Начиная с Windows 10 версии 1703, можно получить значение свойства CurrentMediaPlaybackItemChangedEventArgs.Reason, которое указывает причину изменения элемента (например, программное переключение элементов приложением, завершение воспроизведения предыдущего элемента или ошибка).
private void MediaPlaybackList_CurrentItemChanged(MediaPlaybackList sender, CurrentMediaPlaybackItemChangedEventArgs args) => LogTelemetryData($"CurrentItemChanged reason: ");
Вызовите метод MovePrevious или MoveNext, чтобы проигрыватель мультимедиа воспроизвел предыдущий или следующий элемент в списке MediaPlaybackList.
private void prevButton_Click(object sender, RoutedEventArgs e) => _mediaPlaybackList.MovePrevious();
private void nextButton_Click(object sender, RoutedEventArgs e) => _mediaPlaybackList.MoveNext();
Значение свойства ShuffleEnabled определяет, должен ли проигрыватель мультимедиа воспроизводить элементы списка в случайном порядке.
private async void shuffleButton_Click(object sender, RoutedEventArgs e) < _mediaPlaybackList.ShuffleEnabled = !_mediaPlaybackList.ShuffleEnabled; await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>< shuffleButton.FontWeight = _mediaPlaybackList.ShuffleEnabled ? Windows.UI.Text.FontWeights.Bold : Windows.UI.Text.FontWeights.Light; >); >
Значение свойства AutoRepeatEnabled определяет, должен ли проигрыватель мультимедиа воспроизводить элементы списка циклически.
private async void autoRepeatButton_Click(object sender, RoutedEventArgs e) < _mediaPlaybackList.AutoRepeatEnabled = !_mediaPlaybackList.AutoRepeatEnabled; await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>< autoRepeatButton.FontWeight = _mediaPlaybackList.AutoRepeatEnabled ? Windows.UI.Text.FontWeights.Bold : Windows.UI.Text.FontWeights.Light; >); >
Обработка сбоев элементов мультимедиа в списке воспроизведения
Событие ItemFailed возникает, если не удается открыть элемент в списке. Свойство ErrorCode объекта MediaPlaybackItemError, переданное в обработчик, по возможности перечисляет конкретные причины сбоя, включая сетевые ошибки, ошибки декодирования и шифрования.
private void MediaPlaybackList_ItemFailed(MediaPlaybackList sender, MediaPlaybackItemFailedEventArgs args)
Отключение воспроизведения элементов в списке воспроизведения
Начиная с Windows 10 версии 1703, можно отключить воспроизведение одного или нескольких элементов в списке MediaPlaybackItemList, установив для свойства IsDisabledInPlaybackList в MediaPlaybackItem значение false.
Типичный сценарий для этой функции — приложения, воспроизводящие потоковую музыку из Интернета. Приложение может отслеживать изменения состояния сетевого подключения на устройстве и отключать воспроизведение элементов, которые загружены не полностью. В следующем примере регистрируется обработчик для события NetworkInformation.NetworkStatusChanged.
Windows.Networking.Connectivity.NetworkInformation.NetworkStatusChanged += NetworkInformation_NetworkStatusChanged;
В обработчике для события NetworkStatusChanged необходимо проверить, возвращает ли GetInternetConnectionProfile значение null, которое указывает на отсутствие подключения к сети. Если это так, циклически переберите все элементы в списке воспроизведения. Если значение параметра TotalDownloadProgress для элемента меньше 1, это означает, что элемент загружен не полностью и его следует отключить. Если сетевое подключение установлено, циклически переберите все элементы в списке воспроизведения и включите каждый элемент.
private void NetworkInformation_NetworkStatusChanged(object sender) < if (Windows.Networking.Connectivity.NetworkInformation.GetInternetConnectionProfile() == null) < // Check download status of each item in the list. (TotalDownloadProgress < 1 means not completely downloaded) foreach (var item in _mediaPlaybackList.Items) < if (item.TotalDownloadProgress < 1) < item.IsDisabledInPlaybackList = true; >> > else < // Connected to internet, re-enable all playlist items foreach (var item in _mediaPlaybackList.Items) < item.IsDisabledInPlaybackList = true; >> >
Отложенная привязка мультимедийного содержимого для элементов в списке воспроизведения с помощью MediaBinder
В предыдущих примерах на основе файла, URL-адреса или потока создается источник MediaSource. Затем создается элемент MediaPlaybackItem, который добавляется в список MediaPlaybackList. В некоторых сценариях, например, когда с пользователя взимается плата за просмотр содержимого, можно отложить получение содержимого из источника MediaSource до момента, когда элемент в списке воспроизведения будет полностью готов. Чтобы реализовать этот сценарий, создайте экземпляр класса MediaBinder. Задайте для свойства Token строку приложения, определяющую отложенное содержимое, затем зарегистрируйте обработчик события Binding. Далее создайте источник MediaSource на основе Binder, вызвав метод MediaSource.CreateFromMediaBinder. Затем создайте элемент MediaPlaybackItem на основе MediaSource и добавьте его в список воспроизведения обычным способом.
_mediaPlaybackList = new MediaPlaybackList(); var binder = new MediaBinder(); binder.Token = "MyBindingToken1"; binder.Binding += Binder_Binding; _mediaPlaybackList.Items.Add(new MediaPlaybackItem(MediaSource.CreateFromMediaBinder(binder))); binder = new MediaBinder(); binder.Token = "MyBindingToken2"; binder.Binding += Binder_Binding; _mediaPlaybackList.Items.Add(new MediaPlaybackItem(MediaSource.CreateFromMediaBinder(binder))); _mediaPlayer = new MediaPlayer(); _mediaPlayer.Source = _mediaPlaybackList; mediaPlayerElement.SetMediaPlayer(_mediaPlayer);
Когда система определяет, что необходимо получить содержимое, связанное с MediaBinder, возникает событие Binding. В обработчике для этого события можно получить экземпляр MediaBinder из класса MediaBindingEventArgs, передаваемого в событие. Получите строку, указанную в свойстве Token, и используйте ее для определения извлекаемого содержимого. Класс MediaBindingEventArgs предоставляет методы для настройки связанного содержимого в нескольких разных представлениях, включая SetStorageFile, SetStream, SetStreamReference и SetUri.
private void Binder_Binding(MediaBinder sender, MediaBindingEventArgs args) < // Get a deferral if you need to perform async operations // var deferral = args.GetDeferral(); var contentUri = new Uri("http://contoso.com/media/" + args.MediaBinder.Token); args.SetUri(contentUri); // Call complete after your async operations are complete // deferral.Complete(); >
Обратите внимание: при выполнении асинхронных операций, таких как веб-запросы, обработчик события Binding должен вызвать метод MediaBindingEventArgs.GetDeferral. Этот метод дает системе инструкцию ожидать завершения операции. Вызовите метод Deferral.Complete после завершения операции, чтобы система продолжила работу.
Начиная с Windows 10 версии 1703, можно предоставить AdaptiveMediaSource в качестве связанного содержимого, вызвав метод SetAdaptiveMediaSource. Дополнительные сведения об использовании адаптивной потоковой передачи в приложении см. в разделе Адаптивная потоковая передача.
Связанные темы
- Воспроизведение мультимедиа
- Воспроизведение аудио и видео с помощью MediaPlayer
- Интеграция с системными элементами управления транспортировкой мультимедиа
- Воспроизведение мультимедиа в фоновом режиме