সি # /। নেট এর জন্য সলিড এফএফপিপেগ র‍্যাপার


91

আমি সি # /। নেট এর জন্য শক্ত এফএফএমপিগের মোড়কের জন্য কিছুক্ষণ ধরে ওয়েবে অনুসন্ধান করছি । তবে আমি এখনও দরকারী কিছু নিয়ে আসতে পারি। আমি নিম্নলিখিত তিনটি প্রকল্প খুঁজে পেয়েছি, তবে তাদের সবকটিই আলফা পর্যায়ে মারা যাওয়ার কথা বলে।

FFmpeg.NET ffmpeg-
ধারালো
FFLIB.NET

সুতরাং আমার প্রশ্নটি যদি কেউ জানতে পারে যে আরও একটি পরিপক্ক একটি র‌্যাপার প্রকল্প সম্পর্কে?
আমি কাজের সারি এবং আরও কিছু সহ একটি সম্পূর্ণ ট্রান্সকোডিং ইঞ্জিন খুঁজছি না। কেবলমাত্র একটি সরল মোড়ক যাতে আমাকে কমান্ড লাইন কল করতে হবে না এবং তারপরে কনসোল আউটপুট বিশ্লেষণ করতে হবে না, তবে পদ্ধতি কলগুলি করতে পারে এবং অগ্রগতির জন্য ইভেন্টলিস্টার ব্যবহার করতে পারে।

এবং দয়া করে কোনও সক্রিয় প্রকল্পগুলি উল্লেখ করার জন্য নির্দ্বিধায় বোধ করুন, এমনকি যদি তারা প্রাথমিক পর্যায়ে স্তম্ভিত থাকে।



4
এর সাথে নতুন কিছু? আপনার মোড়কের কোনও অগ্রগতি হয়েছে?
আভি

4
@ লিল্যান্ডেন আপনি কি কখনও নিজের মোড়ক প্রকাশ করেছেন বা উন্মুক্ত উত্স করেছেন?
নিক বেনেডিক্ট

আকর্ষণীয় যে প্রশ্নটি প্রায় 6 বছরের পুরানো তবে ওপি (@ জ্যাকবপুলআরচার্ট) কোনও উত্তরই মানেনি।
ওফার জেলিগ

4
আমি নিজের তৈরি একটি মোড়ক ব্যবহার করে শেষ করেছি এবং এর ফলে প্রস্তাবিত প্রকল্পগুলির কোনও ব্যবহার হয়নি। যেহেতু আমি আর ffmpeg নিয়ে আর কাজ করি না, আমার কাছে ফিরে যাওয়ার এবং তাদের কোনওটি চেষ্টা করার সময় হয়নি। তবে বেশিরভাগ উত্তরগুলি স্কাইম করার পরে আপত্তি জানিয়েছে। সুতরাং আমি সত্যিই ভাবি না যে আমি বলতে পারি যে কোনও উত্তরই অন্যের চেয়ে বেশি "সঠিক"।
জ্যাকব পল রিচার্ড

উত্তর:


24

এটি আমার নিজের একটি মোড়ক: https://github.com/AydinAdn/MediaToolkit

মিডিয়াটুলকিট:

  • ভিডিও ফাইলগুলি অন্যান্য বিভিন্ন ভিডিও ফর্ম্যাটে রূপান্তর করুন।
  • ভিডিও ট্রান্সকোডিং কার্য সম্পাদন করুন।
    • অপশনগুলি কনফিগার করা: Bit rate, Frame rate, Resolution / size, Aspect ratio,Duration of video
  • অডিও ট্রান্সকোডিং কার্য সম্পাদন করুন।
    • বিকল্পসমূহ কনফিগারযোগ্য: Audio sample rate
  • ফিল্ম, পাল বা এনটিএসসি টিভি স্ট্যান্ডার্ড ব্যবহার করে ভিডিওকে শারীরিক ফর্ম্যাটে রূপান্তর করুন
    • Mediums অন্তর্ভুক্ত: DVD, DV, DV50, VCD,SVCD

আমি পাশাপাশি যাচ্ছি তাই এটি আপডেট করছি এবং এটি ব্যবহারে আপনাকে স্বাগতম, আপনি প্যাকেজ ম্যানেজার কনসোল ব্যবহার করে এটিও ইনস্টল করতে পারেন।

PM> Install-Package MediaToolkit

আপনার টুলকিট ম্যাক্স / প্রদত্ত আউটপুট রেজোলিউশনের একটিতে বিভিন্ন ভিডিও এবং অডিও ক্লিপগুলি সরবরাহ করতে পারে?
আন্তোনিও পেট্রিক্কা

