Ejemplo n.º 1
0
        internal void ProcessVideo(Action <IEnumerable <SourceReaderExtra>, ProcessSample> process)
        {
            var readWriteFactory = new ReadWriteClassFactory();

            var attributes = new Attributes
            {
                ReadWriterEnableHardwareTransforms = true,
                SourceReaderEnableVideoProcessing  = true
            };

            var readers = VideoFiles.Select(f => f.CreateSourceReader(readWriteFactory, attributes)).ToArray();

            try
            {
                using (var sinkWriter = readWriteFactory.CreateSinkWriterFromURL(DestinationFile, attributes))
                {
                    var writeToSink = ConnectStreams(readers, sinkWriter);

                    using (sinkWriter.BeginWriting())
                        process(readers, writeToSink);
                }
            }
            finally
            {
                if (readers != null)
                {
                    foreach (var r in readers)
                    {
                        r.Dispose();
                    }
                }
            }
        }
Ejemplo n.º 2
0
        internal string TestVideoConversion()
        {
            var readWriteFactory = new ReadWriteClassFactory();

            var attributes = new Attributes
            {
                ReadWriterEnableHardwareTransforms = true,
                SourceReaderEnableVideoProcessing = true
            };

            var readers = VideoFiles.Select(f => f.CreateSourceReader(readWriteFactory, attributes)).ToArray();

            var testOuputFile = readers.First().FileName + ".tmp.test.wmv";
            try
            {
                using (var sinkWriter = readWriteFactory.CreateSinkWriterFromURL(testOuputFile, attributes))
                {
                    var writeToSink = ConnectStreams(readers, sinkWriter);
                }
            }
            catch(Exception e)
            {
                return e.Message;
            }
            finally
            {
                if (readers != null)
                    foreach (var r in readers)
                        r.Dispose();

                File.Delete(testOuputFile);
            }

            return null;
        }
        public static VideoDetails For(string videoFileName)
        {
            List<int> supportedAudioBitRates = new List<int>();

            using (MFSystem.Start())
            {
                var readWriteFactory = new ReadWriteClassFactory();

                var sourceReader = readWriteFactory.CreateSourceReaderFromURL(videoFileName, null);

                var videoStream = sourceReader.Streams.First(s => s.IsSelected && s.NativeMediaType.IsVideo);

                var audioStream = sourceReader.Streams.First(s => s.IsSelected && s.NativeMediaType.IsAudio);

                var channels = audioStream.NativeMediaType.AudioNumberOfChannels;
                var sampleRate = audioStream.NativeMediaType.AudioSamplesPerSecond;

                var types = MFSystem.TranscodeGetAudioOutputAvailableTypes(MediaFoundation.MFMediaType.WMAudioV9, MediaFoundation.Transform.MFT_EnumFlag.All);

                foreach (var bitRate in types
                    .Where(t => t.AudioNumberOfChannels == channels && t.AudioSamplesPerSecond == sampleRate)
                    .Select(t => t.AudioAverageBytesPerSecond)
                    .Distinct()
                    .OrderBy(t => t))
                {
                    supportedAudioBitRates.Add(bitRate * 8);
                }

                int videoBitRate = 0;
                videoStream.NativeMediaType.TryGetBitRate(out videoBitRate);

                return new VideoDetails(supportedAudioBitRates.ToArray(), videoStream.NativeMediaType.FrameRate.ToInt(), videoStream.NativeMediaType.FrameSize, videoBitRate / 1000000);
            }
        }
Ejemplo n.º 4
0
        public SourceReaderExtra CreateSourceReader(ReadWriteClassFactory readWriteFactory, Attributes attributes)
        {
            TraceDebug.WriteLine("Attempting to open file {0}".F(this.FileName));
            var reader = readWriteFactory.CreateSourceReaderFromURL(this.FileName, attributes);
            TraceDebug.WriteLine("Opened file {0}.  Duration: {1}".F(this.FileName, reader.Duration.FromNanoToSeconds()));

            return new SourceReaderExtra(this.FileName,  this.State,  reader);
        }
