2014-01-10 143 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