【发布时间】: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应用中还有其他方法可以处理视频吗?
【问题讨论】: