Esempio n. 1
0
 public Stream ReadVideoFrame(TimeSpan seek, Size?size)
 {
     this.Dispose();
     try
     {
         FFmpegArgsBuilder fFmpegArgsBuilder = new FFmpegArgsBuilder();
         fFmpegArgsBuilder.GlobalOptionArgs
         .SetThreadQueueSize(512)
         ;
         fFmpegArgsBuilder.SetInputFile(this.filePath)
         .SeekAccurate()
         .ReadByNativeFrame()
         .SetSeek(seek)
         ;
         var outputOptionArgs = fFmpegArgsBuilder.SetOutputImagePipe(videoPipeName)
                                .SetPixFormat(Formats.FFmpegPixFormat.rgb24)
                                .SetOutputVideoFrame(1)
                                .SetVideoFormat(FFmpegVideoFormat.image2)
                                .SetFramerate(this.FPS)
         ;
         if (size != null)
         {
             outputOptionArgs
             .SetVideoSize(size.Value);
         }
         this.ffmpegProcess = FFmpegService.StartFFmpegStandardOutput(fFmpegArgsBuilder.Args);
         return(this.ffmpegProcess.StandardOutput.BaseStream);
     }
     catch
     {
     }
     return(null);
 }
Esempio n. 2
0
 public bool MediaConvertPCM_S16E(string input, string output, int sampleRate)
 {
     try
     {
         if (!FFmpegService.FFmpegExists)
         {
             throw new FFmpegNotFoundException();
         }
         FFmpegArgsBuilder fFmpegArgsBuilder = new FFmpegArgsBuilder();
         fFmpegArgsBuilder.GlobalOptionArgs
         .OverwriteOutput()
         .SetThreadQueueSize(512);
         fFmpegArgsBuilder.SetInputFile(input);
         fFmpegArgsBuilder.SetOutputFile(output)
         //.SetAudioFormat(AudioFormat.s16le)
         .SetAudioCodec(FFmpegAudioCodec.pcm_s16le)
         .SetAudioFrequency(sampleRate)
         .SetAudioChannels(2)
         ;
         FFmpegService.StartFFmpeg(fFmpegArgsBuilder.Args);
         return(true);
     }
     catch
     {
         return(false);
     }
 }
Esempio n. 3
0
 public bool MediaCut(string input, string output, TimeSpan start, TimeSpan?end = null)
 {
     try
     {
         if (!FFmpegService.FFmpegExists)
         {
             throw new FFmpegNotFoundException();
         }
         FFmpegArgsBuilder fFmpegArgsBuilder = new FFmpegArgsBuilder();
         fFmpegArgsBuilder.GlobalOptionArgs
         .OverwriteOutput()
         .SetThreadQueueSize(512);
         var inputOptionArgs = fFmpegArgsBuilder.SetInputFile(input)
                               .SetSeek(start);
         var outputOptionArgs = fFmpegArgsBuilder.SetOutputFile(input)
         ;
         if (end != null)
         {
             outputOptionArgs
             .SetSeekEnd(end.Value)
             .SetAudioCodec(Codecs.FFmpegAudioCodec.copy)
             .SetVideoCodec(Codecs.FFmpegVideoCodec.copy);
         }
         FFmpegService.StartFFmpeg(fFmpegArgsBuilder.Args);
         return(true);
     }
     catch
     {
         return(false);
     }
 }
