如何实时获取/显示文件大小?

时间:2013-06-06 22:46:23

标签: c# winforms pipe

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

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

我想得到/显示每次可能每40ms或每次新的位图到达文件的大小即使文件尚未在硬盘上创建我想要实时查看文件大小将会 。例如:

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);

我该怎么做?

1 个答案:

答案 0 :(得分:0)

一旦有可能使ffmpeg将其输出写入stdout而不是文件。然后,您可以通过设置RedirectStandardOutput属性来捕获输出。

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