Ejemplo n.º 5
0
        public SourceReaderExtra CreateSourceReader(ReadWriteClassFactory readWriteFactory, Attributes attributes)
        {
            TraceDebug.WriteLine("Attempting to open file {0}".F(this.FileName));
            var reader = readWriteFactory.CreateSourceReaderFromURL(this.FileName, attributes);

            TraceDebug.WriteLine("Opened file {0}.  Duration: {1}".F(this.FileName, reader.Duration.FromNanoToSeconds()));

            return(new SourceReaderExtra(this.FileName, this.State, reader));
        }
Ejemplo n.º 6
0
        public void Process()
        {
            using (MFSystem.Start())
            {
                var readWriteFactory = new ReadWriteClassFactory();

                var attributes = new Attributes
                {
                    ReadWriterEnableHardwareTransforms = true,
                    SourceReaderEnableVideoProcessing = true,
                };

                var destAttributes = new Attributes
                {
                    ReadWriterEnableHardwareTransforms = true,
                    SourceReaderEnableVideoProcessing = true,
                    MaxKeyFrameSpacing = 3000
                };

                var shortSourceReader = readWriteFactory.CreateSourceReaderFromURL(shortSourceFile, attributes);
                var shortSourceReader2 = readWriteFactory.CreateSourceReaderFromURL(shortSourceFile, attributes);
                var mainSourceReader = readWriteFactory.CreateSourceReaderFromURL(mainSourceFile, attributes);
                var sinkWriter = readWriteFactory.CreateSinkWriterFromURL(destinationFile, destAttributes);

                var writeToSink = ConnectStreams(shortSourceReader, shortSourceReader2, mainSourceReader, sinkWriter);

                ProcessSample progress = sample =>
                {
                    if(!sample.Flags.EndOfStream)
                        Trace.WriteLine(string.Format("sourceTime: {0}, sampleTime: {1}", sample.Timestamp.FromNanoToSeconds(), sample.SampleTime.FromNanoToSeconds()));
                    return writeToSink(sample);
                };

                var fadeSegments = AVOperations.FadeIn(AVOperations.FadeOut(progress));

                var editoutMiddle = AVOperations.Cut(9.FromSecondsToNano(), 19.FromSecondsToNano(), fadeSegments);

                var overlay = AVOperations.Overlay(applyOverlay, editoutMiddle);

                var first4Seconds = AVOperations.Cut(0.FromSecondsToNano(), 4.FromSecondsToNano(), progress, progress);

                var readers = AVOperations.Combine(new[] { shortSourceReader, mainSourceReader }, 1.1);

                using (sinkWriter.BeginWriting())
                {
                    AVOperations.StartConcat(readers, overlay,
                            AVOperations.Concat(shortSourceReader, first4Seconds, () => false), () => false);
                }
            }
        }
        internal void ProcessVideo(Action<IEnumerable<SourceReaderExtra>, ProcessSample> process)
        {
            var readWriteFactory = new ReadWriteClassFactory();

            var attributes = new Attributes
            {
                ReadWriterEnableHardwareTransforms = true,
                SourceReaderEnableVideoProcessing = true
            };

            var readers = VideoFiles.Select(f => f.CreateSourceReader(readWriteFactory, attributes)).ToArray();
            var sinkWriter = readWriteFactory.CreateSinkWriterFromURL(DestinationFile, attributes);

            var writeToSink = ConnectStreams(readers, sinkWriter);

            using (sinkWriter.BeginWriting())
                process(readers, writeToSink);
        }