Esempio n. 4
0
        /// <summary>
        /// 这个算法还没有完成 用来获取Duration还是可以的
        /// </summary>
        /// <param name="filePath"></param>
        public void Open(string filePath)
        {
            FFmpegArgsBuilder fFmpegArgsBuilder = new FFmpegArgsBuilder();

            fFmpegArgsBuilder.SetInputFile(filePath);
            StreamReader streamReader = FFmpegService.StartFFmpegErrorStream(fFmpegArgsBuilder.Args);
            string       line         = string.Empty;

            line = streamReader.ReadToEnd();
            string regexDuration = "Duration: (.*?), start: (.*?), bitrate: (\\d*) kb\\/s";
            string regexVideo    = "Video: (.*?), (.*?), (\\d*x\\d*).*?, (.*?) kb/s, (.*?)[,\\s]";
            string regexAudio    = "Audio: (.*?), (.*?) Hz, (.*?), (.*?), (.*?) kb/s";
            Regex  regex;
            Match  match;

            regex = new Regex(regexDuration);
            match = regex.Match(line);
            if (match.Groups.Count == 4)
            {
                if (TimeSpan.TryParse(match.Groups[1].Value, out TimeSpan timeSpan))
                {
                    this.Duration = timeSpan;
                }
                this.Bitrate = regex.Match(line).Groups[3].Value;
            }
            regex = new Regex(regexVideo);
            match = regex.Match(line);
            if (match.Groups.Count == 6)
            {
                this.VideoFormat  = regex.Match(line).Groups[1].Value;
                this.PixFormat    = regex.Match(line).Groups[2].Value;
                this.Width        = int.Parse(regex.Match(line).Groups[3].Value.Split('x')[0]);
                this.Height       = int.Parse(regex.Match(line).Groups[3].Value.Split('x')[1]);
                this.VideoBitrate = regex.Match(line).Groups[4].Value;
                if (double.TryParse(regex.Match(line).Groups[5].Value, out double framerate))
                {
                    this.Framerate = framerate;
                }
            }
            regex = new Regex(regexAudio);
            match = regex.Match(line);
            if (match.Groups.Count == 6)
            {
                this.AudioFormat = regex.Match(line).Groups[1].Value;
                if (int.TryParse(regex.Match(line).Groups[2].Value, out int audioFrequency))
                {
                    this.AudioFrequency = audioFrequency;
                }
                this.AudioBitrate = regex.Match(line).Groups[5].Value;
            }
        }
Esempio n. 5
0
 public bool Open(string filePath)
 {
     try
     {
         FFmpegArgsBuilder fFmpegArgsBuilder = new FFmpegArgsBuilder();
         fFmpegArgsBuilder.GlobalOptionArgs
         .OverwriteOutput()
         .SetThreadQueueSize(512);
         fFmpegArgsBuilder.SetInputPipe(videoPipeName)
         .SetFramerate(this.VideoWriterArgs.FrameRate)
         .SetVideoFormat(FFmpegVideoFormat.rawvideo)
         .SetPixFormat(FFmpegPixFormat.rgb32)
         .SetVideoSize(this.VideoWriterArgs.Width, this.VideoWriterArgs.Height)
         ;
         var outputOptionArgs = fFmpegArgsBuilder.SetOutputFile(filePath)
                                .SetFramerate(this.VideoWriterArgs.FrameRate)
                                .SetFileLength(CommonWriterArgs.FileLength ?? 0, () => CommonWriterArgs.FileLength != null)
                                .SetVideoSize((int)(this.VideoWriterArgs.Width * this.VideoWriterArgs.ScaleWidth), (int)(this.VideoWriterArgs.Height * this.VideoWriterArgs.ScaleHeight))
         ;
         ((VideoCodecBase)this.VideoWriterArgs.VideoCodec).Apply(this.VideoWriterArgs, outputOptionArgs);
         var videoBufferSize = this.VideoWriterArgs.Width * this.VideoWriterArgs.Height * 4;
         this.videoPipeWrite = new PipeServerWrite(videoPipeName, videoBufferSize);
         if (this.Audioable)
         {
             fFmpegArgsBuilder.SetInputPipe(audioPipeName)
             .SetAudioFormat(FFmpegAudioFormat.s16le)
             .SetAudioCodec(FFmpegAudioCodec.pcm_s16le)
             .SetAudioFrequency(16000)
             .SetAudioChannels(2);
             outputOptionArgs
             .SetAudioFrequency(this.AudioWriterArgs.AudioFrequency)
             .SetAudioChannels(this.AudioWriterArgs.AudioChannels)
             ;
             ((AudioCodecBase)this.AudioWriterArgs.AudioCodec).Apply(this.AudioWriterArgs, outputOptionArgs);
             var audioBufferSize = (int)((1000.0 / this.VideoWriterArgs.FrameRate) * (44100 / 100.0) * 2 * 2 * 2);
             this.audioPipeWrite = new PipeServerWrite(audioPipeName, audioBufferSize);
         }
         this.ffmpegProcess = FFmpegService.StartFFmpeg(fFmpegArgsBuilder.Args);
         return(true);
     }
     catch (Exception ex)
     {
         return(false);
     }
 }