না, এটি সাধারণ রূপান্তরগুলির পিছনে পিছনে থাকা লোকদের জন্য ব্যবহার করার জন্য ডিজাইন করা হয়েছিল। এটি বলেছিল, খুব শীঘ্রই ভি 2 আসবে যা আপনাকে এফএফপ্পেগের অফারটিতে থাকা সমস্ত কিছু করার অনুমতি দেবে।
Aydin,

আপনাকে ধন্যবাদ আইদিন, দয়া করে আমাকে এই নতুন প্রকাশ সম্পর্কে অবহিত করুন।
আন্তোনিও পেট্রিক্কা

অসাধারণ লাগছে! এখন পর্যন্ত ভাল কাজ!
SpoiledTechie.com

আরে আয়িন, এই কি স্ক্রিনটি রেকর্ড করতে পারে?
টেক

14

বেশ কয়েকটি মোড়কের চেষ্টা করার পরে, আমি এটি দিয়ে গিয়েছিলাম: FFmpeg অটো সি # /। নেট এবং মনোর জন্য অনিরাপদ বাইন্ডিং তৈরি করেছে

এটি এফএফপিপেগ নেমস্পেসের প্রতিটি শ্রেণীর জন্য নিম্ন-স্তরের ইন্টারপ বাইন্ডিংগুলির একটি সেট। প্রকৃত মোড়কের মতো ব্যবহার করা যেমন সুবিধাজনক নয় তবে আইএমও এটি FFmpeg এর সাথে কাজ করার সেরা সমাধান N নেট, যদি আপনি অ-তুচ্ছ জিনিস করতে চান তবে।

পেশাদাররা:

  • কাজ
  • বিশ্বাসযোগ্য - আপনার নিজের এফএফএমপেইগকে বিশ্বাস করে, ত্রুটিগুলি প্রবর্তনের জন্য কোনও তৃতীয় পক্ষের র‍্যাপার কোড নেই।
  • এটি সর্বদা FFmpeg এর সর্বশেষতম সংস্করণে আপডেট হয়
  • সমস্ত বাইন্ডিংয়ের জন্য একক নুগেট প্যাকেজ
  • এক্সএমএল ডকুমেন্টেশন অন্তর্ভুক্ত করা হয়েছে তবে আপনি এখনও অনলাইনে ডকুমেন্টেশন এফএফম্পেগ ডকুমেন্টেশন ব্যবহার করতে পারেন ।

কনস:

  • নিম্ন স্তর: আপনাকে সি স্ট্রাক্টের সাথে পয়েন্টার দিয়ে কীভাবে কাজ করতে হবে তা জানতে হবে ।
  • এটির কাজ পেতে প্রাথমিকভাবে কিছু কাজ প্রয়োজন। আমি সরকারী উদাহরণ থেকে শেখার পরামর্শ দিই ।

দ্রষ্টব্য: এই থ্রেডটি এফএফপিপেগ এপিআই ব্যবহার করার বিষয়ে, তবে কিছু ব্যবহারের ক্ষেত্রে, কেবলমাত্র ffmpeg.exe এর কমান্ড লাইন ইন্টারফেস ব্যবহার করা ভাল ।


। নেট ফ্রেমওয়ার্ক (মূল নয়) এর জন্য লক্ষ্যযুক্ত কোন প্রকল্প থেকে আপনি কী এটি ব্যবহারের ব্যবস্থা করেছিলেন? আমি নিশ্চিত যে আমি এখানে কী মিস করছি
Yoav Feuerstein

@ YoavFeuerstein হ্যাঁ
orca

10

এটি ব্যবহার করে দেখুন, আমি মনে করি আমি হয়ত এমন কিছু লিখেছিলাম যা আপনি সাধারণ মোড়কের জন্য ব্যবহার করতে পারেন।

http://jasonjano.wordpress.com/2010/02/09/a-simple-c-wrapper- for-ffmpeg/


ধন্যবাদ, তবে আমি নিজের লেখা শুরু করি। তবে আমি যদি কিছু ধারণা না তুলতে পারি তবে আমি করব।
জ্যাকব পৌল রিচার্ড

10

আমি একটি এএসপি.এনইটি / উইন্ডোজ পরিষেবা (। নেট) অ্যাপ্লিকেশন থেকে এফএফম্পেগ ব্যবহার করেছি। তবে আমি কনসোলটি বিশ্লেষণ না করে কমান্ড-লাইনটি ব্যবহার করে শেষ করেছি। এটি ব্যবহার করে - আমার কাছে নিয়ন্ত্রণের একটি সহজ উপায় ছিল - এফএফম্পেগের আপডেট এবং একাধিক কোরগুলিতে একাধিক রূপান্তর চলমান।