Ejemplo n.º 8
0
        internal string TestVideoConversion()
        {
            var readWriteFactory = new ReadWriteClassFactory();

            var attributes = new Attributes
            {
                ReadWriterEnableHardwareTransforms = true,
                SourceReaderEnableVideoProcessing  = true
            };

            var readers = VideoFiles.Select(f => f.CreateSourceReader(readWriteFactory, attributes)).ToArray();

            var testOuputFile = readers.First().FileName + ".tmp.test.wmv";

            try
            {
                using (var sinkWriter = readWriteFactory.CreateSinkWriterFromURL(testOuputFile, attributes))
                {
                    var writeToSink = ConnectStreams(readers, sinkWriter);
                }
            }
            catch (Exception e)
            {
                return(e.Message);
            }
            finally
            {
                if (readers != null)
                {
                    foreach (var r in readers)
                    {
                        r.Dispose();
                    }
                }

                File.Delete(testOuputFile);
            }

            return(null);
        }
Ejemplo n.º 9
0
        public void Process()
        {
            using (MFSystem.Start())
            {
                var readWriteFactory = new ReadWriteClassFactory();

                var attributes = new Attributes
                {
                    ReadWriterEnableHardwareTransforms = true,
                    SourceReaderEnableVideoProcessing = true,
                };

                var destAttributes = new Attributes
                {
                    ReadWriterEnableHardwareTransforms = true,
                    SourceReaderEnableVideoProcessing = true,
                    MaxKeyFrameSpacing = 3000
                };

                var sourceReader = readWriteFactory.CreateSourceReaderFromURL(sourceFile, attributes);
                var sinkWriter = readWriteFactory.CreateSinkWriterFromURL(destinationFile, destAttributes);

                var writeToSink = ConnectStreams(sourceReader, sinkWriter);

                using (sinkWriter.BeginWriting())
                {
                    sourceReader.Samples(sample =>
                        {
                            Console.Clear();
                            Console.WriteLine(TimeSpan.FromSeconds(sample.Timestamp.FromNanoToSeconds()));

                            return writeToSink(sample);
                        });
                }
            }
        }
Ejemplo n.º 10
0
        public static VideoDetails TestFor(string videoFileName)
        {
            List<int> supportedAudioBitRates = new List<int>();

            using (MFSystem.Start())
            {
                var readWriteFactory = new ReadWriteClassFactory();

                var sourceReader = readWriteFactory.CreateSourceReaderFromURL(videoFileName, null);

                var videoStream = sourceReader.Streams.FirstOrDefault(s => s.IsSelected && s.NativeMediaType.IsVideo);
                if (videoStream.IsNull)
                    throw new Exception("Unable to find video track within file.");

                var audioStream = sourceReader.Streams.FirstOrDefault(s => s.IsSelected && s.NativeMediaType.IsAudio);
                if (audioStream.IsNull)
                    throw new Exception("Unable to find audio track within file.");

                var channels = audioStream.NativeMediaType.AudioNumberOfChannels;
                var sampleRate = audioStream.NativeMediaType.AudioSamplesPerSecond;

                var types = MFSystem.TranscodeGetAudioOutputAvailableTypes(MediaFoundation.MFMediaType.WMAudioV9, MediaFoundation.Transform.MFT_EnumFlag.All);

                foreach (var bitRate in types
                    .Where(t => t.AudioSamplesPerSecond == sampleRate)
                    .Select(t => t.AudioAverageBytesPerSecond)
                    .Distinct()
                    .OrderBy(t => t))
                {
                    supportedAudioBitRates.Add(bitRate);
                }

                int videoBitRate = 0;
                videoStream.NativeMediaType.TryGetBitRate(out videoBitRate);

                var audioSamplesPerSecond = audioStream.NativeMediaType.AudioSamplesPerSecond;
                var audioAverageBytesPerSecond = audioStream.NativeMediaType.AudioAverageBytesPerSecond;

                var audioSubTypeName = audioStream.CurrentMediaType.SubTypeName;
                var videoSubTypeName = videoStream.CurrentMediaType.SubTypeName;

                var transcoder = new Transcoder
                {
                    VideoFiles = new[] { new SourceReaderExtra(videoFileName, null) },
                    DestinationFile = Path.ChangeExtension(videoFileName, "wmv"),
                    VideoBitRate = 5000000
                };

                var errorMessage = transcoder.TestVideoConversion();

                return new VideoDetails(
                    supportedAudioBitRates.ToArray(),
                    videoStream.NativeMediaType.FrameRate.ToInt(),
                    videoStream.NativeMediaType.FrameSize,
                    videoBitRate / 1000000,
                    audioSamplesPerSecond,
                    audioAverageBytesPerSecond,
                    videoSubTypeName,
                    audioSubTypeName,
                    transcoder,
                    errorMessage);
            }
        }
