首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenCvSharp VideoWriter写一个空视频

OpenCvSharp VideoWriter写一个空视频
EN

Stack Overflow用户
提问于 2022-01-30 18:09:47
回答 1查看 763关注 0票数 0

我试图读取一个vide文件,调整帧的大小并将它们写入输出文件:

代码语言:javascript
运行
复制
using System;
using System.Drawing;
using System.Windows.Forms;
using OpenCvSharp;
using OpenCvSharp.Extensions;

namespace VideoProcessing
{
    public class Player
    {
        private VideoCapture capture;
        private VideoWriter writer;

        private Mat matInternal;
        public Bitmap bmInternal;

        private bool bIsPlaying = false;
        public Timer MyTimer    = new Timer();

        const string outname = "output.avi";
        OpenCvSharp.Size dsize = new OpenCvSharp.Size(640, 480);   

        public void InitPlayer(string videoName)
        {
            capture = new VideoCapture(videoName);
            writer  = new VideoWriter(outname, FourCC.MJPG, capture.Fps, dsize);

            matInternal = Mat.Zeros(dsize, MatType.CV_8UC3);
            bmInternal = matInternal.ToBitmap();

            var delay = 1000 / (int)capture.Fps;

            MyTimer.Interval = delay;
            MyTimer.Tick += new EventHandler(mk_onTick());
            MyTimer.Start();
        }

        private Action<object, EventArgs>
        mk_onTick()
        {
            return (object sender, EventArgs e) =>
            {
                capture.Read(matInternal);
                if (matInternal.Empty())
                {
                    Console.WriteLine("Empty frame!");
                }
                else
                {
                    matInternal.Resize(dsize);
                    bmInternal = matInternal.ToBitmap();
                    writer.Write(matInternal);
                }
            };
        }

        public void Dispose()
        {
            capture.Dispose();
            writer.Dispose();
        }
        
    }
}

这在我的主要功能中执行,如下所示:

代码语言:javascript
运行
复制
using System;
using System.Drawing;
using OpenCvSharp;
using OpenCvSharp.Extensions;

namespace VideoProcessing
{
    internal class Program
    {

        private static void Main(string[] args)
        {
            var videoName = "input.mp4";

            var pl = new Player();

            pl.InitPlayer(videoName);

            // Some other code that executes in the meantime

            pl.Dispose();
        }

    }
}

作者可以在视频完成之前得到处理,这是很好的,因为这以后将被改编为实时摄像机视频流。但是,这里的VideoWriter生成一个明显为空的0秒钟长视频文件。编解码器设置不会产生任何错误,而且视频只有24 FPS,因此不应该遇到任何速度问题。是什么导致了这一切?

EN

回答 1

Stack Overflow用户

发布于 2022-03-21 13:56:52

我认为你必须推迟你的主干道。例如,添加Thread.Sleep(2000)。

我用相机试试你的代码,效果很好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70917491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档