ঠিক আছে, আমি অনুরূপ কিছু নিয়ে শুরু করেছিলাম। তবে আমি আরও দৃ sti়ভাবে আশা করছি যে কারোর আরও ভাল সমাধান হবে।
জ্যাকব পল রিচার্ড

4

আপনি এই নুগেট প্যাকেজটি ব্যবহার করতে পারেন:

আমি জানি যে আপনি পরিপক্ক প্রকল্প সম্পর্কে জিজ্ঞাসা করেছেন , তবে আমি আমার প্রত্যাশা পূরণ করার মতো কোনও প্রকল্প দেখিনি তাই আমি নিজের সিদ্ধান্ত নেওয়ার সিদ্ধান্ত নিয়েছি। আপনি সহজেই রূপান্তরগুলি সারিবদ্ধ করতে পারেন এবং এটিকে সমান্তরালভাবে চালাতে পারেন, মিডিয়াগুলিকে বিভিন্ন ফর্ম্যাটে রূপান্তর করার পদ্ধতি, আপনার নিজস্ব যুক্তিগুলি ffmpeg এ প্রেরণ এবং বর্তমান অগ্রগতি সহ ffmpeg + ইভেন্ট শ্রোতার কাছ থেকে পার্স আউটপুট।

Install-Package Xabe.FFmpeg

আমি ক্রস-প্ল্যাটফর্ম এফএফএমপিগ র‍্যাপারটি ব্যবহার করা সহজ করার চেষ্টা করছি।

আপনি https://xabe.net/product/xabe_ffmpeg/ এ সম্পর্কে আরও তথ্য পেতে পারেন

এখানে আরও তথ্য: https://xabe.net/product/xabe_ffmpeg/# ডকুমেন্টেশন

রূপান্তর সহজ:

IConversionResult result = await Conversion.ToMp4(Resources.MkvWithAudio, output).Start();

আপনি যদি অগ্রগতি চান:

IConversion conversion = Conversion.ToMp4(Resources.MkvWithAudio, output);
conversion.OnProgress += (duration, length) => { currentProgress = duration; } 
await conversion.Start();

হ্যালো ... একটি ওয়েব পৃষ্ঠা থেকে আসা স্ট্রিমিং ডেটা ট্রান্সকোড করতে এবং এটি একটি আরটিএমপি সার্ভারে প্রেরণ করার জন্য আমার এফএফএমপিইজি ব্যবহার দরকার। আমার সি # উইনফর্ম প্রোগ্রামে আমার কাছে বাইটের অ্যারে রয়েছে। আমার কেবল ট্রান্সকোড করতে হবে এবং আরটিএমপি সার্ভারে প্রেরণ করতে হবে। আমি কি এই মোড়ক ব্যবহার করে তা করতে পারি? আমি লিনাক্সে সকেটিও ব্যবহার করে একটি নোডেজ সার্ভার ব্যবহার করে এটি করেছি। সেই প্ল্যাটফর্মে, আমি স্টিডিনের মাধ্যমে বাইনারি স্ট্রিমটি প্রেরণ করি এবং স্ট্যাডারে রূপান্তর স্থিতি পাই। আমি কি এটি জ্যাব মোড়ক ব্যবহার করে করতে পারি?
jstuardo

3

আমি মিডিয়া হ্যান্ডলার প্রো থেকে একটি ffmpeg মোড়ক লাইব্রেরি সঙ্গে প্রায় খেলা করছি

http://www.mediasoftpro.com

এখন পর্যন্ত প্রতিশ্রুতিবদ্ধ বলে মনে হচ্ছে।


এটি আপনার জন্য কীভাবে কাজ করে? এছাড়াও, কাজটি করার মতো প্রক্রিয়া হিসাবে MediaHandlerস্প্যান ffmpeg.exeহয়, বা কোনও আসল পি / ইনভোক লাইব্রেরি নেই?
গ্লেন স্লেডেন

আমি এটি বেশ কয়েকটি প্রকল্পে ব্যবহার করে শেষ করেছি। এটি ভারী বোঝার অধীনে একটি পরিবেশের পরিবেশে ভাল কাজ করেছে। আমি এটি ব্যবহার করার পরে এটি একটি সময় হয়ে গেছে, তবে যা আমি মনে করি, হ্যাঁ এটি প্রক্রিয়া হিসাবে ffmpeg.exe স্প্যান করে।
ক্রিস্টোফ চ্যাং

