Добавление изображений в конец видео


Common_video.Ави образ 1.формат jpg image2.jpg

Я хочу вставить эти два изображения в конец названия видео common_video.avi программно в c# так, чтобы изображение показывалось в течение примерно 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(@"....outnew.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 2

2 ответа:

Не знаю, как ffmpeg C API преобразуется в C#, но добавление видеопотока в FmMpeg не позволяет добавлять дополнительные кадры в конце существующего видеопотока. Он создает новый видеопоток, таким образом генерируя видеофайл с несколькими видеопотоками. Мало того, что это не то, что вы хотите, но и не все muxers поддерживают muxing двух видеопотоков, которые могут быть причиной получения ошибки.

То, что вам нужно, может быть достигнуто одним из следующих способов:

  1. Расшифровать оригинальное видео, и перекодировать его. Во время повторного кодирования вы можете легко изменить видео любым способом и добавить изображения в любом месте. Это проще всего реализовать, но вы потеряете качество видео из-за двойного повторного кодирования, если будете кодировать в формат с потерями.

  2. Узнайте точные параметры, которые были использованы для кодирования оригинального видео (разрешение, скорость сжатия, цветовое пространство, частота кадров, кодек, параметры кодека и т. д.), а затем кодируйте свои изображения, используя точно такой же кодек с тем же самым опции. Затем вы можете скопировать видеопоток, читая / записывая кадры (без повторного кодирования), и добавить ваши новые закодированные кадры к этому видео. Это позволит избежать повторного кодирования исходного видео, но гораздо сложнее реализовать и подвержено ошибкам, особенно если исходное видео было закодировано не FFmpeg, а другим кодером.

Есть два способа:

    Если вы не заботитесь о производительности, вы можете прочитать кадры один за другим, затем декодировать каждый кадр в raw-формат(yuv420) и снова кодировать кадр в любой кодек, который вы хотите. Для вашего изображения просто преобразуйте его в yuv420 и Закодируйте в файл.
  1. Если вы просто хотите закодировать свое изображение в файл avi: вам нужно знать, что видеопоток - это кодек в вашем файле avi, затем Закодируйте свое изображение этим кодеком, и первое изображение должно быть ключевым кадром. Есть еще одна проблема, ваш параметр кодека, возможно, не будет совместим с исходным видеопотоком, там будет сложно. Вы должны проанализировать видеопоток и найти сведения о параметрах.