博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
与众不同 windows phone (41) - 8.0 相机和照片: 通过 AudioVideoCaptureDevice 捕获视频和音频...
阅读量:5881 次
发布时间:2019-06-19

本文共 9856 字,大约阅读时间需要 32 分钟。

原文:

与众不同 windows phone (41) - 8.0 相机和照片: 通过 AudioVideoCaptureDevice 捕获视频和音频

作者:
介绍
与众不同 windows phone 8.0 之 相机和照片

  • 通过 AudioVideoCaptureDevice 捕获视频和音频

示例
演示 AudioVideoCaptureDevice(wp8)的应用
CameraAndPhoto/AudioVideoCaptureDeviceDemo.xaml

CameraAndPhoto/AudioVideoCaptureDeviceDemo.xaml.cs

/* * 演示 AudioVideoCaptureDevice(wp8)的应用 *  * 关于 CaptureSource, FileSink(wp7)的应用参见 * http://www.cnblogs.com/webabcd/archive/2012/08/13/2635698.html * http://www.cnblogs.com/webabcd/archive/2012/08/15/2639428.html *  *  * 注: * 需要在 manifest 中增加配置 
*/using System;using System.Collections.Generic;using System.Linq;using System.Windows;using Microsoft.Phone.Controls;using Windows.Phone.Media.Capture;using Microsoft.Devices;using Windows.Storage.Streams;using Windows.Storage;using Microsoft.Phone.Tasks;namespace Demo.CameraAndPhoto{ public partial class AudioVideoCaptureDeviceDemo : PhoneApplicationPage { private AudioVideoCaptureDevice _captureDevice; private IRandomAccessStream _stream; public AudioVideoCaptureDeviceDemo() { InitializeComponent(); this.Loaded += AudioVideoCaptureDeviceDemo_Loaded; } private async void AudioVideoCaptureDeviceDemo_Loaded(object sender, RoutedEventArgs e) { // 一些概述类的说明 Summary(); // 是否有后置摄像头 if (AudioVideoCaptureDevice.AvailableSensorLocations.Contains(CameraSensorLocation.Back)) { // 获取后置摄像头摄像时的可用分辨率 IReadOnlyList
supportedResolutions = AudioVideoCaptureDevice.GetAvailableCaptureResolutions(CameraSensorLocation.Back); Windows.Foundation.Size resolution = supportedResolutions[0]; try { // 让后置摄像头以指定的分辨率捕获镜头内容 _captureDevice = await AudioVideoCaptureDevice.OpenAsync(CameraSensorLocation.Back, resolution); // AudioVideoCaptureDevice.OpenForVideoOnlyAsync() - 仅捕获视频 // AudioVideoCaptureDevice.OpenForAudioOnlyAsync() - 仅捕获音频 // 录像失败时触发的事件 _captureDevice.RecordingFailed += _captureDevice_RecordingFailed; /* * SetCaptureResolutionAsync() - 设置摄像的分辨率 * CaptureResolution - 获取当前摄像的分辨率 * VideoEncodingFormat - 当前的视频编码格式 * AudioEncodingFormat - 当前的音频编码格式 * FocusRegion - 对焦区域 * SensorLocation - 当前摄像头的位置(CameraSensorLocation 枚举:Back 或 Front) * SensorRotationInDegrees - 获取摄像头传感器相对于屏幕的旋转度数 * FocusAsync() - 自动对焦 * ResetFocusAsync() - 复位对焦 */ /* * KnownCameraAudioVideoProperties 属性集包括 * VideoFrameRate - 每秒抓取的视频帧数 * H264EncodingProfile - H264 编码的 profile(H264EncoderProfile 枚举) * H264EncodingLevel - H264 编码的 level(H264EncoderLevel 枚举) * H264EnableKeyframes - 是否启用关键帧 * H264QuantizationParameter - QP 值,低的 QP 会保留大部分空间的详细信息,从而达到最佳质量,高的 QP 会在一定程度上造成质量的损失,但能帮助编码器实现较低的比特率 * H264RequestDropNextNFrames - 指定编码器应丢弃的帧数 * H264RequestIdrFrame - 此属性设置为 true 时,系统请求编码流程进行瞬时解码刷新(IDR) * UnmuteAudioWhileRecording - 此属性设置为 true 时,能在记录期间为音频取消静音 * VideoTorchMode - 录像时如何使用闪光灯(VideoTorchMode 枚举:Off, Auto, On) * VideoTorchPower - 录像时闪光灯的亮度,无单位且不同设备上的值不同 */ _captureDevice.SetProperty(KnownCameraAudioVideoProperties.H264EncodingProfile, H264EncoderProfile.Baseline); /* * KnownCameraGeneralProperties 属性集包括 * AutoFocusRange - 自动对焦的范围(AutoFocusRange 枚举,包括微距等) * EncodeWithOrientation - 视频编码时的旋转角度,必须是 90 的倍数 * SpecifiedCaptureOrientation - 元数据中的旋转角度,必须是 90 的倍数 * IsShutterSoundEnabledByUser - 用户是否启用了快门声音,只读 * IsShutterSoundRequiredForRegion - 运行应用程序的区域是否需要快门声音(有些区域为了保护隐私,要求照相或录像必须要有快门声音),只读 * PlayShutterSoundOnCapture - 指定捕获时是否播放快门声音 * ManualFocusPosition - 手动对焦的位置 */ _captureDevice.SetProperty(KnownCameraGeneralProperties.AutoFocusRange, AutoFocusRange.Normal); _captureDevice.SetProperty(KnownCameraGeneralProperties.EncodeWithOrientation, _captureDevice.SensorRotationInDegrees); // 获取指定属性的值 // _captureDevice.GetProperty(KnownCameraGeneralProperties.IsShutterSoundEnabledByUser); /* * 获取指定的范围类属性在当前摄像头中所允许的值的范围 */ // AudioVideoCaptureDevice.GetSupportedPropertyRange(CameraSensorLocation.Back, KnownCameraAudioVideoProperties.H264QuantizationParameter); /* * 获取指定的值类属性在当前摄像头中所允许的值的列表 */ // AudioVideoCaptureDevice.GetSupportedPropertyValues(CameraSensorLocation.Back, KnownCameraAudioVideoProperties.H264EncodingProfile); // 实时显示捕获的内容 videoBrush.SetSource(_captureDevice); // 扩展方法来自:Microsoft.Devices.CameraVideoBrushExtensions rt.Angle = _captureDevice.SensorRotationInDegrees; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } else { MessageBox.Show("没有后置摄像头"); } } // 录像失败 void _captureDevice_RecordingFailed(AudioVideoCaptureDevice sender, CaptureFailedEventArgs args) { this.Dispatcher.BeginInvoke(delegate() { MessageBox.Show("error: " + args.ErrorCode.ToString()); }); } // 开始录像 private async void btnCapture_Click(object sender, RoutedEventArgs e) { try { // 获取应用程序数据存储文件夹 StorageFolder applicationFolder = ApplicationData.Current.LocalFolder; // 在指定的应用程序数据存储文件夹内创建指定的文件 StorageFile storageFile = await applicationFolder.CreateFileAsync("webabcdTest.mp4", CreationCollisionOption.ReplaceExisting); // 打开文件流,准备写入录像数据 _stream = await storageFile.OpenAsync(FileAccessMode.ReadWrite); // 录制视频到指定的流 await _captureDevice.StartRecordingToStreamAsync(_stream); btnCapture.IsEnabled = false; btnStop.IsEnabled = true; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } // 停止录像 private async void btnStop_Click(object sender, RoutedEventArgs e) { // 停止录像 await _captureDevice.StopRecordingAsync(); _stream.Dispose(); btnCapture.IsEnabled = true; btnStop.IsEnabled = false; } // 播放录制的内容 private void btnPlay_Click(object sender, RoutedEventArgs e) { // 启动媒体播放器,播放录制的内容 MediaPlayerLauncher mediaPlayerLauncher = new MediaPlayerLauncher(); // new Uri("webabcdTest.mp4", UriKind.Relative) 结合 MediaLocationType.Data,则系统会先在应用程序存储的 Local 目录下找,找不到再到 Local/IsolatedStorage 目录下找 mediaPlayerLauncher.Media = new Uri("webabcdTest.mp4", UriKind.Relative); mediaPlayerLauncher.Location = MediaLocationType.Data; mediaPlayerLauncher.Controls = MediaPlaybackControls.Pause | MediaPlaybackControls.Stop; mediaPlayerLauncher.Orientation = MediaPlayerOrientation.Landscape; mediaPlayerLauncher.Show(); } private void Summary() { lblMsg.Text = ""; // 获取电话上的可用摄像头 foreach (CameraSensorLocation csl in AudioVideoCaptureDevice.AvailableSensorLocations) { // Back 或 Front lblMsg.Text += "摄像头:" + csl.ToString(); lblMsg.Text += System.Environment.NewLine; // 摄像所支持的分辨率 lblMsg.Text += "摄像的可用分辨率:"; foreach (var size in AudioVideoCaptureDevice.GetAvailableCaptureResolutions(csl)) { lblMsg.Text += size.Width + "*" + size.Height + " "; } lblMsg.Text += System.Environment.NewLine; lblMsg.Text += System.Environment.NewLine; // 关于 CameraButtons 参见以前的文章:http://www.cnblogs.com/webabcd/archive/2012/08/15/2639428.html // CameraButtons.ShutterKeyHalfPressed 事件,CameraButtons.ShutterKeyPressed 事件,CameraButtons.ShutterKeyReleased 事件 } lblMsg.Text += "终端所支持的视频编码格式:"; foreach (CameraCaptureVideoFormat format in AudioVideoCaptureDevice.SupportedVideoEncodingFormats) { lblMsg.Text += format.ToString() + " "; } lblMsg.Text += System.Environment.NewLine; lblMsg.Text += "终端所支持的音频编码格式:"; foreach (CameraCaptureAudioFormat format in AudioVideoCaptureDevice.SupportedAudioEncodingFormats) { lblMsg.Text += format.ToString() + " "; } lblMsg.Text += System.Environment.NewLine; } }}

OK

你可能感兴趣的文章
ASP.NET MVC 防止CSRF攻击
查看>>
EF:无法检查模型兼容性,因为数据库不包含模型元数据。
查看>>
0和5
查看>>
C# WinFrom一些技术小结
查看>>
hdu5001 Walk 概率DP
查看>>
模拟select控件&&显示单击的坐标&&用户按下键盘,显示keyCode
查看>>
CodeBlocks 安装和使用
查看>>
Mac-OSX下Ruby更新
查看>>
jsp九个内置对象
查看>>
[Python笔记][第一章Python基础]
查看>>
Bloomberg SEP 12.x 迁移小记
查看>>
操作数据库(防注入攻击)
查看>>
生日小助手V1.1发布了——拥有更整齐的信息列表
查看>>
代理模式
查看>>
Qt 学习(1)
查看>>
MFC CEdit改变字体大小的方法
查看>>
java 中文数字排序方法
查看>>
centos 关于防火墙的命令
查看>>
openstack 源码分析
查看>>
ZOJ3861 Valid Pattern Lock(DFS||打表+枚举)
查看>>