Example #1
0
        public static void ConvertWrite(SnmFile snm, string fileName)
        {
            if (snm == null)
            {
                throw new ArgumentNullException(nameof(snm));
            }

            if (string.IsNullOrEmpty(fileName))
            {
                throw new ArgumentNullException(nameof(fileName));
            }

            int  fps           = (1000000 + snm.Header.FrameDelay / 2) / snm.Header.FrameDelay;
            long frameDuration = 10 * 1000 * 1000 / fps;

            InitializeSinkWriter(
                fileName,
                snm.Header.Width,
                snm.Header.Height,
                fps,
                out IMFSinkWriter writer,
                out int videoStream,
                out int audioStream);

            try
            {
                snm.BeginPlay();

                try
                {
                    long rtStartVideo = 0;
                    long rtStartAudio = 0;

                    while (snm.RetrieveNextFrame(out byte[] audioData, out byte[] videoData))
                    {
                        if (videoData != null)
                        {
                            WriteVideoFrame(snm.Header.Width, snm.Header.Height, frameDuration, writer, videoStream, rtStartVideo, videoData);
                            rtStartVideo += frameDuration;
                        }

                        if (audioData != null)
                        {
                            byte[] buffer   = ConvertAudio22050To44100(audioData);
                            long   duration = (long)(10 * 1000 * 1000) * audioData.Length / (22050 * 4);
                            WriteAudioFrame(duration, writer, audioStream, rtStartAudio, buffer);
                            rtStartAudio += duration;
                        }
                    }
                }
                finally
                {
                    snm.EndPlay();
                }

                writer.Finalize_();
            }
            finally
            {
                Marshal.ReleaseComObject(writer);
            }
        }