3

আমি একই জিনিসটি নিয়ে গবেষণা করছি এবং মূলত মিডিয়াটুলকিট ব্যবহার করেছি (অন্য উত্তরে উল্লিখিত) যা রূপান্তরগুলির জন্য দুর্দান্ত কাজ করেছে তবে এখন আমার আরও কিছুটা দৃ rob়তর কিছু প্রয়োজন need

একটি বিকল্প যা পরিপক্ক এবং এখনও সক্রিয় বলে মনে হচ্ছে তা হ'ল: https://github.com/hudl/HudlFfmpeg যা আপনি এখানে আরও পড়তে পারেন: http://public.hudl.com/bit/archives/2014/08/15/ ঘোষণা -হুডল্ফ্প্পেগ-এসি-ফ্রেমওয়ার্ক-থেকে-মেক-এফএফএমপিগ-ইন্টারঅ্যাকশন-সহজ /

আরও একটি বিকল্প, যা অনেক ক্ষেত্রে মামলা নাও পারে, তা হ'ল আপনার সি # কোড থেকে সরাসরি এক্সাইজ করা: http://www.codeproject.com/Articles/774093/Another-FFmpeg-exe-Charhar-Wrapper


2

4
লিঙ্কটির জন্য ধন্যবাদ, তবে যতদূর আমি দেখতে পাচ্ছি আপনি জাভাতে আপনার লিখেছেন, সি সি # নয়।
জ্যাকব পল রিচার্ড

হাই লিলিমেডেন, আমি যে লিঙ্কটি দিয়েছি তা আসলে জাভাতে বাস্তবায়িত হয়েছে এবং আপনি যদি নিবন্ধের নীচে জিপটি ডাউনলোড করেন তবে আপনি দেখতে পাবেন যে এর ভিতরে একটি জার সংরক্ষণাগার ফাইল রয়েছে। ধন্যবাদ, ইলিয়া
Ilya

উত্তরের লিঙ্কটি মারা গেছে বলে মনে হচ্ছে: "এই সাইটে পৌঁছানো যাবে না - ivolo.mit.edu প্রতিক্রিয়া জানাতে খুব বেশি সময় নিয়েছে" "
প্যাং

2

আপনি এখানে যান ... এই কোডটির বেশিরভাগটি 2+ বছরের পুরনো তাই প্রচুর অ্যাসিনক্রোনাস স্টাফ হারিয়েছে এবং একটি পুরানো নামকরণ কনভেনশন ব্যবহার করছে। বেশ কিছু সময়ের জন্য একটি উত্পাদন viর্ষা হিসাবে চালিত ~ জেটি

internal static class FFMpegArgUtils
    {
        public static string GetEncodeVideoFFMpegArgs(string sSourceFile, MP4Info objMp4Info, double nMbps, int iWidth, int iHeight, bool bIncludeAudio, string sOutputFile)
        {
            //Ensure file contains a video stream, otherwise this command will fail
            if (objMp4Info != null && objMp4Info.VideoStreamCount == 0)
            {
                throw new Exception("FFMpegArgUtils::GetEncodeVideoFFMpegArgs - mp4 does not contain a video stream");
            }

            int iBitRateInKbps = (int)(nMbps * 1000);


            StringBuilder sbArgs = new StringBuilder();
            sbArgs.Append(" -y -threads 2 -i \"" + sSourceFile + "\" -strict -2 "); // 0 tells it to choose how many threads to use

            if (bIncludeAudio == true)
            {
                //sbArgs.Append(" -acodec libmp3lame -ab 96k");
                sbArgs.Append(" -acodec aac -ar 44100 -ab 96k");
            }
            else
            {
                sbArgs.Append(" -an");
            }


            sbArgs.Append(" -vcodec libx264 -level 41 -r 15 -crf 25 -g 15  -keyint_min 45 -bf 0");

            //sbArgs.Append(" -vf pad=" + iWidth + ":" + iHeight + ":" + iVideoOffsetX + ":" + iVideoOffsetY);
            sbArgs.Append(String.Format(" -vf \"scale=iw*min({0}/iw\\,{1}/ih):ih*min({0}/iw\\,{1}/ih),pad={0}:{1}:({0}-iw)/2:({1}-ih)/2\"",iWidth, iHeight));

            //Output File
            sbArgs.Append(" \"" + sOutputFile + "\"");
            return sbArgs.ToString();
        }

        public static string GetEncodeAudioFFMpegArgs(string sSourceFile, string sOutputFile)
        {
            var args = String.Format(" -y -threads 2 -i \"{0}\" -strict -2  -acodec aac -ar 44100 -ab 96k -vn \"{1}\"", sSourceFile, sOutputFile);
            return args;


            //return GetEncodeVideoFFMpegArgs(sSourceFile, null, .2, 854, 480, true, sOutputFile);
            //StringBuilder sbArgs = new StringBuilder();
            //int iWidth = 854;
            //int iHeight = 480;
            //sbArgs.Append(" -y -i \"" + sSourceFile + "\" -strict -2 "); // 0 tells it to choose how many threads to use
            //sbArgs.Append(" -acodec aac -ar 44100 -ab 96k");
            //sbArgs.Append(" -vcodec libx264 -level 41 -r 15 -crf 25 -g 15  -keyint_min 45 -bf 0");
            //sbArgs.Append(String.Format(" -vf \"scale=iw*min({0}/iw\\,{1}/ih):ih*min({0}/iw\\,{1}/ih),pad={0}:{1}:({0}-iw)/2:({1}-ih)/2\"", iWidth, iHeight));
            //sbArgs.Append(" \"" + sOutputFile + "\"");
            //return sbArgs.ToString();
        }
    }

