【问题标题】:Video editing in UWP appsUWP 应用中的视频编辑
【发布时间】:2021-11-16 09:20:39
【问题描述】:

我正在使用 C# 和通用 Windows 平台创建视频下载应用程序。应用根据来源下载三种不同文件集中的电影:

  • .ts音视频文件
  • .mp4 仅视频文件和 .webm 仅音频文件
  • .mp4 音视频文件 我测试应用程序的视频长度从几秒到几个小时不等。视频质量是标准的 YouTube 质量。

下一步是视频编辑。用户可以指定开始和结束修剪时间戳。视频可以以三种不同的模式保存:

  • 音频和视频
  • 只有音频
  • 仅视频

这就是问题的开始。

我不能使用 FFmpeg 作为可执行文件,因为 UWP 框架不允许运行外部应用程序。

所以我尝试使用 Windows.Media.Editing 库。它适用于所有 .mp4 音频和视频文件以及一些 .ts 文件(但仅适用于长达一小时的短视频)。其他情况会抛出两种类型的异常:

  • 系统异常 HResult=0xC00DA7FC Message=Stream 未处于处理请求的状态。 Stream 未处于处理请求的状态。 Source=System.Private.CoreLib
  • 系统异常 H结果=0xC00D6D60 Message=尚未为此流或其依赖的流设置有效类型。 (HRESULT 异常:0xC00D6D60) Source=System.Private.CoreLib

我为此写了一个单独的问题:Exception when rendering a video in UWP。这里还有一个示例链接(在带有示例视频的 cmets 中,这会导致错误。链接到 github 存储库。)下载并尝试将 .ts 文件转换为 .mp4 文件。

所以我决定尝试最复杂的解决方案。我创建了一个 C++ DLL 项目并将构建输出目标设置为主应用程序项目文件夹中的新文件夹(并将此文件夹设置为复制到构建输出目录)。我通过 vcpkg 安装了一个 ffmpeg 库并将它们导入到 C++ 项目中。 这是 .cpp 文件:

#include "pch.h"
#include "mux.h"

extern "C" {
    #include "libavformat/avformat.h"
}

int test() {
    av_register_all();
    return 0;
}

这是标题:

#pragma once

#ifdef FFMPEGLIB_EXPORTS
#define FFMPEGLIB_API __declspec(dllexport)
#else
#define FFMPEGLIB_API __declspec(dllimport)
#endif

extern "C" FFMPEGLIB_API int test();

这里是导入 C++ 函数的 C# 类:

class FFmpeg
{
    [DllImport(@"FFmpeg\FFmpegLib.dll")] private static extern int test();

    public static void Test()
    {
        test();
    }
}

但是调用 Test() void 会引发错误: System.DllNotFoundException:'无法加载 DLL'FFmpeg\FFmpegLib.dll' 或其依赖项之一:找不到指定的模块。 (来自 HRESULT 的异常:0x8007007E)'

FFmpeg 文件夹中还有 ffmpeg 库(avcodec-58.dll、avformat-58.dll、avutil-56.dll、swresample-3.dll)。 我还尝试在 C#(主应用程序项目)中直接导入 avformat-58.dll 并调用 av_register_all() 函数,但它会引发相同的异常。我还检查了是否可以在 C++ UWP 应用程序中包含“libavformat/avformat.h”,但它显示错误“无法打开源文件“libavformat/avformat.h””。我猜C库与UWP不兼容,但我不确定。

我没有更多的想法。如果无法使用我提到的方法,我的问题是UWP应用中还有其他方法可以处理视频吗?

【问题讨论】:

标签: c# c++ video ffmpeg uwp


【解决方案1】:

我知道从错误消息中很明显,但您需要验证您的程序是否能够找到指定的 DLL 文件。

在运行时使用 System.IO.Directory.GetCurrentDirectory() 检查工作目录。 FFmpeg\FFmpegLib.dll 真的存在吗?

为简单起见,我建议不要使用子目录来保存 DLL 并将它们放在 UWP 应用的根目录中。

这里有一个问答,它解释了如何将 DLL 包含到您的应用中:https://social.msdn.microsoft.com/Forums/en-US/26013e5e-3ff1-44a0-8797-0474dabd12d0/uwpincluding-dlls-in-a-uwp-application-in-visual-studio?forum=wpdevelop 可以概括为:将DLL文件添加到项目根目录,作为内容文件包含到项目中。这对于分发您的应用程序时很重要。

DLL 也可以依赖于其他 DLL,如果不满足任何依赖关系,则会给出通用错误消息。您可以使用依赖项工具 [https://github.com/lucasg/Dependencies] 来检查 FFmpegLib.dll 是否存在未满足的依赖项。

【讨论】:

    猜你喜欢
    • 2011-11-16
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-09
    • 2020-01-21
    相关资源
    最近更新 更多