2014-01-10 144 views
2

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的抛出: “错误配置过滤”;

+0

究竟是什么错误和例外? – LordNeckbeard

+0

Kaushik我正在研究如此相同的事情,你问,有进展,这将是非常有帮助 – Charlie

回答

1

不知道FFmpeg C API如何转换为C#,但在FmMpeg中添加视频流不会让您在现有视频流的末尾添加更多帧。它会创建一个新的视频流,从而生成包含多个视频流的视频文件。这不是你想要的,也不是所有的muxers都支持混合两个视频流,这可能是你得到错误的原因。

你需要的是可以实现的下列方式之一:

  1. 解码的原始视频,并重新编码它。在重新编码过程中,您可以以任何方式轻松修改视频,并在任何需要的位置添加图像。这是最容易实现的,但如果您编码为有损格式,则会由于双重编码而失去视频质量。

  2. 找出用于对原始视频进行编码的精确参数(分辨率,纵横比,色彩空间,帧速率,编解码器,编解码器参数等),然后使用完全相同的编解码器对相同的选项进行编码。然后,您可以通过读取/写入帧(不重新编码)复制视频流,并将新编码的帧附加到此视频。这将避免对原始视频进行重新编码,但实施起来更加棘手并且容易出错,尤其是如果原始视频不是由FFmpeg编码的,而是由不同的编码器编码的。

+0

你的第二个建议为我工作,我刚刚从一个视频读取下一个数据包,并立即写入一个新的视频,并在最后我只是像往常一样编码所需的额外帧。 我不认为有一种方法可以用单个视频文件来做到这一点(是吗?),所以我不得不使用视频作为源,并将所有内容写入新的视频文件。谢谢! – Maxito

+0

再次指出这只适用于我的情况下的RAW视频格式。 – Maxito

0

有两种方式:

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

这是非常通用的,不太可能在这个特定情况下有所帮助。 – codeling