c# - 将图像添加到视频末尾

标签 c# image video ffmpeg video-processing

common_video.avi 图片1.jpg 图片2.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 抛出:“错误配置过滤器”;

最佳答案

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

您需要的可以通过以下方式之一实现:

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

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

关于c# - 将图像添加到视频末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21054951/

相关文章:

c# - 如何使用 C# 实现 Modbus 功能 20?

java - 添加 JLabel 作为 JPanel 的背景

javascript - 如何在 HTML5 Canvas 上移动绘制的图像?

video - ffmpeg并排覆盖两个视频问题

iphone - iPhone 视频通话/ session API

c# - 在 WinForm 项目选项卡中运行 exe

c# - 对值在数据库中存储为 int 的枚举列进行排序

html - 在单行图像中裁剪到最短的图像高度?

javascript - 来自多个来源的 HTML 5 实时视频流

c# - 不使用 SqlParameterCollection 时,SqlParameter 已包含在另一个 SqlParameterCollection 中