Mlt Framework - 32 位 Windows 构建不起作用
Mlt Framework - 32 bit Windows build is not functional
我正在评估使用 MLT 框架来处理和连接一些视频。我需要将它与 32 位 C# 应用程序集成,并基于 C# 数据结构对数据应用一些动态的自定义覆盖,所以我计划构建 C API 并通过 P/Invoke.
我已经成功地使用 SDL、libavcodec 和 dlfcn-win32 构建了库的简约配置,禁用了所有其他模块,遵循 https://www.mltframework.org/docs/windowsbuild/。
但是,当使用 C API 或 C++ API 时,我的 32 位构建无法正常工作。使用 SDL 时出现段错误、创建虚拟输出视频或挂起。创建的melt.exe和示例项目play.cpp也有同样的问题。
现在这让我觉得 32 位构建可能存在问题,所以我也尝试了 64 位构建,结果相似。
之后,我尝试了以下配置和编译器:
- Windows7、MSYS2、GCC 7.1.0 32位和64位
- Windows7、MinGW(Qt安装器)5.3.0 32位
- Ubuntu 14.04交叉编译如下https://www.shotcut.org/notes/cross-compile/
- Windows7、Shotcut预建SDKhttps://www.shotcut.org/notes/windowsdev/
最后一个不起作用的事实令人惊讶,这让我觉得 一定 我的环境或我正在做的事情有问题。我严格按照这些说明进行操作。此外,内置的 Shotcut.exe 在启动时崩溃。
在所有这些情况下,构建都成功了,但构建的二进制文件没有按预期工作。
有没有人让 MLT 的 C API 在 Windows 32 位上正确地进行视频编码?
这是我的小测试项目,改编自 https://www.mltframework.org/docs/framework/。
(我已编辑此代码示例以反映 Sergey 的回答中的一些问题,但最终结果没有变化)。
#include <windows.h>
#include <stdio.h>
#include "include/mlt/framework/mlt.h"
int main()
{
mlt_repository repo = mlt_factory_init(NULL);
fprintf(stderr, "start\n");
if (repo != NULL)
{
mlt_consumer consumer = mlt_factory_consumer(NULL, "sdl", NULL);
fprintf(stderr, "Creating consumer %p\n", consumer);
if (consumer == NULL)
{
fprintf(stderr, "Consumer NULL. Aborting");
return 1;
}
mlt_producer producer = mlt_factory_producer(NULL, "color", "red");
fprintf(stderr, "Creating producer %p\n", producer);
if (producer == NULL)
{
fprintf(stderr, "Producer NULL. Aborting");
return 1;
}
fprintf(stderr, "Connecting %p to %p\n", producer, consumer);
mlt_consumer_connect(consumer, mlt_producer_service(producer));
fprintf(stderr, "Starting consumer %p\n", consumer);
mlt_consumer_start(consumer);
fprintf(stderr, "Wait for consumer\n");
while (!mlt_consumer_is_stopped(consumer))
{
Sleep(1000);
fprintf(stderr, "Wait more for consumer...\n");
}
fprintf(stderr, "Close consumer\n");
// Close the consumer
mlt_consumer_close(consumer);
fprintf(stderr, "Close producer\n");
// Close the producer
mlt_producer_close(producer);
fprintf(stderr, "Close factory\n");
// Close the factory
mlt_factory_close();
}
else
{
// Report an error during initialisation
fprintf(stderr, "Unable to locate factory modules\n");
}
return 0;
}
来自 MLT 文档:
mlt_consumer mlt_factory_consumer (mlt_profile, const char *, const void *)
Fetch a consumer from the repository
您没有检查 mlt_factory_consumer
返回的值,它是 NULL
。
mlt_consumer hello = mlt_factory_consumer(NULL, "color", "red");
printf("Created consumer %p\n", hello);
mlt_producer world = mlt_factory_producer(NULL, NULL, NULL);
printf("Created producer %p\n", world);
mlt_service service = mlt_producer_service (world);
printf("Created service %p\n", service);
> gcc test.c -lmlt -g && ./a.out
Created consumer (nil)
Created producer (nil)
Created service (nil)
Segmentation fault (core dumped)
而当给定默认参数时,它 returns 一个有效的指针:
mlt_consumer hello = mlt_factory_consumer(NULL, NULL, NULL);
printf("Created consumer %p\n", hello);
printf("Loop over parent %p\n", hello -> parent . child);
. . .
> gcc test.c -lmlt -g && ./a.out
Created consumer 0x561978461cf0
Loop over parent 0x561978461cf0
Created producer (nil)
Created service (nil)
Connected 0
Starting consumer 0
Wait for consumer
Wait more for consumer...
Wait more for consumer...
CTRL-C
Close consumer
Close producer
Close factory
根据您提供的link:
The default consumer is sdl
. Also note, you can override the defaults as follows:
MLT_CONSUMER=xml ./hello file.avi
will create a XML document on stdout.
MLT_CONSUMER=xml MLT_PRODUCER=avformat ./hello file.avi
will play the video using the avformat producer directly, thus it
will bypass the normalising functions.
MLT_CONSUMER=libdv ./hello file.avi > /dev/dv1394
might, if you’re lucky, do on the fly, realtime conversions of file.avi to DV and broadcast it to your DV device.
很明显,您必须向 mlt_factory_consumer
提供有效参数或 NULL
(如果您愿意,可以覆盖默认消费者):
mlt_consumer hello = mlt_factory_consumer(NULL, "xml", NULL);
printf("Created consumer %p\n", hello);
. . .
> gcc test.c -lmlt -g && ./a.out
Created consumer 0x55ab3ceb7660
Loop over parent 0x55ab3ceb7660
Created producer (nil)
Created service (nil)
Connected 0
Starting consumer 0
Wait for consumer
Close consumer
Close producer
Close factory
我已经解决了这个问题。有一个错误,在 Windows 上,当传入 none 时,不会创建默认 mlt_profile。
因此显式创建一个并将其传递给工厂调用:
mlt_profile profile = mlt_profile_init(NULL);
这解决了我在 Windows 上使用 C API 的问题。
不,出于某种原因,SDL 仍然无法正常工作。不过没那么重要。
我正在评估使用 MLT 框架来处理和连接一些视频。我需要将它与 32 位 C# 应用程序集成,并基于 C# 数据结构对数据应用一些动态的自定义覆盖,所以我计划构建 C API 并通过 P/Invoke.
我已经成功地使用 SDL、libavcodec 和 dlfcn-win32 构建了库的简约配置,禁用了所有其他模块,遵循 https://www.mltframework.org/docs/windowsbuild/。 但是,当使用 C API 或 C++ API 时,我的 32 位构建无法正常工作。使用 SDL 时出现段错误、创建虚拟输出视频或挂起。创建的melt.exe和示例项目play.cpp也有同样的问题。
现在这让我觉得 32 位构建可能存在问题,所以我也尝试了 64 位构建,结果相似。 之后,我尝试了以下配置和编译器:
- Windows7、MSYS2、GCC 7.1.0 32位和64位
- Windows7、MinGW(Qt安装器)5.3.0 32位
- Ubuntu 14.04交叉编译如下https://www.shotcut.org/notes/cross-compile/
- Windows7、Shotcut预建SDKhttps://www.shotcut.org/notes/windowsdev/
最后一个不起作用的事实令人惊讶,这让我觉得 一定 我的环境或我正在做的事情有问题。我严格按照这些说明进行操作。此外,内置的 Shotcut.exe 在启动时崩溃。 在所有这些情况下,构建都成功了,但构建的二进制文件没有按预期工作。
有没有人让 MLT 的 C API 在 Windows 32 位上正确地进行视频编码?
这是我的小测试项目,改编自 https://www.mltframework.org/docs/framework/。
(我已编辑此代码示例以反映 Sergey 的回答中的一些问题,但最终结果没有变化)。
#include <windows.h>
#include <stdio.h>
#include "include/mlt/framework/mlt.h"
int main()
{
mlt_repository repo = mlt_factory_init(NULL);
fprintf(stderr, "start\n");
if (repo != NULL)
{
mlt_consumer consumer = mlt_factory_consumer(NULL, "sdl", NULL);
fprintf(stderr, "Creating consumer %p\n", consumer);
if (consumer == NULL)
{
fprintf(stderr, "Consumer NULL. Aborting");
return 1;
}
mlt_producer producer = mlt_factory_producer(NULL, "color", "red");
fprintf(stderr, "Creating producer %p\n", producer);
if (producer == NULL)
{
fprintf(stderr, "Producer NULL. Aborting");
return 1;
}
fprintf(stderr, "Connecting %p to %p\n", producer, consumer);
mlt_consumer_connect(consumer, mlt_producer_service(producer));
fprintf(stderr, "Starting consumer %p\n", consumer);
mlt_consumer_start(consumer);
fprintf(stderr, "Wait for consumer\n");
while (!mlt_consumer_is_stopped(consumer))
{
Sleep(1000);
fprintf(stderr, "Wait more for consumer...\n");
}
fprintf(stderr, "Close consumer\n");
// Close the consumer
mlt_consumer_close(consumer);
fprintf(stderr, "Close producer\n");
// Close the producer
mlt_producer_close(producer);
fprintf(stderr, "Close factory\n");
// Close the factory
mlt_factory_close();
}
else
{
// Report an error during initialisation
fprintf(stderr, "Unable to locate factory modules\n");
}
return 0;
}
来自 MLT 文档:
mlt_consumer mlt_factory_consumer (mlt_profile, const char *, const void *)
Fetch a consumer from the repository
您没有检查 mlt_factory_consumer
返回的值,它是 NULL
。
mlt_consumer hello = mlt_factory_consumer(NULL, "color", "red");
printf("Created consumer %p\n", hello);
mlt_producer world = mlt_factory_producer(NULL, NULL, NULL);
printf("Created producer %p\n", world);
mlt_service service = mlt_producer_service (world);
printf("Created service %p\n", service);
> gcc test.c -lmlt -g && ./a.out
Created consumer (nil)
Created producer (nil)
Created service (nil)
Segmentation fault (core dumped)
而当给定默认参数时,它 returns 一个有效的指针:
mlt_consumer hello = mlt_factory_consumer(NULL, NULL, NULL);
printf("Created consumer %p\n", hello);
printf("Loop over parent %p\n", hello -> parent . child);
. . .
> gcc test.c -lmlt -g && ./a.out
Created consumer 0x561978461cf0
Loop over parent 0x561978461cf0
Created producer (nil)
Created service (nil)
Connected 0
Starting consumer 0
Wait for consumer
Wait more for consumer...
Wait more for consumer...
CTRL-C
Close consumer
Close producer
Close factory
根据您提供的link:
The default consumer is
sdl
. Also note, you can override the defaults as follows:
MLT_CONSUMER=xml ./hello file.avi
will create a XML document on stdout.
MLT_CONSUMER=xml MLT_PRODUCER=avformat ./hello file.avi
will play the video using the avformat producer directly, thus it will bypass the normalising functions.
MLT_CONSUMER=libdv ./hello file.avi > /dev/dv1394
might, if you’re lucky, do on the fly, realtime conversions of file.avi to DV and broadcast it to your DV device.
很明显,您必须向 mlt_factory_consumer
提供有效参数或 NULL
(如果您愿意,可以覆盖默认消费者):
mlt_consumer hello = mlt_factory_consumer(NULL, "xml", NULL);
printf("Created consumer %p\n", hello);
. . .
> gcc test.c -lmlt -g && ./a.out
Created consumer 0x55ab3ceb7660
Loop over parent 0x55ab3ceb7660
Created producer (nil)
Created service (nil)
Connected 0
Starting consumer 0
Wait for consumer
Close consumer
Close producer
Close factory
我已经解决了这个问题。有一个错误,在 Windows 上,当传入 none 时,不会创建默认 mlt_profile。
因此显式创建一个并将其传递给工厂调用:
mlt_profile profile = mlt_profile_init(NULL);
这解决了我在 Windows 上使用 C API 的问题。 不,出于某种原因,SDL 仍然无法正常工作。不过没那么重要。