internal class CreateEncodedVideoCommand : ConsoleCommandBase
    {
        public event ProgressEventHandler OnProgressEvent;

        private string _sSourceFile;
        private  string _sOutputFolder;
        private double _nMaxMbps;

        public double BitrateInMbps
        {
            get { return _nMaxMbps; }
        }

        public int BitrateInKbps
        {
            get { return (int)Math.Round(_nMaxMbps * 1000); }
        }

        private int _iOutputWidth;
        private int _iOutputHeight;

        private bool _bIsConverting = false;
        //private TimeSpan _tsDuration;
        private double _nPercentageComplete;
        private string _sOutputFile;
        private string _sOutputFileName;


        private bool _bAudioEnabled = true;
        private string _sFFMpegPath;
        private string _sExePath;
        private string _sArgs;
        private MP4Info _objSourceInfo;
        private string _sOutputExt;

        /// <summary>
        /// Encodes an MP4 to the specs provided, quality is a value from 0 to 1
        /// </summary>
        /// <param name="nQuality">A value from 0 to 1</param>
        /// 
        public CreateEncodedVideoCommand(string sSourceFile, string sOutputFolder, string sFFMpegPath, double nMaxBitrateInMbps, MP4Info objSourceInfo, int iOutputWidth, int iOutputHeight, string sOutputExt)
        {
            _sSourceFile = sSourceFile;
            _sOutputFolder = sOutputFolder;
            _nMaxMbps = nMaxBitrateInMbps;
            _objSourceInfo = objSourceInfo;
            _iOutputWidth = iOutputWidth;
            _iOutputHeight = iOutputHeight;
            _sFFMpegPath = sFFMpegPath;
            _sOutputExt = sOutputExt;
        }

        public void SetOutputFileName(string sOutputFileName)
        {
            _sOutputFileName = sOutputFileName;
        }


        public override void Execute()
        {
            try
            {
                _bIsConverting = false;

                string sFileName = _sOutputFileName != null ? _sOutputFileName : Path.GetFileNameWithoutExtension(_sSourceFile) + "_" + _iOutputWidth + "." + _sOutputExt;
                _sOutputFile = _sOutputFolder + "\\" + sFileName;

                _sExePath = _sFFMpegPath;
                _sArgs = FFMpegArgUtils.GetEncodeVideoFFMpegArgs(_sSourceFile, _objSourceInfo,_nMaxMbps, _iOutputWidth, _iOutputHeight, _bAudioEnabled, _sOutputFile);

                InternalExecute(_sExePath, _sArgs);
            }
            catch (Exception objEx)
            {
                DispatchException(objEx);
            }
        }

        public override string GetCommandInfo()
        {
            StringBuilder sbInfo = new StringBuilder();
            sbInfo.AppendLine("CreateEncodeVideoCommand");
            sbInfo.AppendLine("Exe: " + _sExePath);
            sbInfo.AppendLine("Args: " + _sArgs);
            sbInfo.AppendLine("[ConsoleOutput]");
            sbInfo.Append(ConsoleOutput);
            sbInfo.AppendLine("[ErrorOutput]");
            sbInfo.Append(ErrorOutput);

            return base.GetCommandInfo() + "\n" + sbInfo.ToString();
        }

        protected override void OnInternalCommandComplete(int iExitCode)
        {
            DispatchCommandComplete( iExitCode == 0 ? CommandResultType.Success : CommandResultType.Fail);
        }

        override protected void OnOutputRecieved(object sender, ProcessOutputEventArgs objArgs)
        {
            //FMPEG out always shows as Error
            base.OnOutputRecieved(sender, objArgs);

            if (_bIsConverting == false && objArgs.Data.StartsWith("Press [q] to stop encoding") == true)
            {
                _bIsConverting = true;
            }
            else if (_bIsConverting == true && objArgs.Data.StartsWith("frame=") == true)
            {
                //Capture Progress
                UpdateProgressFromOutputLine(objArgs.Data);
            }
            else if (_bIsConverting == true && _nPercentageComplete > .8 && objArgs.Data.StartsWith("frame=") == false)
            {
                UpdateProgress(1);
                _bIsConverting = false;
            }
        }

        override protected void OnProcessExit(object sender, ProcessExitedEventArgs args)
        {
            _bIsConverting = false;
            base.OnProcessExit(sender, args);
        }

        override public void Abort()
        {
            if (_objCurrentProcessRunner != null)
            {
                //_objCurrentProcessRunner.SendLineToInputStream("q");
                _objCurrentProcessRunner.Dispose();
            }
        }

        #region Helpers

        //private void CaptureSourceDetailsFromOutput()
        //{
        //    String sInputStreamInfoStartLine = _colErrorLines.SingleOrDefault(o => o.StartsWith("Input #0"));
        //    int iStreamInfoStartIndex = _colErrorLines.IndexOf(sInputStreamInfoStartLine);
        //    if (iStreamInfoStartIndex >= 0)
        //    {
        //        string sDurationInfoLine = _colErrorLines[iStreamInfoStartIndex + 1];
        //        string sDurantionTime = sDurationInfoLine.Substring(12, 11);

        //        _tsDuration = VideoUtils.GetDurationFromFFMpegDurationString(sDurantionTime);
        //    }
        //}

        private void UpdateProgressFromOutputLine(string sOutputLine)
        {
            int iTimeIndex = sOutputLine.IndexOf("time=");
            int iBitrateIndex = sOutputLine.IndexOf(" bitrate=");

            string sCurrentTime = sOutputLine.Substring(iTimeIndex + 5, iBitrateIndex - iTimeIndex - 5);
            double nCurrentTimeInSeconds = double.Parse(sCurrentTime);
            double nPercentageComplete = nCurrentTimeInSeconds / _objSourceInfo.Duration.TotalSeconds;

            UpdateProgress(nPercentageComplete);
            //Console.WriteLine("Progress: " + _nPercentageComplete);
        }

        private void UpdateProgress(double nPercentageComplete)
        {
            _nPercentageComplete = nPercentageComplete;
            if (OnProgressEvent != null)
            {
                OnProgressEvent(this, new ProgressEventArgs( _nPercentageComplete));
            }
        }

        #endregion

        //public TimeSpan Duration { get { return _tsDuration; } }

        public double Progress { get { return _nPercentageComplete;  } }
        public string OutputFile { get { return _sOutputFile; } }

        public bool AudioEnabled
        {
            get { return _bAudioEnabled; }
            set { _bAudioEnabled = value; }
        }
}

