Прелюдия:
Я собираюсь предварить это тем, что я изучал C # в свободное время на работе, и что я смотрел на код в течение целых двух дней, пытаясь понять эту проблему. Я разрабатываю некоторое программное обеспечение для использования с визуализатором, который подключается через USB к стандартному настольному ПК, программное обеспечение обнаруживает устройство захвата и загружает кадры в растровое изображение с помощью нового события кадра, затем это отображается в «окне изображения» как видеотрансляция в прямом эфире. Проблема заключается в том, чтобы включить возможность записи потока и сохранения в файл, предпочтительно в WMV или сжатый AVI.
Что было испробовано:
Я рассмотрел и рассмотрел следующее:
SharpAVI — похоже, не удается заставить это сжимать или сохранять кадры должным образом, так как в основном он просматривает существующие файлы AVI.
AForge.Video.VFW. Файлы AVI можно создавать, но они слишком велики для использования из-за ограничений на пользовательские области лиц, которые будут использовать это программное обеспечение.
AForge.Video.FFMPEG. Опять же, из-за соображений тех, кто использует это программное обеспечение, я не могу иметь неуправляемые DLL в выходной папке с исполняемым файлом, и, к сожалению, эта конкретная DLL не может быть правильно скомпилирована с помощью Costura. Фоди.
Обертка библиотеки AVIFile (из проекта кода). Опять же, похоже, не удается заставить это правильно сжимать поток из растровых изображений из событий нового кадра.
DirectShow — похоже, я использую C++ и, к сожалению, в настоящее время не могу этого сделать.
Соответствующие фрагменты кода:
Текущие ссылки:
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Resources;
using System.Drawing.Imaging;
using System.IO;
//Aforge Video DLL's
using AForge.Video;
using AForge.Video.VFW;
using AForge.Video.DirectShow;
//Aforge Image DLL's
using AForge.Imaging;
using AForge.Imaging.Formats;
using AForge.Imaging.Filters;
//AviLibrary
using AviFile;
Глобальные переменные:
#region Global Variables
private FilterInfoCollection CaptureDevice; // list of available devices
private VideoCaptureDevice videoSource;
public System.Drawing.Image CapturedImage;
bool toggleMic = false;
bool toggleRec = false;
//aforge
AVIWriter aviWriter;
Bitmap image;
#endregion
Код для отображения потока
#region Displays the Stream
void videoSource_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
picBoxStream.SizeMode = PictureBoxSizeMode.Zoom;
picBoxStream.Image = (Bitmap)eventArgs.Frame.Clone();// clones the bitmap
if (toggleRec == true)
{
image = (Bitmap)eventArgs.Frame.Clone();
aviWriter.AddFrame(image);
}
}
#endregion
Текущий код для записи потока
#region Record Button
private void btnRecord_Click(object sender, EventArgs e)
{
if (toggleRec == false)
{
saveAVI = new SaveFileDialog();
saveAVI.Filter = "AVI Files (*.avi)|*.avi";
if (saveAVI.ShowDialog() == DialogResult.OK)
{
aviWriter = new AVIWriter();
aviWriter.Open(saveAVI.FileName, 1280, 720);
toggleRec = true;
Label lblRec = new Label();
}
}
else if (toggleRec == true)
{
aviWriter.Close();
toggleRec = false;
}
}
#endregion
Я прошу прощения, если приведенный выше код выглядит не совсем правильно, я много раз менял местами, изменял и перекодировал эти три раздела, чтобы найти работающую комбинацию. Это означает, что это довольно неопрятно, но я не видел смысла все это чистить, пока у меня не заработает код. При этом любая помощь, которую вы можете оказать, будет принята с благодарностью, даже если это тот случай, когда то, что я хочу сделать, просто невозможно сделать.
Заранее спасибо.
ИЗМЕНЕНИЕ: 2019:
Прошло некоторое время с тех пор, как я опубликовал это, и это все еще вызывает странный интерес здесь и там. Когда я опубликовал это, я учился программировать, и у меня была эта странная причуда, что мне не нравилось использовать сторонние библиотеки, если я мог этого избежать, я хотел делать свою собственную работу, с тех пор я многому научился и одна из этих вещей заключается в том, что мир с открытым исходным кодом огромен, впечатляет и добр. Поэтому, если есть сторонняя библиотека, которая делает то, что вы хотите, просто используйте ее, это сэкономит ваше время.