使用WP8最新的AudioVideoCaptureDevice类制作录像应用
WP8出来好一段时间了,新出的AudioVideoCaptureDevice类自定义功能比WP7的CaptureSource强大的多,但网上比较全面的中文实例还比较少,分享一个最近做的小实例给大家参考。
一、实现的功能
1、实现视频和音频的采集并保存
2、允许切换前后摄像头
3、录像过程中可以随时截图
4、录像后视频播放
二、需要的权限
1、需要访问前后摄像头的权限(ID_CAP_ISV_CAMERA)
2、需要访问麦克风的权限(ID_CAP_MICROPHONE)
三 、UI部分
1、使用一个Rectangle控件实时显示摄像头采集到的画面
2、使用一个Image控件来显示视频截图
3、使用一个MediaElement控件来播放录制好的视频
4、使用一个HyperLinkButton控件来切换摄像头
<Canvas x:Name="LayoutRoot" Background="Transparent"> <!--Camera viewfinder >-->
<Rectangle x:Name="Re_video" Width="640" Height="480">
<Rectangle.Fill>
<VideoBrush x:Name="TheVideoBrush"></VideoBrush>
</Rectangle.Fill>
</Rectangle> <MediaElement
x:Name="VideoPlayer"
Width="480"
Height="640"
AutoPlay="True"
RenderTransformOrigin="0.5, 0.5"
VerticalAlignment="Center"
HorizontalAlignment="Center"
Stretch="Fill"
Canvas.Left="0"/> <Image Name="imgCapture" Width="320" Height="240" Margin="20 0 0 0" /> <Grid Margin="20,10" Width="450">
<HyperlinkButton Width="50" x:Name="hyper_changes" Click="hyper_changes_Click" HorizontalAlignment="Right">
<HyperlinkButton.Template>
<ControlTemplate>
<Image Source="/Images/Camera/changes.png" />
</ControlTemplate>
</HyperlinkButton.Template>
</HyperlinkButton>
</Grid>
</Canvas>
四、代码部分
1、定义基础变量
//目录
private string m_path = "Vedio";
//视频文件名
private string m_filename = string.Empty;
//用于设置摄像头旋转的角度
RotateTransform rt1 = new RotateTransform();
//用于设置使用前置还是后置的摄像头
CameraSensorLocation sensorLocation = CameraSensorLocation.Front;
//随机访问数据流
private Windows.Storage.Streams.IRandomAccessStream m_iRandomAccessStream;
//捕获视频设备对象
private Windows.Phone.Media.Capture.AudioVideoCaptureDevice m_captureDevice;
2、初始化录像设备
/// <summary>
/// 初始化捕获设备,
/// </summary>
private async void Init()
{
try
{
if (m_captureDevice != null)
{
m_captureDevice.Dispose();
m_captureDevice = null;
}
//获取视频捕获设备
m_captureDevice = await AudioVideoCaptureDevice.OpenAsync(sensorLocation, new Windows.Foundation.Size(, )); int sensorOrientation = (Int32)this.m_captureDevice.SensorRotationInDegrees; if (sensorLocation == CameraSensorLocation.Back)
{
rt1.CenterX = ;
rt1.CenterY = ;
rt1.Angle = ;
Re_video.RenderTransform = rt1;
}
else
{
rt1.CenterX = ;
rt1.CenterY = ;
rt1.Angle = ;
Re_video.RenderTransform = rt1;
} m_captureDevice.SetProperty(KnownCameraGeneralProperties.EncodeWithOrientation, sensorLocation == CameraSensorLocation.Back ? : );
//m_captureDevice.SetProperty(KnownCameraAudioVideoProperties.VideoFrameRate, 20);
m_captureDevice.SetProperty(KnownCameraAudioVideoProperties.UnmuteAudioWhileRecording, true);
m_captureDevice.VideoEncodingFormat = CameraCaptureVideoFormat.H264; TheVideoBrush.SetSource(m_captureDevice);
//设置视频数据格式 }
catch (Exception e)
{
throw e;
}
}
注意:
1)、KnownCameraGeneralProperties.EncodeWithOrientation 可以控制前后摄像头旋转的角度, 默认情况下WP获取的视频都是倒着显示的
2)、KnownCameraAudioVideoProperties.UnmuteAudioWhileRecording 是让视频在录制时取消静音,默认情况下是静音的
3)、CameraCaptureVideoFormat.H264; 使用H264编码方式
3、开始录制视频
//开始录制
private async void StartRecord()
{
m_filename = Guid.NewGuid().ToString() + ".mp4";
try
{
StorageFile file = null;
StorageFolder folder = ApplicationData.Current.LocalFolder;
using (IsolatedStorageFile isolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication())
{
//不存在目录,则创建
if (!isolatedStorageFile.DirectoryExists(m_path))
{
isolatedStorageFile.CreateDirectory(m_path);
}
} folder = await folder.GetFolderAsync(m_path); m_iRandomAccessStream = null;
//创建视频文件
file = await folder.CreateFileAsync(m_filename, CreationCollisionOption.ReplaceExisting);
m_iRandomAccessStream = await file.OpenAsync(FileAccessMode.ReadWrite);
//开始捕获视频数据并写到随机流中
await m_captureDevice.StartRecordingToStreamAsync(m_iRandomAccessStream); }
catch (Exception ex)
{
throw ex;
}
}
4、录制过程中实现截图功能
/// <summary>
/// 截取视频图像
/// </summary>
private void GetPreview()
{
WriteableBitmap wBitmap = new WriteableBitmap(, );
wBitmap.Render(Re_video, new MatrixTransform());//截取视频
wBitmap.Invalidate();
imgCapture.Source = wBitmap;
}
注意:这段代码的思路其实是截取Rectangle控件的UI界面
5、停止录制视频
//停止录制
private async void StopRecord()
{
try
{
await m_captureDevice.StopRecordingAsync();
m_iRandomAccessStream.Dispose();
}
catch (Exception ex)
{
throw ex;
}
}
6、播放录制好的视频
/// <summary>
/// 播放录制的视频
/// </summary>
private void PlayVideo()
{
string path = m_path + "/" + m_filename;
using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
{
using (IsolatedStorageFileStream fileStream = myIsolatedStorage.OpenFile(path, FileMode.Open, FileAccess.Read))
{
VideoPlayer.SetSource(fileStream);
fileStream.Dispose();
fileStream.Close();
}
}
}
7、切换前后摄像头
/// <summary>
/// 切换前后摄像头
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void hyper_changes_Click(object sender, System.Windows.RoutedEventArgs e)
{
if (sensorLocation == CameraSensorLocation.Front)
sensorLocation = CameraSensorLocation.Back;
else
sensorLocation = CameraSensorLocation.Front;
Init();
}
至此,大致功能全部实现了, 当然还需要处理一些按钮事件, 这些直接看附件吧:
http://share.weiyun.com/d89188c5490e6bf95c7f7aa08c0f81bc
欢迎有共同兴趣的朋友交流, 微博地址:http://weibo.com/yanghongjin
如果觉得本文对你有帮助,可以微信扫描以下二维码请我喝杯咖啡
使用WP8最新的AudioVideoCaptureDevice类制作录像应用的更多相关文章
- 最新的SqlHelper 类
最新的SqlHelper 类 摘自:http://www.cnblogs.com/sufei/archive/2010/01/14/1648026.html using System; using S ...
- 巧用CSS3 :target 伪类制作Dropdown下拉菜单(无JS)
:target 是CSS3 中新增的一个伪类,用以匹配当前页面的URI中某个标志符的目标元素(比如说当前页面URL下添加#comment就会定位到id=“comment”的位置,俗称锚).CSS3 为 ...
- 巧用CSS3:target 伪类制作Dropdown下拉菜单(无JS)
原文链接:http://devework.com/css3-target-dropdown.html :target 是CSS3 中新增的一个伪类,用以匹配当前页面的URI中某个标志符的目标元素(比如 ...
- CSS-用伪类制作小箭头(轮播图的左右切换btn)
先上学习地址:http://www.htmleaf.com/Demo/201610234136.html 作者对轮播图左右按钮的处理方法一改往常,不是简单地用btn.prev+btn.next的图片代 ...
- :target伪类制作tab选项卡
:target伪类的作用是突出显示活动的HTML锚,下面是一个简单的例子: HTML代码: <div> <a href="#demo1">点击此处</ ...
- 使用before、after伪类制作三角形
使用before.after伪类实现三角形的制作,不需要再为三角形增加不必要的DOM元素,影响阅读. <!DOCTYPE html><html><head> ...
- 用css伪类制作三角形的三种方法
在手机上写三角形的时候,我一般都用伪类,刚开始的时候用的图片,但是在现在的手机高清屏幕上,图片容易失真,还是用伪类吧! 第一种:一个90度的“ > ”, 只有线条.(可以做下拉框的箭头之类的) ...
- 利用:before和:after伪类制作CSS3 圆形按钮 含demo
要求 必备知识 基本了解CSS语法,初步了解CSS3语法知识. 开发环境 Adobe Dreamweaver CS6 演示地址 演示地址 预览截图(抬抬你的鼠标就可以看到演示地址哦): 制作步骤: 一 ...
- 利用:before和:after伪类制作类似微信对话框
今天学到了怎么做一个小三角形,进而结合其他属性把类似微信对话框的图形做出来了. 先做出如下形状: .arrow { width: 30px; height:30px; border-width:20p ...
随机推荐
- MHA+Atlas+mysql一主一从开启gtid安装配置与实验
各节点架构 (说明:生产环境有两个节点可以组成一套完整集群,我是测试环境,因此对于manager以及atlas和binlog server都是单点,如果生产环境,相应的将manager以及atlas和 ...
- C# 自动生成代码API文档
暂时没学会正规的转载style临时记录一下 NET中的规范标准注释(一) -- XML注释标签讲解 http://www.cnblogs.com/mq0036/p/3544264.html NET中的 ...
- EF中的Code First
一些概念 POCO POCO(Plain Old CLR Object)的概念是从java的POJO借用而来,而两者的含义是一致的,不同的仅仅是使用的语言不一样.所以POCO的解释就是“Plai ...
- js对特殊字符转义、时间格式化、获取URL参数
/*特殊字符转义*/ function replace_html(str) { var str = str.toString().replace(/&/g, "&" ...
- 非域环境下使用证书部署数据库(SqlServer2008R2)镜像
非域环境下使用证书部署数据库(SqlServer2008R2)镜像 前言 部署数据库镜像一般有两种方式域环境下部署http://liulike.blog.51cto.com/1355103/33918 ...
- 红帽RHEL7版本RHCE认证学习及考试经历
RHCE是红帽公司推出的Linux系统的中级认证,考试全部采取上机形式,在考察考生的基础理论知识的同时还能考察实践动手操作能力,在Linux领域的价值是不可否认的,所以对于期望从事相关行业的同学们在上 ...
- sublime简书安装配置
sublime-text3编辑器 安装 sudo add-apt-repository ppa:webupd8team/sublime-text-3 sudo apt-get update sudo ...
- C# 中 多线程同步退出方案 CancellationTokenSource
C# 中提供多线程同步退出机制,详参对象: CancellationTokenSource CancellationTokenSource 中暂未提供复位操作,因此当调用Cancle 之后,若再次调用 ...
- Centos配置SS5代理
wget http://heanet.dl.sourceforge.net/project/ss5/ss5/3.8.9-8/ss5-3.8.9-8.tar.gz tar xvf ss5-3.8.9-8 ...
- imx6sl 调试记录
公板芯片型号:MCIMX6L8DVN10AB 我的板子芯片型号:MCIMX6L2EVN10AB no GPU ,no EPDC 调板子时一定要注意,首先要搞清楚硬件芯片的具体差异,然后去nxp的官网找 ...