public abstract class ConsoleCommandBase : CommandBase, ICommand
    {
        protected ProcessRunner _objCurrentProcessRunner;
        protected   List<String> _colOutputLines;
        protected List<String> _colErrorLines;


        private int _iExitCode;

        public ConsoleCommandBase()
        {
            _colOutputLines = new List<string>();
            _colErrorLines = new List<string>();
        }

        protected void InternalExecute(string sExePath, string sArgs)
        {
            InternalExecute(sExePath, sArgs, null, null, null);
        }

        protected void InternalExecute(string sExePath, string sArgs, string sDomain, string sUsername, string sPassword)
        {
            try
            {
                if (_objCurrentProcessRunner == null || _bIsRunning == false)
                {
                    StringReader objStringReader = new StringReader(string.Empty);

                    _objCurrentProcessRunner = new ProcessRunner(sExePath, sArgs);

                    _objCurrentProcessRunner.SetCredentials(sDomain, sUsername, sPassword);

                    _objCurrentProcessRunner.OutputReceived += new ProcessOutputEventHandler(OnOutputRecieved);
                    _objCurrentProcessRunner.ProcessExited += new ProcessExitedEventHandler(OnProcessExit);
                    _objCurrentProcessRunner.Run();

                    _bIsRunning = true;
                    _bIsComplete = false;
                }
                else
                {
                    DispatchException(new Exception("Processor Already Running"));
                }
            }
            catch (Exception objEx)
            {
                DispatchException(objEx);
            }
        }

        protected virtual void OnOutputRecieved(object sender, ProcessOutputEventArgs args)
        {
            try
            {
                if (args.Error == true)
                {
                    _colErrorLines.Add(args.Data);
                    //Console.WriteLine("Error: " + args.Data);
                }
                else
                {
                    _colOutputLines.Add(args.Data);
                    //Console.WriteLine(args.Data);
                }
            }
            catch (Exception objEx)
            {
                DispatchException(objEx);
            }
        }

        protected virtual void OnProcessExit(object sender, ProcessExitedEventArgs args)
        {
            try
            {
                Console.Write(ConsoleOutput);
                _iExitCode = args.ExitCode;

                _bIsRunning = false;
                _bIsComplete = true;

                //Some commands actually fail to succeed
                //if(args.ExitCode != 0)
                //{
                //    DispatchException(new Exception("Command Failed: " + this.GetType().Name + "\nConsole: " + ConsoleOutput + "\nConsoleError: " + ErrorOutput));
                //}

                OnInternalCommandComplete(_iExitCode);

                if (_objCurrentProcessRunner != null)
                {
                    _objCurrentProcessRunner.Dispose();
                    _objCurrentProcessRunner = null;    
                }
            }
            catch (Exception objEx)
            {
                DispatchException(objEx);
            }
        }

        abstract protected void OnInternalCommandComplete(int iExitCode);

        protected string JoinLines(List<String> colLines)
        {
            StringBuilder sbOutput = new StringBuilder();
            colLines.ForEach( o => sbOutput.AppendLine(o));
            return sbOutput.ToString();
        }

        #region Properties
        public int ExitCode
        {
            get { return _iExitCode; }
        }
        #endregion

        public override string GetCommandInfo()
        {
            StringBuilder sbCommandInfo = new StringBuilder();
            sbCommandInfo.AppendLine("Command:  " + this.GetType().Name);
            sbCommandInfo.AppendLine("Console Output");
            if (_colOutputLines != null)
            {
                foreach (string sOutputLine in _colOutputLines)
                {
                    sbCommandInfo.AppendLine("\t" + sOutputLine);
                }
            }
            sbCommandInfo.AppendLine("Error Output");
            if (_colErrorLines != null)
            {
                foreach (string sErrorLine in _colErrorLines)
                {
                    sbCommandInfo.AppendLine("\t" + sErrorLine);
                }
            }
            return sbCommandInfo.ToString();
        }

        public String ConsoleOutput { get { return JoinLines(_colOutputLines); } }
        public String ErrorOutput { get { return JoinLines(_colErrorLines);} }

    }