Esempio n. 6
0
 public bool MediaConvertAuto(string input, string output)
 {
     try
     {
         if (!FFmpegService.FFmpegExists)
         {
             throw new FFmpegNotFoundException();
         }
         FFmpegArgsBuilder fFmpegArgsBuilder = new FFmpegArgsBuilder();
         fFmpegArgsBuilder.GlobalOptionArgs
         .OverwriteOutput()
         .SetThreadQueueSize(512);
         fFmpegArgsBuilder.SetInputFile(input);
         fFmpegArgsBuilder.SetOutputFile(output);
         FFmpegService.StartFFmpeg(fFmpegArgsBuilder.Args);
         return(true);
     }
     catch
     {
         return(false);
     }
 }
Esempio n. 7
0
        public IEnumerable <VideoFrameArgs> ReadVideoFrames(TimeSpan?seek = null, TimeSpan?seekEnd = null, Size?size = null, bool readByNativeFrame = true, CancellationToken?cancellationToken = null)
        {
            this.Dispose();
            TimeSpan          startSeek         = seek ?? TimeSpan.FromSeconds(0);
            FFmpegArgsBuilder fFmpegArgsBuilder = new FFmpegArgsBuilder();

            fFmpegArgsBuilder.GlobalOptionArgs
            .SetThreadQueueSize(512)
            .SetNoStandardInput()
            ;
            var inputOptionArgs = fFmpegArgsBuilder.SetInputFile(this.filePath)
                                  .SeekAccurate()
                                  .SetSeek(startSeek)
                                  .ReadByNativeFrame(() => readByNativeFrame)
            ;
            var outputOptionArgs = fFmpegArgsBuilder.SetOutputImagePipe(videoPipeName)
                                   .SetVideoFormat(FFmpegVideoFormat.image2pipe)
                                   .SetVideoCodec(FFmpegVideoCodec.rawvideo)
                                   .SetPixFormat(Formats.FFmpegPixFormat.rgb24)
                                   .SetFramerate(this.FPS)
                                   .SetSeekEnd(seekEnd ?? TimeSpan.MinValue, () => seekEnd != null)
                                   .SetVideoSize(this.GetSize(size))
            ;

            this.ffmpegProcess = FFmpegService.StartFFmpegStandardOutput(fFmpegArgsBuilder.Args);
            cancellationToken?.Register(() =>
            {
                this.Dispose();
            });
            int  frameIndex = (int)(startSeek.TotalMilliseconds / (1000.0 / this.FPS));
            Size bitmapSize = this.GetSize(size);

            byte[] frameDataBuffer = new byte[bitmapSize.Width * bitmapSize.Height * 3];
            byte[] buffer          = new byte[32768]; //ffmpeg的缓冲区大小被限定在32k 32768 似乎没有办法修改?
            int    read;
            int    readed = 0;

            while ((read = this.ffmpegProcess.StandardOutput.BaseStream.Read(buffer, 0, Math.Min(buffer.Length, frameDataBuffer.Length - readed))) > 0)
            {
                if (cancellationToken?.IsCancellationRequested ?? false)
                {
                    this.Dispose();
                    yield break;
                }
                Array.Copy(buffer, 0, frameDataBuffer, readed, read);
                readed += read;
                if (readed == frameDataBuffer.Length)
                {
                    //对每一个像素的颜色进行转化
                    for (int i = 0; i < frameDataBuffer.Length; i += 3)
                    {
                        byte temp = frameDataBuffer[i + 2];
                        frameDataBuffer[i + 2] = frameDataBuffer[i];
                        frameDataBuffer[i]     = temp;
                    }
                    yield return(new VideoFrameArgs(frameIndex++, frameDataBuffer));

                    readed = 0;
                }
            }
        }