前奏:
我要用这个作为序言,我在工作时间里一直在学习C#,并且我一直在盯着代码坚持两天试图解决这个问题。我正在开发一些软件,用于通过USB连接到标准台式PC的可视化器,软件检测捕获设备并使用新帧事件将帧加载到位图中,然后将其显示在“图片框”中作为直播视频流。它所处的问题是试图加强记录流并保存到文件的能力,最好是WMV或压缩的AVI。
已尝试的内容:
我考虑过并研究过以下内容:
SharpAVI - 似乎无法正常压缩或保存帧,因为它看起来主要是查看现有的AVI文件。
AForge.Video.VFW - 由于对将要使用此软件的个人的用户区域的限制,可以创建AVI文件,但这些文件太大而无法使用。
AForge.Video.FFMPEG - 再次由于使用此软件的人的考虑,我不能将非托管DLL放在带有可执行文件的输出文件夹中,不幸的是这个特定的DLL无法编译正确使用Costura Fody。
AVIFile库包装器(来自代码项目) - 似乎无法通过新帧事件从Bitmaps正确压缩流。
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
如果上面的代码看起来不太正确,我会进行合作,为了找到合适的组合,我一直在交换,更改和重新编码这三个部分。这意味着它相当凌乱但我没有看到清理它的重点,直到我的代码工作。实际上,你所提供的任何帮助都得到了极大的回报,即使这是我想要做的事情也是无法完成的。
提前谢谢。
编辑:PostScript:
我将在星期一到星期五积极工作,所以如果我做出任何突破,我会相应地更新这个问题,这似乎是一个经常回答的问题,所以希望我们能够克服这些问题。
答案 0 :(得分:0)
和我刚刚解决的问题相同:)这是我的代码如何使用AviFile库dll来制作avi文件:)
gg = [(MolNum(373), 40.6680008439399),
(MolNum(353), 72.49296570091882),
(MolNum(354), 83.18203548933252),
(MolNum(359), 88.23588863972836),
(MolNum(372), 97.47433492265824)]
答案 1 :(得分:0)
namespace ip_androidcam
{
public partial class Form1 : Form
{
MJPEGStream stream;
AVIWriter writer;
bool toggleRec = false;
public Form1()
{
InitializeComponent() ;
}
void stream_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
Bitmap bmp = (Bitmap)eventArgs.Frame.Clone();
bmp.RotateFlip(RotateFlipType.Rotate90FlipNone);
pictureBox1.Image = bmp;
try
{
if (toggleRec == true)
{
bmp = (Bitmap)eventArgs.Frame.Clone();
bmp.RotateFlip(RotateFlipType.Rotate90FlipNone);
writer.AddFrame(bmp);
}
}
catch (Exception e)
{
}
}
private void button1_Click(object sender, EventArgs e)
{
try
{
stream = new MJPEGStream(textBox1.Text);
stream.NewFrame +=stream_NewFrame;
stream.Start();
}
catch
{
}
}
private void button2_Click(object sender, EventArgs e)
{
try
{
if (stream.IsRunning == true)
{
stream.Stop();
}
}
catch
{
}
}
private void button3_Click(object sender, EventArgs e)
{
try
{
pictureBox1.Image = (Bitmap)pictureBox1.Image.Clone();
pictureBox1.Image.Save("D:\\Pictures\\pix-" + DateTime.Now.ToString("dd-MM-yyyy_hh-mm-ss" + ".jpeg" + ImageFormat.Jpeg));
}
catch (Exception)
{
MessageBox.Show("Capture Image First");
}
}
private void button4_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == DialogResult.OK)
{
pictureBox1.ImageLocation = ofd.FileName;
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button5_Click(object sender, EventArgs e)
{
if (toggleRec == false)
{
SaveFileDialog saveAVI = new SaveFileDialog();
saveAVI.Filter = "AVI Files (*.avi)|*.avi";
if (saveAVI.ShowDialog() == DialogResult.OK)
{
writer = new AVIWriter("XVID");
writer.Open(saveAVI.FileName , 480, 640);
toggleRec = true;
Label lblRec =new Label();
}
}
}
private void button6_Click(object sender, EventArgs e)
{
try
{
writer.Close();
MessageBox.Show("video recorded successfully");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}