CommandBase : ICommand
    {
        protected IDedooseContext _context;
        protected Boolean _bIsRunning = false;
        protected Boolean _bIsComplete = false;

        #region Custom Events
        public event CommandCompleteEventHandler OnCommandComplete;
        event CommandCompleteEventHandler ICommand.OnCommandComplete
        {
            add { if (OnCommandComplete != null) { lock (OnCommandComplete) { OnCommandComplete += value; } } else { OnCommandComplete = new CommandCompleteEventHandler(value); } }
            remove { if (OnCommandComplete != null) { lock (OnCommandComplete) { OnCommandComplete -= value; } } }
        }

        public event UnhandledExceptionEventHandler OnCommandException;
        event UnhandledExceptionEventHandler ICommand.OnCommandException
        {
            add { if (OnCommandException != null) { lock (OnCommandException) { OnCommandException += value; } } else { OnCommandException = new UnhandledExceptionEventHandler(value); } }
            remove { if (OnCommandException != null) { lock (OnCommandException) { OnCommandException -= value; } } }
        }

        public event ProgressEventHandler OnProgressUpdate;
        event ProgressEventHandler ICommand.OnProgressUpdate
        {
            add { if (OnProgressUpdate != null) { lock (OnProgressUpdate) { OnProgressUpdate += value; } } else { OnProgressUpdate = new ProgressEventHandler(value); } }
            remove { if (OnProgressUpdate != null) { lock (OnProgressUpdate) { OnProgressUpdate -= value; } } }
        }
        #endregion

        protected CommandBase()
        {
            _context = UnityGlobalContainer.Instance.Context;
        }

        protected void DispatchCommandComplete(CommandResultType enResult)
        {
            if (enResult == CommandResultType.Fail)
            {
                StringBuilder sbMessage = new StringBuilder();
                sbMessage.AppendLine("Command Commpleted with Failure: "  + this.GetType().Name);
                sbMessage.Append(GetCommandInfo());
                Exception objEx = new Exception(sbMessage.ToString());
                DispatchException(objEx);
            }
            else
            {
                if (OnCommandComplete != null)
                {
                    OnCommandComplete(this, new CommandCompleteEventArgs(enResult));
                }
            }
        }

        protected void DispatchException(Exception objEx)
        {
            if (OnCommandException != null)
            { 
                OnCommandException(this, new UnhandledExceptionEventArgs(objEx, true)); 
            }
            else
            {
                _context.Logger.LogException(objEx, MethodBase.GetCurrentMethod());
                throw objEx;
            }
        }

        protected void DispatchProgressUpdate(double nProgressRatio)
        {
            if (OnProgressUpdate != null) { OnProgressUpdate(this, new ProgressEventArgs(nProgressRatio)); } 
        }

        public virtual string GetCommandInfo()
        {
            return "Not Implemented: " + this.GetType().Name;
        }

        public virtual void Execute() { throw new NotImplementedException(); }
        public virtual void Abort() { throw new NotImplementedException(); }

        public Boolean IsRunning { get { return _bIsRunning; } }
        public Boolean IsComplete { get { return _bIsComplete; } }

        public double GetProgressRatio()
        {
            throw new NotImplementedException();
        }
    }

