我正在尝试完成一件简单的事情:使用Accord .net框架将视频和音频(从网络摄像头)录制成avi文件。它看起来比看起来更复杂:)
到目前为止,我使用这个帧处理程序很好地处理了视频帧:
void videoDevice_NewFrame(object sender, Accord.Video.NewFrameEventArgs eventArgs)
{
System.Drawing.Image imgforms = (Bitmap)eventArgs.Frame.Clone();
BitmapImage bi = new BitmapImage();
bi.BeginInit();
MemoryStream ms = new MemoryStream();
imgforms.Save(ms, ImageFormat.Bmp);
ms.Seek(0, SeekOrigin.Begin);
bi.StreamSource = ms;
bi.EndInit();
//Using the freeze function to avoid cross thread operations
bi.Freeze();
//Calling the UI thread using the Dispatcher to update the 'Image' WPF control
Dispatcher.BeginInvoke(new ThreadStart(delegate
{
pbox.Source = bi; /*pbox is the name of the 'Image' WPF control*/
}));
if (_recording)
{
long currentTick = DateTime.Now.Ticks;
StartTick = StartTick ?? currentTick;
var frameOffset = new TimeSpan(currentTick - StartTick.Value);
double elapsedTimeInSeconds = stopwatch.ElapsedTicks / (double)Stopwatch.Frequency;
double timeBetweenFramesInSeconds = 1.0 / 25;
if (elapsedTimeInSeconds >= timeBetweenFramesInSeconds)
{
stopwatch.Restart();
try
{
_writer.WriteVideoFrame(eventArgs.Frame, frameOffset);
}catch(Exception ex)
{
}
//Here come WriteAudioFrame(Signal signal) ?
}
}
}
并且音频数据被存储在音频新帧事件处理器中的存储器流/ WaveEncoder中:
audio_stream = new MemoryStream();
audio_encoder = new WaveEncoder(audio_stream);
void audioDevice_NewFrame(object sender, Accord.Audio.NewFrameEventArgs eventArgs)
{
audio_encoder.Encode(eventArgs.Signal);
}
所以现在,我不知道如何转换音频内存流(或WaveEncoder ?)在上一个3.8.2版本的.Net预发行版中,@cesarsouza编写的新方法所需的信号对象:
_writer.WriteAudioFrame(Signal signal)
以及如何同步视频和音频。我怀疑我们需要根据采样率获得相同数量的音频和视频帧。
你知道怎么做的例子吗?
非常感谢
发布于 2018-08-14 01:52:58
您可以使用WaveDecoder
WaveDecoder decoder = new WaveDecoder();
Signal s = decoder.Decode();
_writer.WriteAudioFrame(s);
https://stackoverflow.com/questions/47305500
复制相似问题