
MFILE组件(oraycn.mfile.dll)是Auri实用组件之一。它可以以指定格式编码原始语音数据和视频数据,并将其写入视频文件(例如.mp4)。
1。命运的起源
最近在一个在线招聘平台项目的工作,该项目具有这样的模块,候选人可以通过系统客户端记录自己的视频(自我引入),以将其上传到服务器,然后招聘人员将在右边浏览时间。这些候选人的视频。该模块中涉及的主要技术是语音和视频录制技术,它需要编码和写入.mp4文件,以获取从麦克风收集的语音数据以及从相机收集的视频数据。
要完成这些功能,具体来说,需要解决以下技术问题:
(1)麦克风数据收集
(2)相机数据采集
(3)音频数据编码
(4)视频数据编码
(5)以.mp4文件格式将编码的数据写入文件容器中。
(6)确保音频和视频播放的同步。
2。演示实施
从头开始逐步解决这些问题将是一个非常困难的挑战。幸运的是,我们可以通过现有组件的结合来实现这些功能。我们可以在OMCS框架的帮助下完成语音和视频数据的集合,以及随后的语音和视频编码和生成MP4文件,我们可以在MFILE组件的帮助下完成。有关更方便的解释,在这里我们将提供一个特定的演示,该演示可以记录从本地摄像机和本地麦克风收集的数据并生成MP4文件。演示运行的屏幕截图如下:
接下来,让我们谈谈如何在此演示中逐一解决上述问题。
1。语音数据收集
我们可以使用OMCS的麦克相关组件连接到我们自己的麦克风设备,以便扬声器播放收集的语音,我们可以通过通过ImultimediaManager暴露的AudioPlayed事件捕获播放语音数据。
2。视频数据获取
同样,我们可以使用相机控制控制器连接到自己的相机设备,然后计时器每100ms(假设帧速率为10fps)调用其getCurrentimage方法以获取绘制位图。
3。下一步
可以将以下4个步骤移交给MFILE组件。让我们看一下MFILE组件中视频制造商类的签名,并知道该怎么做:
MFILE结构
对于用户,MFILE组件中主要类的结构图如下:
其中,AudioFileMaker用于生成音频文件,使用SilenceVideFileMaker来生成无声的视频文件,并使用VideofileMaker来生成带有声音和图像的普通视频文件。这三个类均从基类的基地制造商继承,它们的用法是相同的。接下来,我们只能详细解释视频制造商类的使用,并可以比较SilenceVideFilemaker和AudioFileMaker的使用方法。
以下是视频制造商类的公共方法的签名
代码如下:
public class VideoFileMaker :IDisposable
{
///
/// 初始化视频文件。
///
/// 文件路径
/// 视频编码格式
/// 视频宽度
/// 视频高度
/// 帧频
/// 音频编码格式
/// 音频采样率。【注:采样位数必须为16位】
/// 声道数
/// 如果是实时录制,则可传入true,以音频为基准进行同步。
void Initialize(string filePath, VideoCodecType videoCodec, int videoWidth, int videoHeight, int videoFrameRate, AudioCodecType audioCodec,
int audioSampleRate, int audioChannelCount, bool autoSyncToAudio);
///
/// 添加音频帧。
///
void AddAudioFrame(byte[] audioframe);
///
/// 添加视频帧。如果autoSyncToAudio开启,则自动同步到音频。
///
void AddVideoFrame(Bitmap frame);
///
/// 添加视频帧。
///
/// 视频帧
/// 离开始时的时间长度
void AddVideoFrame(Bitmap frame, TimeSpan timeStamp);
///
/// 关闭视频文件。
///
/// 如果还有帧等待写入文件,是否等待它们全部写入文件。
void Close(bool waitFinished);
}
首先,调用初始化方法以完成初始化,然后循环调用Addaudioframe和AddVideOframe方法。视频录制完成后,请致电Close方法,然后进行操作。非常简单,不是吗?
4。主代码
首先,我们以AA01用户登录到OMCS服务器,然后将摄像头控制器控件和麦克索开机组件拖动到主形式,然后将它们连接到自己的相机和麦克风。
this.multimediaManager = MultimediaManagerFactory.GetSingleton();
this.multimediaManager.Initialize("aa01", "", "127.0.0.1", 9900);
this.cameraConnector1.BeginConnect("aa01");
this.microphoneConnector1.BeginConnect("aa01");
接下来,我们初始化Videofilemaker组件:
this.videoFileMaker.Initialize("test.mp4", VideoCodecType.H264, this.multimediaManager.CameraVideoSize.Width, this.multimediaManager.CameraVideoSize.Height, 10, AudioCodecType.AAC, 16000, 1, true);
this.timer = new System.Threading.Timer(new System.Threading.TimerCallback(this.Callback), null ,0, 100);
this.multimediaManager.AudioPlayed += new ESBasic.CbGeneric(multimediaManager_AudioPlayed);
在参数中设置,使用H.264来编码视频,使用AAC来编码音频,并以MP4格式生成文件。然后,我们可以通过OMC获得实时音频和视频数据,然后将其写入文件。
void multimediaManager_AudioPlayed(byte[] audio)
{
this.videoFileMaker.AddAudioFrame(audio);
}
private void Callback(object state)
{
Bitmap bm = this.cameraConnector1.GetCurrentImage();
this.videoFileMaker.AddVideoFrame(bm);
}
当您想结束录制时,请致电关闭方法:
this.videoFileMaker.Close(true);
这样,可以直接使用我们的QQ音频或Storm Audio播放生成的test.mp4文件。