gpt4 book ai didi

c# - UWP 应用中的视频编辑

转载 作者:行者123 更新时间:2023-12-04 23:19:36 27 4
gpt4 key购买 nike

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

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

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

  • 这就是问题的开始。
    我不能使用 FFmpeg 作为可执行文件,因为 UWP 框架不允许运行外部应用程序。
    所以我尝试使用 Windows.Media.Editing 库。它适用于所有 .mp4 音频和视频文件以及一些 .ts 文件(但仅适用于长达一小时的短视频)。其他情况会引发两种类型的异常:
  • 系统异常
    HResult=0xC00DA7FC
    Message=Stream 未处于处理请求的状态。 Stream 未处于处理请求的状态。
    来源=System.Private.CoreLib
  • 系统异常
    H结果=0xC00D6D60
    Message=尚未为此流或其依赖的流设置有效类型。 (HRESULT 异常:0xC00D6D60)
    来源=System.Private.CoreLib

  • 我写了一个单独的问题: Exception when rendering a video in UWP .这也是一个示例的链接(在带有示例视频的评论中,这会导致错误。链接到 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 应用程序中处理视频还有其他方法吗?

    最佳答案

    我知道从错误消息中很明显,但您需要验证您的程序是否能够找到指定的 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,如果不满足任何依赖关系,则会给出通用错误消息。您可以使用 Dependencies 工具 [https://github.com/lucasg/Dependencies] 检查 FFmpegLib.dll 是否存在未满足的依赖项。

    关于c# - UWP 应用中的视频编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69292163/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com