Ejemplo n.º 11
0
        public static VideoDetails TestFor(string videoFileName)
        {
            List <int> supportedAudioBitRates = new List <int>();

            using (MFSystem.Start())
            {
                var readWriteFactory = new ReadWriteClassFactory();

                var sourceReader = readWriteFactory.CreateSourceReaderFromURL(videoFileName, null);

                var videoStream = sourceReader.Streams.FirstOrDefault(s => s.IsSelected && s.NativeMediaType.IsVideo);
                if (videoStream.IsNull)
                {
                    throw new Exception("Unable to find video track within file.");
                }

                var audioStream = sourceReader.Streams.FirstOrDefault(s => s.IsSelected && s.NativeMediaType.IsAudio);
                if (audioStream.IsNull)
                {
                    throw new Exception("Unable to find audio track within file.");
                }

                var channels   = audioStream.NativeMediaType.AudioNumberOfChannels;
                var sampleRate = audioStream.NativeMediaType.AudioSamplesPerSecond;

                var types = MFSystem.TranscodeGetAudioOutputAvailableTypes(MediaFoundation.MFMediaType.WMAudioV9, MediaFoundation.Transform.MFT_EnumFlag.All);

                foreach (var bitRate in types
                         .Where(t => t.AudioSamplesPerSecond == sampleRate)
                         .Select(t => t.AudioAverageBytesPerSecond)
                         .Distinct()
                         .OrderBy(t => t))
                {
                    supportedAudioBitRates.Add(bitRate);
                }

                int videoBitRate = 0;
                videoStream.NativeMediaType.TryGetBitRate(out videoBitRate);

                var audioSamplesPerSecond      = audioStream.NativeMediaType.AudioSamplesPerSecond;
                var audioAverageBytesPerSecond = audioStream.NativeMediaType.AudioAverageBytesPerSecond;

                var audioSubTypeName = audioStream.CurrentMediaType.SubTypeName;
                var videoSubTypeName = videoStream.CurrentMediaType.SubTypeName;

                var transcoder = new Transcoder
                {
                    VideoFiles      = new[] { new SourceReaderExtra(videoFileName, null) },
                    DestinationFile = Path.ChangeExtension(videoFileName, "wmv"),
                    VideoBitRate    = 5000000
                };

                var errorMessage = transcoder.TestVideoConversion();

                return(new VideoDetails(
                           supportedAudioBitRates.ToArray(),
                           videoStream.NativeMediaType.FrameRate.ToInt(),
                           videoStream.NativeMediaType.FrameSize,
                           videoBitRate / 1000000,
                           audioSamplesPerSecond,
                           audioAverageBytesPerSecond,
                           videoSubTypeName,
                           audioSubTypeName,
                           transcoder,
                           errorMessage));
            }
        }
Ejemplo n.º 12
0
 public SourceReaderExtra CreateSourceReader(ReadWriteClassFactory readWriteFactory, Attributes attributes)
 {
     var reader = readWriteFactory.CreateSourceReaderFromURL(this.FileName, attributes);
     return new SourceReaderExtra(this.FileName,  this.State,  reader);
 }