win8 metro 调用摄像头录制视频并将视频保存在相应的位置

上一篇文章介绍了在win8 metro 调用摄像头拍摄照片并将照片保存在相应的位置的功能,那么这一片文章主要介绍了的就是录制视频了,其实这个差不多,所用的思想也是一样的,因为图片和视频都可以转化为流文件,那么它们本质上都是一样的,但是还是有个别地方时不同的,接下来我们就介绍一下这个别地方的不同吧

下面是metro UI的代码:

<Page
    x:Class="Camera1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Camera1"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Button x:Name="btnCamera" Content="打开摄像头" HorizontalAlignment="Left" Margin="67,179,0,0" VerticalAlignment="Top" Click="btnCamera_Click"/>
        <MediaElement x:Name="media" HorizontalAlignment="Left" Height="604" Margin="273,45,0,0" VerticalAlignment="Top" Width="746"/>
        <Button x:Name="btnSave" Content="保存视频" HorizontalAlignment="Left" Margin="67,316,0,0" VerticalAlignment="Top" Click="btnSave_Click"/>
        <TextBox x:Name="txtBox1" HorizontalAlignment="Left" Margin="70,440,0,0" TextWrapping="Wrap" VerticalAlignment="Top"/>

    </Grid>
</Page>

下面是UI的控制代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

using Windows.Media.Capture;
using Windows.UI.Xaml.Media.Imaging;
using Windows.Storage;
using Windows.Storage.Streams;
using Windows.Storage.Pickers;

// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238

namespace Camera1
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainPage : Page
    {
        private StorageFile file = null;
        public MainPage()
        {
            this.InitializeComponent();
        }

        private async void btnCamera_Click(object sender, RoutedEventArgs e)
        {
            CameraCaptureUI dialog = new CameraCaptureUI();
            dialog.VideoSettings.Format = CameraCaptureUIVideoFormat.Mp4;
            file = await dialog.CaptureFileAsync(CameraCaptureUIMode.Video);
            if (file != null)
            {
                IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.Read);
                media.SetSource(fileStream,file.ContentType);
            }
        }

        private async void btnSave_Click(object sender, RoutedEventArgs e)
        {

                FileSavePicker picker = new FileSavePicker();
                picker.CommitButtonText = "保存";
                picker.SuggestedFileName = "hello";
                picker.FileTypeChoices.Add("图片",new string[]{".mp4",".avi",".mkv",".mpg",".rmvb"});
                picker.SuggestedStartLocation = PickerLocationId.VideosLibrary;
                StorageFile filePath = await picker.PickSaveFileAsync();
                if (filePath != null)
                {
                    var streamRandom = await file.OpenAsync(FileAccessMode.Read);
                    IBuffer buffer = RandomAccessStreamToBuffer(streamRandom);
                    await FileIO.WriteBufferAsync(filePath, buffer);

                }

        }

        //将视频写入到缓冲区
        private IBuffer RandomAccessStreamToBuffer(IRandomAccessStream randomstream)
        {
            Stream stream = WindowsRuntimeStreamExtensions.AsStreamForRead(randomstream.GetInputStreamAt(0));
            MemoryStream memoryStream = new MemoryStream();
            if (stream != null)
            {
                byte[] bytes = ConvertStreamTobyte(stream);
                if (bytes != null)
                {
                    var binaryWriter = new BinaryWriter(memoryStream);
                    binaryWriter.Write(bytes);
                }
            }
            IBuffer buffer = WindowsRuntimeBufferExtensions.GetWindowsRuntimeBuffer(memoryStream, 0, (int)memoryStream.Length);
            return buffer;
        }

        //将流转换成二进制
        public static byte[] ConvertStreamTobyte(Stream input)
        {
            byte[] buffer = new byte[1024 * 1024];
            using (MemoryStream ms = new MemoryStream())
            {
                int read;
                while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
                {
                    ms.Write(buffer, 0, read);
                }
                return ms.ToArray();
            }
        }

    }
}

程序完全可以运行,希望大家不吝赐教。

win8 metro 调用摄像头录制视频并将视频保存在相应的位置

时间: 2024-12-17 04:18:42

win8 metro 调用摄像头录制视频并将视频保存在相应的位置的相关文章

win8 metro 调用摄像头拍摄照片并将照片保存在相应的位置

刚刚做过这类开发,所以就先献丑了,当然所贴上的源码都是经过验证过的,已经运行成功了,希望可以给大家一些借鉴: 下面是metro UI代码: <Page x:Class="Camera.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

win8 metro 调用摄像头拍摄照片并将照片保存在对应的位置

刚刚做过这类开发,所以就先献丑了,当然所贴上的源代码都是经过验证过的,已经执行成功了,希望能够给大家一些借鉴: 以下是metro UI代码: <Page x:Class="Camera.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

win8 metro 自己写摄像头拍照项目

这个项目不是用的系统自带的CameraCaptureUI,是自己写的摄像头的调用,界面做的不好所以,不放了,但是可以实现拍照功能: 下面是using 程序命名空间: using Windows.Media.Capture; using Windows.Media.MediaProperties; using Windows.UI.Xaml.Media.Imaging; using Windows.Storage; using Windows.Storage.Pickers; using Wind

从摄像头录制视频实现

收藏两个摄像头录制视频的demo之一:基于opencv实现 QT PRO文件需要加入:LIBS +=   -lopencv_core -lopencv_highgui,或者使用g++ 利用这个参数来编译非QT环境的代码. #include <QCoreApplication> #include <QtGui/QCloseEvent> #include<opencv/cv.h> #include<opencv/highgui.h> void closeEven

win8 metro 自己写摄像头录像项目

这是要求不适用CameraCaptureUI等使用系统自带的 camera  UI界面.要求我们自己写调用摄像头摄像的方法,如今我把我的程序贴下: UI界面的程序: <Page x:Class="Camera3.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2

python+opencv读取视频,调用摄像头

引用 import cv2 import numpy 创建摄像头对象 cap = cv2.VideoCapture("videoTest/test1.mp4") #参数为视频文件目录 逐帧显示实现视频播放 while 1: ret, frame = cap.read() #读取 cv2.imshow("capture", frame) #显示 if cv2.waitKey(100) & 0xff == ord('q'): #按q退出 break 释放摄像头对

三 调用摄像头或打开视频文件

调用摄像头 # -*- coding=GBK -*- import cv2 as cv #打开摄像头获取图片 def video_demo(): capture = cv.VideoCapture(0)#打开摄像头,0代表的是设备id,如果有多个摄像头,可以设置其他数值 while True: ret, frame = capture.read() #读取摄像头,它能返回两个参数,第一个参数是bool型的ret,其值为True或False,代表有没有读到图片:第二个参数是frame,是当前截取一

HTML5——利用navigator+Video调用摄像头进行录像

以前无聊的时候玩儿过HTML5,感觉里面的很多新标签确实深深震撼了我额.... 今天需求那边要做这样一个功能,在微信里面调用摄像头进行拍摄,然后上传.刚开始最先想到的是Video标签,只要将它的src指定为当前摄像头录制到的视频就可以了. 后来百度了一段,发现还要用上Navigator,具体代码如下: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <t

win8 metro MediaCapture 类

最近接触的项目是有关win8 metro 中camera的项目,其中比较重要的类就是 MediaCapture类,现在介绍一下MediaCapture类,也总结一下自己的一些项目体会: 下面是MediaCapture类的一些方法调用: using System; using Windows.Foundation; using Windows.Foundation.Collections; using Windows.Foundation.Metadata; using Windows.Media