代码之家  ›  专栏  ›  技术社区  ›  Евгений Федоров

FFMPEG:将视频流实时录制到磁盘

  •  0
  • Евгений Федоров  · 技术社区  · 2 年前

    我用ffmpeg录制了一段视频

     var inputArgs = string.Format(CultureInfo.InvariantCulture, "-framerate {0} -f rawvideo -pix_fmt {3} -video_size {1}x{2} -i -", VideoFPS, VideoXRes, VideoYRes, VideoPXLFormat);
    
     var outputArgs = string.Format(CultureInfo.InvariantCulture, "-vcodec mpeg4 -crf {2} -pix_fmt yuv420p -preset {3} -shortest -r {1} \"{0}\"", outputPath, VideoFPS, VideoCRFValue, CompressionRate);
    
     var ffmpegProcess = new Process
            {
                StartInfo =
                {
                    FileName = ffmpegPath,
                    Arguments = $"{inputArgs} {outputArgs}",
                    UseShellExecute = false,
                    CreateNoWindow = true,
                    RedirectStandardInput = true
                }
            };
    
            ffmpegProcess .Start();
            var VideoRecordingFFmpegInput = VideoRecordingFFmpegProcces.StandardInput.BaseStream;
    

    现在,我不时地将图像中的数据字节写入流中

    VideoRecordingFFmpegInput.Write(framesByteArray, 0, sizeOfpack);
    

    当我录制完这些画面时:

      VideoRecordingFFmpegInput.Flush();
      VideoRecordingFFmpegInput.Close();
      ffmpegProcess.WaitForExit();
    

    一切正常,它创建了我想要的文件。

    当这个过程开始时,它会创建一个非常小的文件 enter image description here

    在视频流中记录图像字节的过程中,这个大小不会改变(可能是写入RAM?)

    但一旦ffmpeg过程完成,就会刷新/关闭 文件大小变为正常大小。

    enter image description here

    问题是,如果我记录几个小时,可能会导致OutOfMemory异常

    有没有办法让帧记录下来并立即增加文件大小?(没有无限填充闸板?)

    0 回复  |  直到 2 年前