public delegate void CommandCompleteEventHandler(object sender, CommandCompleteEventArgs e);

    public interface ICommand
    {
        event CommandCompleteEventHandler OnCommandComplete;
        event UnhandledExceptionEventHandler OnCommandException;
        event ProgressEventHandler OnProgressUpdate;

        double GetProgressRatio();
        string GetCommandInfo();

        void Execute();
        void Abort();
    }

প্রক্রিয়া রানার স্টাফগুলির জন্য // রজার ক্যানাপ দ্বারা প্রসেসরুনার সন্ধান করুন


1
        string result = String.Empty;
        StreamReader srOutput = null;
        var oInfo = new ProcessStartInfo(exePath, parameters)
        {
            UseShellExecute = false,
            CreateNoWindow = true,
            RedirectStandardOutput = true,
            RedirectStandardError = true
        };

        var output = string.Empty;

        try
        {
            Process process = System.Diagnostics.Process.Start(oInfo);
            output = process.StandardError.ReadToEnd();
            process.WaitForExit();
            process.Close();
        }
        catch (Exception)
        {
            output = string.Empty;
        }
        return output;

এই মোড়কটি পদ্ধতিটিকে কোনও লুপে পড়তে দেবে না। এটি চেষ্টা করুন, এটা আমার জন্য কাজ করেছে।


1

আমি কোডেপ্লেক্স থেকে এফএফপিএমইজিএনকে সংযুক্ত করেছি।

এখনও সক্রিয়ভাবে কাজ করা হচ্ছে।

https://github.com/spoiledtechie/FFMpeg.Net

এটি dlls ব্যবহার করে না, বরং উদাহরণটি ব্যবহার করে। সুতরাং এটি আরও স্থিতিশীল হতে থাকে।


দেখে মনে হচ্ছে আমি পরে যাচ্ছি, তবে কীভাবে কেউ তাদের প্রকল্পে এটি প্রয়োগ করে?
টেক

আপনার প্রকল্পে এই প্রকল্পটি যুক্ত করুন, তারপরে নিশ্চিত করুন যে এফএফএমপিইগ সঠিকভাবে প্রকল্পের ভিতরে বসে আছে। এটি এখনও চলছে।
SpoiledTechie.com

আমি কি এফএফএমপিইজিএন ব্যবহার করে বাইট হিসাবে একটি ফ্রেমকে এনকোড এবং ডিকোড করতে পারি? উদাহরণস্বরূপ, বাইট [] এনকোডিএইচ 264 (বাইট []) এবং বাইট [] ডিকোডেহ 264 (বাইট [])
আহমাদ

0

সি # /। নেট এবং মনো এর জন্য অটো জেনারেটেড এফএফএমপিগ র‍্যাপারটি দেখুন , দুর্দান্ত একটি প্রকল্প যা এফএফপিপেক ইন্টারপের জন্য একমাত্র সত্য, সম্পূর্ণ। নেট র্যাপার বলে মনে হচ্ছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.