[源码下载]

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

作者:webabcd

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

  • 通过 AudioVideoCaptureDevice 捕获视频和音频

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

<phone:PhoneApplicationPage
x:Class="Demo.CameraAndPhoto.AudioVideoCaptureDeviceDemo"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d"
shell:SystemTray.IsVisible="True"> <Grid x:Name="LayoutRoot" Background="Transparent">
<StackPanel> <StackPanel Orientation="Horizontal">
<Canvas Width="240" Height="180" RenderTransformOrigin="0.5 0.5">
<Canvas.Background>
<VideoBrush x:Name="videoBrush" />
</Canvas.Background>
<Canvas.RenderTransform>
<RotateTransform x:Name="rt" />
</Canvas.RenderTransform>
</Canvas>
<MediaElement Name="mediaElement" Width="240" Height="180" />
</StackPanel> <StackPanel Orientation="Horizontal" Margin="0 50 0 0">
<Button Name="btnCapture" Content="录像" Click="btnCapture_Click" />
<Button Name="btnStop" Content="停止" Click="btnStop_Click" IsEnabled="False" />
<Button Name="btnPlay" Content="播放" Click="btnPlay_Click" />
</StackPanel> <TextBlock x:Name="lblMsg" TextWrapping="Wrap" Margin="0 10 0 0" /> </StackPanel>
</Grid> </phone:PhoneApplicationPage>

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 中增加配置 <Capability Name="ID_CAP_ISV_CAMERA" /> <Capability Name="ID_CAP_MICROPHONE" /> <Capability Name="ID_CAP_MEDIALIB_PHOTO" />
*/ 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<Windows.Foundation.Size> supportedResolutions = AudioVideoCaptureDevice.GetAvailableCaptureResolutions(CameraSensorLocation.Back);
Windows.Foundation.Size resolution = supportedResolutions[]; 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
[源码下载]

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

  1. 与众不同 windows phone (42) - 8.0 相机和照片: 通过 PhotoCaptureDevice 捕获照片

    [源码下载] 与众不同 windows phone (42) - 8.0 相机和照片: 通过 PhotoCaptureDevice 捕获照片 作者:webabcd 介绍与众不同 windows pho ...

  2. 与众不同 windows phone (43) - 8.0 相机和照片: 镜头的可扩展性, 图片的可扩展性, 图片的自动上传扩展

    [源码下载] 与众不同 windows phone (43) - 8.0 相机和照片: 镜头的可扩展性, 图片的可扩展性, 图片的自动上传扩展 作者:webabcd 介绍与众不同 windows ph ...

  3. 与众不同 windows phone (34) - 8.0 新的控件: LongListSelector

    [源码下载] 与众不同 windows phone (34) - 8.0 新的控件: LongListSelector 作者:webabcd 介绍与众不同 windows phone 8.0 之 新的 ...

  4. 与众不同 windows phone (35) - 8.0 新的启动器: ShareMediaTask, SaveAppointmentTask, MapsTask, MapsDirectionsTask, MapDownloaderTask

    [源码下载] 与众不同 windows phone (35) - 8.0 新的启动器: ShareMediaTask, SaveAppointmentTask, MapsTask, MapsDirec ...

  5. 与众不同 windows phone (36) - 8.0 新的瓷贴: FlipTile, CycleTile, IconicTile

    [源码下载] 与众不同 windows phone (36) - 8.0 新的瓷贴: FlipTile, CycleTile, IconicTile 作者:webabcd 介绍与众不同 windows ...

  6. 与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件

    [源码下载] 与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件 作者:w ...

  7. 与众不同 windows phone (38) - 8.0 关联启动: 使用外部程序打开一个文件或URI, 关联指定的文件类型或协议

    [源码下载] 与众不同 windows phone (38) - 8.0 关联启动: 使用外部程序打开一个文件或URI, 关联指定的文件类型或协议 作者:webabcd 介绍与众不同 windows ...

  8. 与众不同 windows phone (39) - 8.0 联系人和日历

    [源码下载] 与众不同 windows phone (39) - 8.0 联系人和日历 作者:webabcd 介绍与众不同 windows phone 8.0 之 联系人和日历 自定义联系人存储的增删 ...

  9. 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能

    [源码下载] 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能 作者:webabcd 介绍与众不同 windows ...

随机推荐

  1. C# 读取JSON

    引用 Newtonsoft.Json.dll //C# 读取JSON Newtonsoft.Json.Linq.JObject jsonStr = Newtonsoft.Json.Linq.JObje ...

  2. CISA 信息系统审计知识点 [第二章. IT治理和管理 ]

    第二章.  IT治理和管理 1.  IT治理.管理.安全和控制框架及标准.指南和实践 IT治理是董事会和执行管理层的职责. IT治理的关键因素:保持与业务的战略一致,引导业务价值的实现. IT治理关注 ...

  3. Promising Linking

    Future/Promise 执行逻辑 scala Future 有几个要点,第一个是 tryAwait 需要借助 CowndownLatch 实现,第二个是可以在 Promise 挂载回调函数 首先 ...

  4. EvreryDay Collect

    1.在使用WebService时我们经常会考虑以下问题:怎么防止别人访问我的WebService? 在System.Net中提供了一个NetworkCredential,只有获得该凭证的用户才能访问相 ...

  5. sql server命令行

    http://www.cnblogs.com/bingcaihuang/archive/2011/01/31/1948222.html http://www.cnblogs.com/wontonJ/a ...

  6. php 5.4 5.5 如何连接 ms sqlserver

    https://msdn.microsoft.com/en-us/sqlserver/ff657782.aspx

  7. Log4Net 手册

    首先感慨下,现在的程序员做的工作因为高级语言的生产力,系统框架模式的成熟,开源大牛的贡献,已经成越来越偏向 “面向配置编程”了...... 详细使用指南见文章:http://blog.csdn.net ...

  8. 【转】github上值得关注的前端项目

    综合/资源 frontend-dev-bookmarks 一个巨大的前端开发资源清单.star:15000 front-end-collect 分享自己长期关注的前端开发相关的优秀网站.博客.以及活跃 ...

  9. nodejs+express中设置登录拦截器

    在nodejs+express中,采用nodejs后端路由控制用户登录后,为了加强前端的安全性控制,阻止用户通过在浏览器地址栏中输入地址访问后台接口,在app.js中需要加入拦截器进行拦截: /*** ...

  10. [Python] Keep efficient by vim in Pycharm

    From: http://blog.csdn.net/u013088062/article/details/50144201 From: http://blog.csdn.net/u013088062 ...