/// <summary>Add one frame to a new stream</summary> /// <param name="bmp"></param> /// <remarks> /// This works only with uncompressed streams, /// and compressed streams that have not been saved yet. /// Use DecompressToNewFile to edit saved compressed streams. /// </remarks> public void AddFrame(Bitmap bmp) { //bmp.RotateFlip(RotateFlipType.RotateNoneFlipY); // NEW 2012-11-10 if (countFrames == 0) { CopyPalette(bmp.Palette); SetFormat(writeCompressed ? compressedStream : StreamPointer, countFrames); } BitmapData bmpDat = bmp.LockBits( new Rectangle( 0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat); int result = Avi.AVIStreamWrite(writeCompressed ? compressedStream : StreamPointer, countFrames, 1, bmpDat.Scan0, (Int32)(bmpDat.Stride * bmpDat.Height), 0, 0, 0); if (result != 0) { throw new Exception("Exception in VideoStreamWrite: " + result.ToString()); } bmp.UnlockBits(bmpDat); countFrames++; }
/// <summary>Add an existing wave audio stream to the file</summary> /// <param name="newStream">The stream to add</param> public void AddAudioStream(AudioStream newStream) { Avi.AVISTREAMINFO streamInfo = new Avi.AVISTREAMINFO(); Avi.PCMWAVEFORMAT streamFormat = new Avi.PCMWAVEFORMAT(); int streamLength = 0; IntPtr waveData = newStream.GetStreamData(ref streamInfo, ref streamFormat, ref streamLength); IntPtr aviStream; int result = Avi.AVIFileCreateStream(aviFile, out aviStream, ref streamInfo); if (result != 0) { throw new Exception("Exception in AVIFileCreateStream: " + result.ToString()); } result = Avi.AVIStreamSetFormat(aviStream, 0, ref streamFormat, Marshal.SizeOf(streamFormat)); if (result != 0) { throw new Exception("Exception in AVIStreamSetFormat: " + result.ToString()); } result = Avi.AVIStreamWrite(aviStream, 0, streamLength, waveData, streamLength, Avi.AVIIF_KEYFRAME, 0, 0); if (result != 0) { throw new Exception("Exception in AVIStreamWrite: " + result.ToString()); } result = Avi.AVIStreamRelease(aviStream); if (result != 0) { throw new Exception("Exception in AVIStreamRelease: " + result.ToString()); } }
/// <summary>Add one frame to a new stream</summary> /// <param name="bmp"></param> /// <remarks> /// This works only with uncompressed streams, /// and compressed streams that have not been saved yet. /// Use DecompressToNewFile to edit saved compressed streams. /// </remarks> public void AddFrame(Bitmap bmp) { try { bmp.RotateFlip(RotateFlipType.RotateNoneFlipY); BitmapData bmpDat = bmp.LockBits( new Rectangle( 0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat); int result = Avi.AVIStreamWrite(writeCompressed ? compressedStream : aviStream, countFrames, 1, bmpDat.Scan0, (Int32)(bmpDat.Stride * bmpDat.Height), 0, 0, 0); if (result != 0) { throw new Exception("Exception in VideoStreamWrite: " + result.ToString()); } bmp.UnlockBits(bmpDat); countFrames++; } catch (Exception exp) { Debug.Write(exp.ToString()); } }
/// <summary>Add an existing wave audio stream to the file</summary> /// <param name="newStream">The stream to add</param> /// <param name="startAtFrameIndex"> /// The index of the video frame at which the sound is going to start. /// '0' inserts the sound at the beginning of the video. /// </param> public void AddAudioStream(AudioStream newStream, int startAtFrameIndex) { Avi.AVISTREAMINFO streamInfo = new Avi.AVISTREAMINFO(); Avi.PCMWAVEFORMAT streamFormat = new Avi.PCMWAVEFORMAT(); int streamLength = 0; IntPtr rawData = newStream.GetStreamData(ref streamInfo, ref streamFormat, ref streamLength); IntPtr waveData = rawData; if (startAtFrameIndex > 0) { //not supported //streamInfo.dwStart = startAtFrameIndex; double framesPerSecond = GetVideoStream().FrameRate; double samplesPerSecond = newStream.CountSamplesPerSecond; double startAtSecond = startAtFrameIndex / framesPerSecond; int startAtSample = (int)(samplesPerSecond * startAtSecond); waveData = InsertSilence(startAtSample - 1, waveData, streamLength, ref streamInfo); } IntPtr aviStream; int result = Avi.AVIFileCreateStream(aviFile, out aviStream, ref streamInfo); if (result != 0) { throw new Exception("Exception in AVIFileCreateStream: " + result.ToString()); } result = Avi.AVIStreamSetFormat(aviStream, 0, ref streamFormat, Marshal.SizeOf(streamFormat)); if (result != 0) { throw new Exception("Exception in AVIStreamSetFormat: " + result.ToString()); } result = Avi.AVIStreamWrite(aviStream, 0, streamLength, waveData, streamLength, Avi.AVIIF_KEYFRAME, 0, 0); if (result != 0) { throw new Exception("Exception in AVIStreamWrite: " + result.ToString()); } result = Avi.AVIStreamRelease(aviStream); if (result != 0) { throw new Exception("Exception in AVIStreamRelease: " + result.ToString()); } Marshal.FreeHGlobal(waveData); }