将图像添加到视频的末尾

时间:2014-01-10 21:43:26

标签: c# image video ffmpeg video-processing

common_video.avi image1.jpg image2.jpg

我想在c#中以编程方式将这两个图像插入到视频名称common_video.avi的末尾,以便在视频结束后图像显示5秒钟,实现它的最佳方法是什么?我已经查看了ffmpeg,有和没有c#包装器,但仍然无效。我一直在收到错误和异常。

这是我试过的一段代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
//using AForge;
//using AForge.Video.VFW;
using AForge.Video.FFMPEG;
using AviFile;
using System.Drawing;

namespace Ffmpeg
{
    class Program
    {
        static void Main(string[] args)
        {






            var Strings = new string[] { "1.jpg", "2.jpg", "3.jpg" };

            //VideoFileWriter W = new VideoFileWriter();
            //W.Open("../../Out/new.avi", 1920, 1200, 1, VideoCodec.Raw, 4400);
            //foreach (var S in Strings)
            //{
            //    for (int I = 2 * 25; I > 0; I--)
            //        W.WriteVideoFrame((Bitmap)Image.FromFile(S));
            //}
            //W.Close();



            //load the first image
            Bitmap bitmap = (Bitmap)Image.FromFile(Strings[0]);
            //create a new AVI file
            AviManager aviManager =
                new AviManager(@"..\..\out\new.avi", false);
            //add a new video stream and one frame to the new file
            VideoStream aviStream =
                aviManager.AddVideoStream(false, 1, bitmap);

            //Bitmap bitmap;
            for (int n = 1; n < Strings.Length; n++)
            {
                if (Strings[n].Trim().Length > 0)
                {
                    bitmap =
                       (Bitmap)Bitmap.FromFile(Strings[n]);
                    //for (int I = 2 * 25; I > 0; I--)
                        aviStream.AddFrame(bitmap);
                    bitmap.Dispose();
                }
            }
            aviManager.Close();
        }
    }
}

Ffmpeg抛出:“错误配置过滤器”;

2 个答案:

答案 0 :(得分:1)

不确定FFmpeg C API如何转换为C#,但在FmMpeg中添加视频流不允许您在现有视频流的末尾添加更多帧。它会创建一个新的视频流,从而生成包含多个视频流的视频文件。不仅这不是你想要的,而且并非所有的复用器都支持复用两个视频流,这可能是你收到错误的原因。

您需要的是以下方式之一:

  1. 解码原始视频,然后重新编码。在重新编码期间,您可以轻松地以任何方式修改视频,并在任何地方添加图像。这是最容易实现的,但如果您编码为有损格式,则会因双重重新编码而丢失视频质量。

  2. 找出用于编码原始视频的确切参数(分辨率,宽高比,色彩空间,帧速率,编解码器,编解码器参数等),然后使用完全相同的编解码器使用相同的选项对图像进行编码。然后,您可以通过读/写帧(无重新编码)复制视频流,并将新编码的帧附加到此视频。这将避免重新编码原始视频,但实现起来要复杂得多,容易出错,特别是如果原始视频不是由FFmpeg编码而是编码不同的编码器。

答案 1 :(得分:0)

有两种方法:

  1. 如果您不关心性能,可以逐个读取帧,然后将每个帧解码为原始格式(yuv420),并将帧再次编码为您想要的任何编解码器。对于你的图片,只需转换为yuv420,然后编码到文件中。
  2. 如果您只想将图片编码为avi文件:您需要知道视频流是avi文件中的编解码器,然后通过此编解码器对图片进行编码,并且第一张图片必须是关键帧。还有一个问题,你的编解码器参数可能与原始视频流不兼容,会有困难。您必须解析视频流,并找到参数详细信息。