-1

我有这段代码,我使用 ffmpeg.exe 压缩文件,然后使用 pipstream write 我每 40 毫秒从 Form1 计时器获取一个位图并将其写入管道流。

当我关闭应用程序时,它会在硬盘上创建一个新的 avi 视频文件。

我想每次可能每 40 毫秒或每次到达新位图时获取/显示文件的大小,即使该文件尚未在硬盘上创建,我想实时查看文件大小。例如:

40kb 然后在 40ms 之后 120kb 然后在 40ms 之后 200kb 等等..

public void Start(string pathFileName, int BitmapRate)
        {
            string outPath = pathFileName;
            p = new NamedPipeServerStream(pipename, PipeDirection.Out, 1, PipeTransmissionMode.Byte);
            b = new byte[1920 * 1080 * 3]; // some buffer for the r g and b of pixels of an image of size 720p

            ProcessStartInfo psi = new ProcessStartInfo();
            psi.WindowStyle = ProcessWindowStyle.Hidden;
            psi.UseShellExecute = false;
            psi.CreateNoWindow = false;
            psi.FileName = ffmpegFileName;
            psi.WorkingDirectory = workingDirectory;
            psi.Arguments = @"-f rawvideo -pix_fmt bgr0 -video_size 1920x1080 -i \\.\pipe\mytestpipe -map 0 -c:v libx264 -r " + BitmapRate + " " + outPath;
            process = Process.Start(psi);
            process.EnableRaisingEvents = false;
            p.WaitForConnection();
        }

        public void PushFrame(Bitmap bmp)
        {

            int length;
            // Lock the bitmap's bits.
            //bmp = new Bitmap(1920, 1080);
            Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
            //Rectangle rect = new Rectangle(0, 0, 1280, 720);
            System.Drawing.Imaging.BitmapData bmpData =
                bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly,
                bmp.PixelFormat);

            int absStride = Math.Abs(bmpData.Stride);
            // Get the address of the first line.
            IntPtr ptr = bmpData.Scan0;

            // Declare an array to hold the bytes of the bitmap.
            //length = 3 * bmp.Width * bmp.Height;
            length = absStride * bmpData.Height;
            byte[] rgbValues = new byte[length];

            //Marshal.Copy(ptr, rgbValues, 0, length);
            int j = bmp.Height - 1;
            for (int i = 0; i < bmp.Height; i++)
            {
                IntPtr pointer = new IntPtr(bmpData.Scan0.ToInt32() + (bmpData.Stride * j));
                System.Runtime.InteropServices.Marshal.Copy(pointer, rgbValues, absStride * (bmp.Height - i - 1), absStride);
                j--;
            }
            p.Write(rgbValues, 0, length);
            bmp.UnlockBits(bmpData);

我该怎么做 ?

4

1 回答 1

0

曾经有可能让 ffmpeg 将其输出写入标准输出而不是文件。然后,您可以通过设置RedirectStandardOutput属性来捕获输出。

然后由您自己读取重定向的输出并将其保存到磁盘。当然,您将在保存数据时确切地知道您保存了多少数据。

于 2013-06-06T22:56:00.063 回答