【问题标题】:How can I create a video from a directory of images in C如何从 C 中的图像目录创建视频
【发布时间】:2012-11-27 14:49:06
【问题描述】:

如何使用 c 语言从包含一组图像的目录创建视频。我想在 c 类文件中执行此操作(而不是在命令提示符中)。类似的东西。

void ImagetoVideo(char [] path)
{
   // create video from file
}

我在堆栈溢出中看到了一些代码,但这都是关于运行命令行代码的。 这是代码

ffmpeg -f image2 -start_number n -i "PATH_TO_IMAGE_FILE" video.mpg 
    -vcodec mpeg4 test.avi

【问题讨论】:

  • 恐怕没那么简单。 FFMpeg 是一个巨大的通用媒体转码器工具,写起来又难又长(我可以说“不是简单地在 24 LOC 中实现ImageToVideo()”吗?)...
  • 您可以从您的程序中调用该命令行,那么您为什么想要/需要这样做呢?
  • @wetson 如何在我的程序中调用该命令行?这就是我想知道的。

标签: c ffmpeg java-native-interface jnienv


【解决方案1】:

你可以自己写代码,不会太难。

对于 AVI 编码,您可以使用Revel。对于 JPG 图像处理,您可以使用libJPEG。如果您有其他格式的图像,您可以使用适当的库来阅读它们。

读取每个图像并对其进行编码的完整代码会有点长。所以,我用伪代码向你展示这个想法。我在有类似任务时使用相同的方式。

   #include "revel.h"
    extern "C" {
     #include "libjpeg/jpeglib.h"
    }

    std::vector<BYTE> frame_buffer;

    Revel_Error revError;
    int encoderHandle;
    revError = Revel_CreateEncoder(&encoderHandle);
    Revel_Params revParams;
    Revel_InitializeParams(&revParams);

    revParams.width = ; // put image width here
    revParams.height = ; // put image height here
//
    revParams.frameRate = 25;
    revParams.quality = 1.0f;
    revParams.codec = REVEL_CD_XVID;
    revParams.hasAudio = 0;
    revParams.audioSampleFormat = REVEL_ASF_UNKNOWN;
    char favi[] = "encoded_video.avi";
    revError = Revel_EncodeStart(encoderHandle, favi, &revParams);

while(read & decode every image into 'frame_buffer' with apropriate lib)
{
    Revel_VideoFrame frame;
    frame.width = image.getwidth();
    frame.height = image.getheight();
    frame.bytesPerPixel = ; // color depth in bytes. if you're using libjpeg it would be cinfo.num_components;
    frame.pixelFormat = REVEL_PF_BGR;
    frame.pixels = &frame_buffer[0];
    int frameSize;
    revError = Revel_EncodeFrame(encoderHandle, &frame, &frameSize);
}

    int totalSize;
    revError = Revel_EncodeEnd(encoderHandle, &totalSize);
    Revel_DestroyEncoder(encoderHandle);

【讨论】:

    【解决方案2】:

    您可以使用以下命令在您的 C++(或 C)代码中运行此命令: 系统(...);

    这里有更多信息:system(..)

    【讨论】:

    • exec() 可能更合适
    猜你喜欢
    • 2010-09-20
    • 2017-07-09
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多