title: Accord.Video.FFMPEG.VideoFileWriter writes different data from the input data
body: <p>I'm working on project that encrypting video frames using RC4 algorithm and save these frames in playable video file.</p>
  
  <p>I used a package named Accord.Video.FFMPEG. This package has a classes (VideoFileReader, &amp; VideoFileWriter) that reads and writes video frames.</p>
  
  <p>The first step is reads the video:</p>
  
  <pre><code>VideoHandler v = new VideoHandler();
  OpenFileDialog newimag = new OpenFileDialog();
          if (newimag.ShowDialog() == DialogResult.OK)
          {
              textfile = newimag.FileName;
              picbox.ImageLocation = textfile;
              status1.Text = "loaded";
              //MessageBox.Show("your video file have been loaded seccufly"); // is an idea for viwing message 
  
          }
      bytedata = v.ReadAllFrameBytes(textfile);
  </code></pre>
  
  <p>The second step is encrypting the frames of video:</p>
  
  <pre><code>byte[] bn = new byte[bytedata.Length];// new array to hold the encryptred file
  
          bn = Encrypt(bytedata, ba);
  </code></pre>
  
  <p>The last step is saving the encrypted frames:</p>
  
  <pre><code>v.WriteFramesData(newfilepath, bn);
  </code></pre>
  
  <p>My encrypting algorithm is encrypting and decrypting the cipher with same algorithm and key.</p>
  
  <p>These stpes works on Text, and Images files, but when I use it on video I can't restore the encrypted video. After some testings,  I found that VideoFileWriter dosn't write the same input frames. Whyyyyyyy?</p>
  
  <p>Here is my VideoFileHandler I made it:</p>
  
  <pre><code> using System;
   using System.Collections.Generic;
   using System.Drawing;
   using System.Linq;
   using System.Text;
   using System.Drawing.Imaging;
   using System.IO;
   using Accord.Video.FFMPEG;
   namespace imgtobyt_1_in_c
   {
  class VideoHandler
  {
      public List&lt;byte[]&gt; data;
      public byte[] imagedata;
      public int Height, Width;
      public byte[] ReadAllFrameBytes(string FileName)
      {
          // create instance of video reader
          VideoFileReader reader = new VideoFileReader();
          // open video file
          reader.Open(FileName);
          Height = reader.Height;
          Width = reader.Width;
  
          data = new List&lt;byte[]&gt;();
          // read video frames
          for (int i = 0; i &lt; 100; i++) //change 100 to reader.FrameCount
          {
              Bitmap videoFrame = reader.ReadVideoFrame();
              byte[] framebytes = GetBytesFromFrame(videoFrame);
              data.Add(framebytes);
              // dispose the frame when it is no longer required
              videoFrame.Dispose();
          }
          reader.Close();
          imagedata = new byte[data.Count * data[0].Length];
          int c = 0;
          for (int i = 0; i &lt; data.Count; i++)
          {
              byte[] d = data[i];
              for (int x = 0; x &lt; d.Length; x++)
              {
                  imagedata[c] = d[x];
                  c++;
              }
          }
          return imagedata;
      }
  
      public byte[] GetBytesFromFrame(Bitmap Frame)
      {
          LockBitmap lockBitmap = new LockBitmap(Frame);
          lockBitmap.LockBits();
  
          byte[] framebytes = new byte[Frame.Width * Frame.Height * 3];
          int z = 0;
          for (int x = 0; x &lt; lockBitmap.Height; x++)
              for (int y = 0; y &lt; lockBitmap.Width; y++)
              {
                  Color Pixel = lockBitmap.GetPixel(y, x);
                  framebytes[z] = Pixel.R;
                  z++;
                  framebytes[z] = Pixel.G;
                  z++;
                  framebytes[z] = Pixel.B;
                  z++;
              }
  
          lockBitmap.UnlockBits();
          return framebytes;
          //using (var stream = new MemoryStream())
          //{
          //    Frame.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
          //    return stream.ToArray();
          //}
      }
  
      public Bitmap GetFrameFromBytes(byte[] Framebytes, ref int offset, int Width, int Height)
      {
          Bitmap Frame = new Bitmap(Width, Height, PixelFormat.Format24bppRgb);
          LockBitmap lockBitmap = new LockBitmap(Frame);
          lockBitmap.LockBits();
          for (int x = 0; x &lt; Height; x++)
              for (int y = 0; y &lt; Width; y++)
              {
                  Color Pixel = Color.FromArgb(Framebytes[offset], Framebytes[offset + 1], Framebytes[offset + 2]); offset += 3;
                  lockBitmap.SetPixel(y, x, Pixel);
              }
  
          lockBitmap.UnlockBits();
  
          return Frame;
          //Bitmap bmp;
          //using (var ms = new MemoryStream(Framebytes))
          //{
          //    bmp = new Bitmap(ms);
          //}
          //return bmp;
      }
  
      public void WriteFramesData(string FileName, byte[] data)
      {
          // create instance of video writer
          VideoFileWriter writer = new VideoFileWriter();
          // create new video file
          writer.Open(FileName, Width, Height);
  
          int offset = 0;
          // write video frames
          for (int i = 0; i &lt; 100; i++)
          {
              // create a bitmap to save into the video file
              Bitmap Frame = GetFrameFromBytes(data, ref offset, Width, Height);
              writer.WriteVideoFrame(Frame);
          }
          writer.Close();
      }
  }
   }
  </code></pre>
  
  <p>Please, I need to make this works.</p>