using Accord.Video;
using Accord.Video.DirectShow;
using Common.system;
using NAudio.Wave;
using System;
using System.Data;
using System.Diagnostics;
using System.Drawing.Imaging;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media.Imaging;
namespace XHWK.WKTool
{
using System.Linq;
using system;
///
/// DeviceWindow.xaml 的交互逻辑
///
public partial class DeviceWindow
{
private bool _cameraGood;
private bool _microphoneGood;
private bool _loudspeakerGood;
public DeviceWindow()
{
InitializeComponent();
MicrophoneSetting.Click += MicrophoneSetting_Click;
CameraCheck();
}
private void MicrophoneSetting_Click(object sender, RoutedEventArgs e)
{
Process.Start("mmsys.cpl");
}
///
/// 初始化
///
public void Initialize()
{
TxbCamera.Text = "";
TxbSpeaker.Text = "";
TxbMicrophone.Text = "";
}
///
/// 窗体移动
///
///
///
///
///
private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
DragMove();
}
///
/// 关闭当前页
///
///
///
///
///
private void BtnDown_Click(object sender, RoutedEventArgs e)
{
ImgPlayer.Visibility = Visibility.Hidden;
CloseCamera();
if (_waveIn != null)
{
_waveIn.StopRecording();
}
Close();
}
#region 摄像头
private void CameraCheck()
{
HidePage();
GridCamera.Visibility = Visibility.Visible;
var devs = new FilterInfoCollection(FilterCategory.VideoInputDevice); //获取摄像头列表
var allCamera = devs.Where
(x => x.Name != "screen-capture-recorder" && x.Name != "OBS Virtual Camera")
.ToList();
CmbCameraList.ItemsSource = allCamera;
if (allCamera.Count > 0)
{
CmbCameraList.SelectedIndex = 0;
App.CameraName = allCamera[0].MonikerString;
}
}
private void CmbCameraList_SelectionChanged
(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
Console.WriteLine(@"选择变化");
CheckCamera();
}
private VideoCaptureDevice _camera; //用来操作摄像头
///
/// 检测
///
private void CheckCamera()
{
try
{
CloseCamera();
ImgPlayer.Visibility = Visibility.Visible;
if (CmbCameraList.SelectedIndex >= 0)
{
var info = CmbCameraList.SelectedItem as FilterInfo;
App.CameraName = info.MonikerString;
_camera = new VideoCaptureDevice(info.MonikerString);
//配置录像参数(宽,高,帧率,比特率等参数)VideoCapabilities这个属性会返回摄像头支持哪些配置
_camera.VideoResolution = _camera.VideoCapabilities[0];
_camera.NewFrame +=
Camera_NewFrame; //设置回调,aforge会不断从这个回调推出图像数据,SnapshotFrame也是有待比较
_camera.Start(); //打开摄像头
}
}
catch (Exception ex)
{
LogHelper.Logerror.Error("【摄像头检测】(DeviceWindow)摄像头不可用:" + ex.Message, ex);
}
}
private void CloseCamera()
{
try
{
if (_camera != null)
{
_camera.SignalToStop();
}
}
catch (Exception)
{
// ignored
}
}
///
/// 摄像头输出回调
///
private void Camera_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
Dispatcher.Invoke
(
() =>
{
MemoryStream ms = new MemoryStream();
eventArgs.Frame.Save(ms, ImageFormat.Bmp);
BitmapImage image = new BitmapImage();
image.BeginInit();
image.StreamSource = new MemoryStream(ms.GetBuffer());
ms.Close();
image.EndInit();
ImgPlayer.Source = image;
}
); //同步显示
}
///
/// 停止
///
///
///
///
///
private void BtnCameraStop_Click(object sender, RoutedEventArgs e)
{
if (_camera != null)
{
_camera.SignalToStop();
}
}
#endregion 摄像头
#region 扬声器
///
/// 扬声器
///
private void Speaker_Check()
{
CloseCamera();
CmbCameraList.SelectedIndex = -1;
HidePage();
GridSpeaker.Visibility = Visibility.Visible;
}
///
/// 检测扬声器
///
///
///
///
///
private void BtnSpeakerDetection_Click(object sender, RoutedEventArgs e)
{
Console.WriteLine(@"播放");
MediaAudio.Source = new Uri
(FileToolsCommon.GetFileAbsolutePath("/Resources/audiotest.mp3"));
MediaAudio.Position = TimeSpan.Zero;
MediaAudio.Play();
ImgAcousticWave.Visibility = Visibility.Visible;
}
#region 音频播放
///
/// 音频播放 同步进度条和视频进度
///
///
///
///
///
private void MediaAudio_MediaOpened(object sender, RoutedEventArgs e)
{
Console.WriteLine(@"播放中。。。");
}
private void MediaAudio_MediaEnded(object sender, RoutedEventArgs e)
{
MediaAudio.Stop();
MediaAudio.Position = TimeSpan.Zero;
}
#endregion 音频播放
#endregion 扬声器
#region 麦克风
///
/// 麦克风
///
///
///
private async void Microphone_Check()
{
MediaAudio.Stop();
ImgAcousticWave.Visibility = Visibility.Collapsed;
HidePage();
GridMicrophone.Visibility = Visibility.Visible;
DataTable data = new DataTable();
data.Columns.Add("Value");
data.Columns.Add("Key");
await Task.Run
(
() =>
{
for (int n = 0; n < WaveIn.DeviceCount; n++)
{
var caps = WaveIn.GetCapabilities(n);
//创建一行
DataRow row = data.NewRow();
//将此行添加到table中
data.Rows.Add(row);
data.Rows[n]["Value"] = caps.ProductName;
data.Rows[n]["Key"] = n + "";
}
}
);
CmbMicrophoneList.ItemsSource = data.DefaultView;
if (WaveIn.DeviceCount > 0)
{
CmbMicrophoneList.SelectedIndex = 0;
}
}
private WaveInEvent _waveIn;
private void CmbMicrophoneList_SelectionChanged
(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
if (_waveIn != null)
{
_waveIn.StopRecording();
}
VolumeProgressBar.Value = 0;
if (CmbMicrophoneList.SelectedIndex >= 0)
{
var selectIndex = CmbMicrophoneList.SelectedIndex;
ThreadPool.QueueUserWorkItem
(
(item) =>
{
_waveIn = new WaveInEvent();
_waveIn.DeviceNumber = selectIndex;
//开始录音,写数据
_waveIn.DataAvailable += (o, e1) =>
{
byte[] buf = e1.Buffer;
float maxNumber = 0;
for (int index = 0; index < buf.Length; index += 2)
{
short sample = (short)((buf[index + 1] << 8) | buf[index + 0]);
float sample32 = sample / 32768f;
sample32 = Math.Abs(sample32);
if (sample32 > maxNumber)
{
maxNumber = sample32;
}
}
Dispatcher.Invoke
(
() =>
{
VolumeProgressBar.Value = maxNumber * 100;
}
);
};
//结束录音
_waveIn.RecordingStopped += (s, a) =>
{
_waveIn.Dispose();
};
_waveIn.StartRecording();
}
);
}
}
#endregion 麦克风
#region 页面切换
///
/// 检测页
///
private void result_show()
{
HidePage();
GridDetection.Visibility = Visibility.Visible;
if (_cameraGood)
{
TxbCamera.Text = "可用";
}
else
{
TxbCamera.Text = "不可用";
}
if (_loudspeakerGood)
{
TxbSpeaker.Text = "可用";
}
else
{
TxbSpeaker.Text = "不可用";
}
if (_microphoneGood)
{
TxbMicrophone.Text = "可用";
}
else
{
TxbMicrophone.Text = "不可用";
}
}
///
/// 隐藏页
///
private void HidePage()
{
GridDetection.Visibility = Visibility.Collapsed;
GridCamera.Visibility = Visibility.Collapsed;
GridSpeaker.Visibility = Visibility.Collapsed;
GridMicrophone.Visibility = Visibility.Collapsed;
try
{
CameraHelper.CloseDevice();
}
catch (Exception)
{
// ignored
}
}
#endregion 页面切换
#region 事件
private void btn_camera_good_Click(object sender, RoutedEventArgs e)
{
_cameraGood = true;
Speaker_Check();
}
private void btn_camera_bad_Click(object sender, RoutedEventArgs e)
{
_cameraGood = false;
Speaker_Check();
}
private void btn_speaker_good_Click(object sender, RoutedEventArgs e)
{
_loudspeakerGood = true;
Microphone_Check();
}
private void btn_speaker_bad_Click(object sender, RoutedEventArgs e)
{
_loudspeakerGood = false;
Microphone_Check();
}
private void btn_microphone_good_Click(object sender, RoutedEventArgs e)
{
if (_waveIn != null)
{
_waveIn.StopRecording();
}
_microphoneGood = true;
result_show();
CmbMicrophoneList.SelectedIndex = -1;
}
private void btn_microphone_bad_Click(object sender, RoutedEventArgs e)
{
if (_waveIn != null)
{
_waveIn.StopRecording();
}
_microphoneGood = false;
result_show();
CmbMicrophoneList.SelectedIndex = -1;
}
///
/// 重新
///
///
///
///
///
private void BtnDetection_Click(object sender, RoutedEventArgs e)
{
CameraCheck();
}
#endregion 事件
}
}