Недавно была выпущена новая версия XNA Game Studio 3.1.
Среди остальных прикольных нововведений (таких как рендеринг трехмерных аватаров) была также добавлена и поддержка видео.
Теперь поподробнее.
Требования к исходному видео:
- формат - Windows Media Video, Series 9. Енкодер можно найти здесь.
- максимальное разрешение экрана 1280x720
- Видео и аудио должны быть закодированы с постоянным битрейтом (constant bit rate aka (CBR)
- Поддерживаеться незащищенное видео без DRM защиты
- Невозможно воспроизводить части видео файла - файл всегда воспроизводиться полностью.
Импортировать видео можно через стандартные средства Content Pipeline.
Воспроизвидение видео
Обьекты, с которыми нам надо работать, это Video (исходное видео) и VideoPlayer (непосредственно проигрыватель).
Создадим и инициализируем их в конструкторе класса игры.
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
// Create the variables needed to hold and play back my video.
Video myVideoFile;
VideoPlayer videoPlayer;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
// Create the VideoPlayer
videoPlayer = new VideoPlayer();
}
Для загрузки даных из contetnt pipeline используем:
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
// TODO: use this.Content to load your game content here
// Load in my video file (just like any other content!)
myVideoFile = Content.Load<Video>(@"Bear");
}
Теперь для проигрывания видео нужно нажать А на контролере, а для остановки - В. Эту функциональность дописываем в апдейт функцию.
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
// TODO: Add your update logic here
// Start the video playback when the user presses A
if (GamePad.GetState(PlayerIndex.One).Buttons.A == ButtonState.Pressed)
{
videoPlayer.Play(myVideoFile);
}
// Start the video playback if the user presses B
if (GamePad.GetState(PlayerIndex.One).Buttons.B == ButtonState.Pressed)
{
videoPlayer.Stop();
}
base.Update(gameTime);
}
В функции Draw рисуем картинку из нашего плеера:
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
// TODO: Add your drawing code here
// Render the video in it's orginal resolution to the screen using SpriteBatch
spriteBatch.Begin();
if (videoPlayer.State == MediaState.Playing)
{
spriteBatch.Draw(videoPlayer.GetTexture(), new Rectangle(0, 0, myVideoFile.Width, myVideoFile.Height), Color.White);
}
spriteBatch.End();
base.Draw(gameTime);
}
Дополнительно следует помнить о возможности отключить звук (свойство VideoPlayer.IsMuted) и возможности зациклить видео (свойство VideoPlayer.IsLooping). Их можно установить например в конструкторе.
На что еще следует обратить внимание:
- поскольку воспроизводимая картинка являеться текстурой, вы можете применять к ней эффекты.
- VideoSoundtrackType позволит вам миксить ваш звук с видео (если в плеере установлено свойство IsMuted для родной дорожи видео файла)
- Высокое качество видео (с высоким разрешением и битрейтом) к сожалению приведет к тормозам во время воспроизведения.
Источники:
Тестовый проект
1