【问题标题】:UWP run ffmpeg process to captureUWP运行ffmpeg进程捕获
【发布时间】:2018-07-26 15:28:44
【问题描述】:

我正在使用 C# 开发 UWP 应用,我需要在进程中启动 FFmpeg。

我使用这个在 CMD 中运行良好的 ffmpeg 命令:

D:\ffmpeg.exe -f dshow -crossbar_video_input_pin_number 1 -i video="AVerMedia BDA 模拟捕捉" -vcodec rawvideo -pix_fmt yuv420p -s 864x768 -r 10 "D:\capture\output.yuv" -loglevel 16

但是当我在我的 UWP 应用程序中使用相同的命令和参数启动进程时,我从 ffmpeg 收到此错误:

[dshow @ 000001bd43907e80] 无法为 AVerMedia BDA 绑定对象 模拟捕获 [dshow @ 000001bd43907e80] 找不到视频设备 类型为 [AVerMedia BDA Analog Capture] 的源设备 视频。 video=AVerMedia BDA 模拟捕获:I/O 错误

这是我的代码:

        string filename = @"D:\ffmpeg.exe";
        string arg = " -f dshow -crossbar_video_input_pin_number [VIDEOPIN] -i video=\"AVerMedia BDA Analog Capture\" -vcodec rawvideo -pix_fmt [PIXELCONF] -s [SIZE] -r [FPS] \"[FOLDER]\\[VIDEONAME]\" -loglevel 16";
        arg = path.Text;
        if (!File.Exists(filename))
            System.Diagnostics.Debug.WriteLine("Not exist ffmpeg");



        arg = arg.Replace("[VIDEOPIN]", "1");
        arg = arg.Replace("[VIDEODEVICE]", "AVerMedia BDA Analog Capture");
        arg = arg.Replace("[PIXELCONF]", "yuv420p");
        arg = arg.Replace("[SIZE]", "864x768");
        arg = arg.Replace("[FPS]", "10");
        arg = arg.Replace("[FOLDER]", "D:\\capture");
        arg = arg.Replace("[VIDEONAME]", "output.yuv");

        ProcessStartInfo pi = new ProcessStartInfo(filename, arg);
        System.Diagnostics.Debug.WriteLine(pi.FileName + " " + pi.Arguments.ToString());
        pi.RedirectStandardInput = true;
        pi.RedirectStandardOutput = true;
        pi.RedirectStandardError = true;
        pi.UseShellExecute = false;

        pi.CreateNoWindow = true;
        process = new Process();
        process.StartInfo = pi;
        process.EnableRaisingEvents = true;
        process.OutputDataReceived += new DataReceivedEventHandler(MyProcOutputHandler);
        process.ErrorDataReceived += new DataReceivedEventHandler(MyProcErrorHandler);
        process.Exited += new EventHandler(ExitedProcess);



        process.Start();
        process.BeginErrorReadLine();
        process.BeginOutputReadLine();

编辑:这就是我所拥有的:

ffmpeg -list_devices true -f dshow -i dummy

ffmpeg 版本 N-90054-g474194a8d0 版权所有 (c) 2000-2018 FFmpeg 使用 gcc 7.2.0 (GCC) 配置构建的开发人员:--enable-gpl --enable-version3 --enable-sdl2 --enable-bzlib --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame - -enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp - -enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libmfx --enable-amf --enable-cuda --enable- cuvid --enable-d3d11va --enable-nvenc --enable-dxva2 --enable-avisynth libavutil 56. 7.101 / 56. 7.101 libavcodec 58. 11.101 / 58. 11.101 libavformat 58. 9.100 / 58. 9.100 libavdevice 58. 1.100 / 58. 1.100 libavfilter 7. 12.100 / 7. 12.100 libswscale 5. 0.101 / 5. 0.101 libswresample 3. 0.101 / 3. 0.101 libpo stproc 55. 0.100 / 55. 0.100 [dshow @ 0000029065b07940] DirectShow 视频设备(有些可能同时是视频和音频设备)[dshow @ 0000029065b07940] “AVerMedia BDA 模拟捕获” [dshow @ 0000029065b07940] 替代 姓名 "@device_pnp_\?\pci#ven_1a0a&dev_6202&subsys_620f1461&rev_01#4&3632f028&0&00e6#{65e8773d-8f56-11d0-a3b9-00a0c9223196}{ca465100-deb0-4d19-818f-8f7474 [dshow @ 0000029065b07940] “AVerMedia BDA 模拟捕获辅助” [dshow @ 0000029065b07940] 备用名称 “@device_pnp_\?\pci#ven_1a0a&dev_6202&subsys_620f1461&rev_01#4&3632f028&0&00e6#{65e8773d-8f56-11d0-a3b9-00a0c9223196}{ede957b0-eaa5-4bf4-acf3-6e10c}”b436 [dshow @ 0000029065b07940] DirectShow 音频设备 [dshow @ 0000029065b07940] 无法枚举仅音频设备(或无 成立)。 dummy:请求立即退出

【问题讨论】:

  • 您是否在同一用户下运行您的应用程序?
  • 尝试在应用内运行ffmpeg -list_devices true -f dshow -i dummy 以查看可用的设备
  • 是的,我正在使用同一个用户(或者我猜)运行我的应用程序。命令行: ffmpeg -list_devices true -f dshow -i dummy 显示设备列表并显示我的设备。
  • 如果我尝试这个简单的行:ffmpeg -i input.mp4 output.avi。 ffmpeg表示权限被拒绝(甚至文件input.mp4存在)。
  • 从 UWP 应用程序内部运行时,您能否发布 ffmpeg -list_devices true -f dshow -i dummy 的输出?

标签: video ffmpeg uwp device


【解决方案1】:

UWP 应用在沙盒中运行。该 exe 需要在您的应用程序包中,如果您希望它在具有从操作系统读取 directshow 信息的权限下运行,您需要使用 FullTrustProcessLauncher 启动它。我认为您无法使用它来捕获输出文本,但您可以在包的 TemporaryFolder 中有 ffmpeg save the output to a text file 然后阅读它。

此外,如果您想在 UWP 应用中仅将 ffmpeg 用于 A/V 播放或帧捕捉,您应该查看此project

【讨论】:

  • 我现在明白问题所在,我想使用 FullTrustProcessLauncher 但我对 package.manifest 中的声明有一些问题。 显示错误。
  • 它不在 D:\ 中,对吧?您已将其移至您的项目,并设置为内容并复制(如果更新)?
猜你喜欢
  • 1970-01-01
  • 2018-10-29
  • 2013-09-18
  • 1970-01-01
  • 2010-11-14
  • 2013-07-11
  • 1970-01-01
  • 2019-11-09
  • 2010-11-09
相关资源
最近更新 更多