0

我正在评估使用 MLT 框架来处理和连接一些视频。我需要将它与 32 位 C# 应用程序集成,并基于 C# 数据结构对数据应用一些动态的自定义覆盖,因此我计划构建 C API 并通过 P/Invoke 在 C# 中使用它。

在https://www.mltframework.org/docs/windowsbuild/之后,我设法使用 SDL、libavcodec 和 dlfcn-win32 构建了库的简约配置,所有其他模块都被禁用。但是,当使用 C API 或 C++ API 时,我的 32 位版本无法正常工作。使用 SDL 时出现段错误、创建的虚拟输出视频或挂起。创建的 melt.exe 和示例项目 play.cpp 也有同样的问题。

现在这让我觉得 32 位构建可能存在问题,所以我也尝试了 64 位构建,结果相似。之后,我尝试了以下配置和编译器:

最后一个不起作用的事实令人惊讶,让我认为我的环境或我正在做的事情一定有问题。我完全按照这些指示进行操作。此外,内置的 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;
}
4

2 回答 2

0

我已经解决了这个问题。有一个错误,在 Windows 上,当没有传入默认 mlt_profile 时,不会创建它。

因此,显式创建一个并将其传递给工厂调用:

mlt_profile profile = mlt_profile_init(NULL);

这解决了我在 Windows 上使用 C API 的问题。不,由于某种原因,SDL 仍然无法正常工作。但这并不重要。

于 2017-07-28T08:22:36.483 回答
0

来自 MLT 文档:

mlt_consumer mlt_factory_consumer (mlt_profile, const char *, const void *)
从存储库中获取消费者

您没有检查返回的值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)

而当给定默认参数时,它返回一个有效的指针:

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

截屏

从您提供的链接:

默认消费者是sdl. 另请注意,您可以按如下方式覆盖默认值:

MLT_CONSUMER=xml ./hello file.avi将在标准输出上创建一个 XML 文档。

MLT_CONSUMER=xml MLT_PRODUCER=avformat ./hello file.avi将直接使用 avformat 生产者播放视频,因此它将绕过规范化功能。

MLT_CONSUMER=libdv ./hello file.avi > /dev/dv1394如果幸运的话,可能会即时将 file.avi 实时转换为 DV 并将其广播到您的 DV 设备。

很明显,您必须提供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
于 2017-07-21T17:17:29.850 回答