Воспроизвести встроенный видео ресурс как поток - PullRequest
9 голосов
/ 03 июля 2011

РЕДАКТИРОВАТЬ : я изменил свой вопрос, чтобы лучше прояснить проблему.Как можно воспроизвести видео из байтового массива (взятого из встроенного ресурса) с использованием библиотеки DirectShow.Net ?

Поскольку я собираюсь запретить пользователям доступ к видеофайлу,Мне нужно встроить видеофайл в качестве ресурса и воспроизвести его.

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 05 июля 2011

Это немного нестандартно, но вы можете использовать что-то вроде WCF для самостоятельного размещения конечной точки в вашем настольном приложении. Затем установите в качестве источника видеовхода «URL» для вашей конечной точки. Это будет работать для WPF или WinForms. Хотя не уверен насчет Silverlight.

Самостоятельная конечная точка может извлекать медиа из встроенных ресурсов и передавать их оттуда.

3 голосов
/ 08 июля 2011

Мне кажется, что проблема не столько в том, как использовать библиотеку DirectShow ( специально разработан для этого `DirectShow.Net Forum ), а в том, как использовать встроенный ресурс.

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

Вот как я решил эту проблему:

  • Сначала поместите видеофайл в свой список ресурсов: я использую Visual Studio, поэтому я захожу в Свойства Project, нажимаю вкладку Ресурсы, выбираю опцию «Файлы», затем выбираю Add Resource> Add Existing File...

  • Добавьте следующие два namespaces в файл кода, который вы будете использовать:

using System.IO;
using System.Diagnostics;
  • Наконец, где вы хотите воспроизвести видеофайл, просто сделайте что-то похожее на следующее:
 Process player = null;
 string tempFile = "~clip000.dat";
 try {
   File.WriteAllBytes(tempFile, Properties.Resources.MyMovie_AVI);
   player = Process.Start(tempFile);
   player.WaitForExit();
 } finally {
   File.Delete(tempFile);
 }

Скорее всего, вы будете вызывать не метод Process.Start, а соответствующий метод DirectShow. Идея все та же: Извлеките свои ресурсы в виде массива byte, запишите их в новый, временный файл, используйте файл, а затем удалите этот файл, когда закончите.

Обязательно поместите оператор Delete в блок finally, чтобы в случае возникновения ошибок или закрытия пользователем программы во время воспроизведения файла ваше приложение по-прежнему очищало старый файл.

EDIT:

Я думаю, что это может быть жизнеспособным способом сделать это:

using (MemoryStream ms = new MemoryStream(Properties.Resources.MyMovie_AVI)) {
  // Now you have to find a way in `DirectShow` to use a Stream
}
1 голос
/ 12 июля 2011

Можете ли вы использовать другую библиотеку?

Я использовал WPF MediaKit , чтобы выполнить некоторую нестандартную потоковую передачу безопасного живого видеопотока h264.Разработчик (Джермиа Морилл) был очень отзывчивым, и настройка, которую я мог выполнить, была обширной (поскольку вы получили исходный код).

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

...