从IP摄像头进行C#流式传输并保存到UWP Windows 10中的文件

从IP摄像头进行C#流式传输并保存到UWP Windows 10中的文件,c#,ffmpeg,camera,uwp,vlc,C#,Ffmpeg,Camera,Uwp,Vlc,我正在开发一个通用windows 10应用程序,它必须从ACTi ip摄像头录制,并录制到文件。对于预览,我使用了VLC.MediaElement,它工作得非常好,但我需要将这些连续帧录制或保存到视频文件中。任何人都知道如何将其保存到文件中。摄像头使用http协议传输数据流,而不是RTSP或其他任何协议 我不介意使用FFMPEG的VLC,但我不能在UWP应用程序中从cmd.exe启动它 有什么想法吗 我是这样使用VLC.MediaElement的。对于预览,没有问题: <vlc:Medi

我正在开发一个通用windows 10应用程序,它必须从ACTi ip摄像头录制,并录制到文件。对于预览,我使用了VLC.MediaElement,它工作得非常好,但我需要将这些连续帧录制或保存到视频文件中。任何人都知道如何将其保存到文件中。摄像头使用http协议传输数据流,而不是RTSP或其他任何协议

我不介意使用FFMPEG的VLC,但我不能在UWP应用程序中从cmd.exe启动它

有什么想法吗

我是这样使用VLC.MediaElement的。对于预览,没有问题:

 <vlc:MediaElement Name="VLCPreview" AreTransportControlsEnabled="True" HardwareAcceleration="True" AutoPlay="True" Grid.ColumnSpan="3" HorizontalAlignment="Left" Height="960" VerticalAlignment="Top" Width="1141" Margin="299,0,0,0">
            <vlc:MediaElement.TransportControls>
                <vlc:MediaTransportControls ControlPanelOpacity="0.8" />
            </vlc:MediaElement.TransportControls>
        </vlc:MediaElement>
        <MediaElement x:Name="mediaElement" AreTransportControlsEnabled="True" AutoPlay="True" Grid.ColumnSpan="3" HorizontalAlignment="Left" Height="204" Margin="38,44,0,0" VerticalAlignment="Top" Width="212"/>
我试图遵循3种策略:

  • 使用适当的c#代码记录

  • 从我的uwp应用程序启动vlc.exe或ffmpeg.exe(桌面应用程序)

  • 使用VLC.MediaElement进行记录

  • 为了正确管理计算机的资源,我宁愿选择第一个或第二个选项,但如果它能工作,就没有问题,只需自定义缓冲区


    提前感谢,记住这是一个ip摄像头,不是网络摄像头,我不能使用captureElement

    您能提供一些关于当前如何获取相机流的代码片段吗?如果您还可以提供一些使用VLC.MediaElement进行预览的代码,这会更好。使用我编写的代码进行编辑。我测试了您的代码,它可以成功地将视频下载到本地文件夹。上面的代码片段遇到了什么问题?能否播放它创建的视频文件?。我不能。另一件事是如何停止录音,有什么想法吗?。它面向录制长视频。使用这些策略是否正确?。谢谢你的帮助!
      public async void StartRecording()
        {
            Windows.Storage.StorageFolder storageFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
    
            Debug.WriteLine(storageFolder.Path);   
    
            Windows.Storage.StorageFile sampleFileVid =
    await storageFolder.CreateFileAsync(DateTime.Now.ToString("yyyyMMdd") + "File.avi",
    Windows.Storage.CreationCollisionOption.OpenIfExists)
    
    
    
    VLCPreview.Source = "http://Admin:123456@192.168.0.21:6021/cgi-bin/cmd/encoder?GET_STREAM";
    
    
    
    
            try
            {
                                HttpClientHandler aHandler = new HttpClientHandler();
                                aHandler.Credentials = new NetworkCredential("Admin", "123456");
                                aHandler.ClientCertificateOptions = ClientCertificateOption.Automatic;
    
                                HttpClient aClient = new HttpClient(aHandler);
                                aClient.DefaultRequestHeaders.ExpectContinue = false;
    
                                HttpResponseMessage response = await aClient.GetAsync("http://192.168.0.21:6021/cgi-bin/cmd/encoder?GET_STREAM", HttpCompletionOption.ResponseHeadersRead);//urlLinkToOnlineStream
    
    
                                var destinationFile = sampleFileVid;
                                var fileStream = await destinationFile.OpenAsync(FileAccessMode.ReadWrite);
    
                                Stream stream = await response.Content.ReadAsStreamAsync();
                                 IInputStream inputStream = stream.AsInputStream();
                                 ulong totalBytesRead = 0;
                                 while (true)
                                 {
                                     // Read from the web.
                                     IBuffer buffer = new Windows.Storage.Streams.Buffer(1024);
                                     buffer = await inputStream.ReadAsync(buffer, buffer.Capacity, InputStreamOptions.None);
                                     if (buffer.Length == 0)
                                     {
                                         break;
                                     }
                                     totalBytesRead += buffer.Length;
                                     await fileStream.WriteAsync(buffer);
                                    Debug.WriteLine("TotalBytesRead: {0:f}", totalBytesRead);
                                }
    
                                inputStream.Dispose();
    
                                fileStream.Dispose();  
    
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Excepción de vídeo en StartRecording: ", ex);
            }
        }