آموزش استفاده از ffmpeg در Air

شروع موضوع توسط yaa110 ‏17 جولای 2013 در انجمن برنامه فلش Flash

کلمات کلیدی:
  1. yaa110

    yaa110 کاربر فعال

    ارسال‌ها:
    206
    تشکر شده:
    507
    امتیاز دستاورد:
    16
    منبع: http://flashcenter.ir/blog/?p=381 (مهم: با توجه به اینکه فروم به صورت اتوماتیک به جای حروف s و e و x پشت سر هم (حتی اگر داخل کلمه ای با معنای متفاوت باشند !!!) * قرار میدهد، برخی از کدها از خوانایی افتاده، لذا توصیه می شود که به لینک قرار داده شده مراجعه کنید.)

    در این درس بعنوان مثال نحوه دریافت اطلاعات یک فایل صوتی یا ویدئویی به کمک ffmpeg در Adobe Air آموزش داده می شود. برای این کار از کلاسه NativeProcess استفاده می کنیم. به کمک کلاسه NativeProcess می تونیم یک فایل را اجرا کنیم و سپس به کمک دستورات Command Line فایل مربوطه اون فایل را کنترل کنیم (اگر نیاز به جزئیات دقیقتر و علمی تر دارید، از راهنمای ادوبی استفاده کنید).

    1. با توجه به سیستم عامل خودتون نسخه 32 بیتی ffmpeg را از آدرس ffmpeg.org دانلود کنید.

    2. یک شی جدید از کلاسه NativeProcessStartupInfo بسازید. این کلاسه درواقع حامل اطلاعاتی میشه که کلاسه NativeProcess درهنگام شروع برای اجرای فایل موردنظر (در این مثال ffmpeg.exe) نیاز داره. همچنین یک شی جدید از NativeProcess هم بسازید.
    کد (Text):
    [COLOR=#222222][FONT=Tahoma]var _npi:NativeProcessStartupInfo = new NativeProcessStartupInfo();[/FONT][/COLOR][COLOR=#222222][FONT=Tahoma]var _np:NativeProcess = new NativeProcess();[/FONT][/COLOR]
    3. حالا نیاز به متغیری داریم که آرگومان های قابل اجرا توسط ffmpeg.exe را در بر بگیره. برای این کار از vector استفاده می کنیم. vector را می تونید به صورت مجموعه ای از متغیرهای خاص (در اینجا String) در نظر بگیرید.
    کد (Text):
    var _args:Vector.<String> = new Vector.<String>();
    4. آرگومان های قابل اجرا توسط ffmpeg.exe را به vector اضافه کنید (لیست کاملی از آرگومان ها). توجه کنید که به جای عبارت _path باید آدرس فایل مدیا نوشته شود (مثلا "C:/flashcenter.wmv").
    کد (Text):
    _args.push("-i", _path);
    5. آدرس فایل مورد نظر را به NativeProcessStartupInfo معرفی کنید. برای اینکار از کلاسه File استفاده می کنیم.
    کد (Text):
    _npi.executable = File.applicationDirectory.resolvePath("ffmpeg32/bin/ffmpeg.exe");
    6. آرگومان های تعریف شده را به NativeProcessStartupInfo پیوست کنید.
    کد (Text):
    _npi.arguments = _args;
    7. در ادامه برای دریافت اطلاعات از ffmpeg یک EventListener از نوع ProgressEvent.STANDARD_ERROR_DATA و برای اطلاع از زمان اتمام دریافت اطلاعات یک EventListener دیگر از نوع NativeProces***itEvent.EXIT تعریف کنید.
    کد (Text):
    [COLOR=#222222][FONT=Tahoma]_np.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, onDataRecieve);[/FONT][/COLOR][COLOR=#222222][FONT=Tahoma]_np.addEventListener(NativeProces***itEvent.EXIT, onExit);[/FONT][/COLOR]
    8. توابعی که توسط Listener فراخوانی می شود را به صورت زیر تعریف کنید.
    کد (Text):
    [COLOR=#222222][FONT=Tahoma]function onDataRecieve(e:ProgressEvent):void {[/FONT][/COLOR]    _data += _np.standardError.readUTFBytes(_np.standardError.bytesAvailable);
    [COLOR=#222222][FONT=Tahoma]}[/FONT][/COLOR]
    اطلاعات دریافتی را در یک متغیر که از قبل ساخته بودیم، قرار دادیم. در ای مثال، این اطلاعات از جنس String هستند.

    کد (Text):
    [COLOR=#222222][FONT=Tahoma]function onExit(e:NativeProces***itEvent):void {[/FONT][/COLOR]    trace(_data);
    [COLOR=#222222][FONT=Tahoma]}[/FONT][/COLOR]
    9. در نهایت اطلاعات کاملی از فایل مدیا را مشاهده خواهید کرد، اطلاعاتی مثل Duration، مشخصات Codec ها و ... که برای استفاده و استخراج هر کدام از این اطلاعات از اطلاعات نهایی نیاز به استفاده از دستورهای RegExp و String دارید. بعنوان مثال، یک کلاسه دریافت اطلاعات فایل مدیا و استخراج داده های مختلف در زیر آمده است:
    کد (Text):
    [COLOR=#222222][FONT=Tahoma]package ir.flashcenter {[/FONT][/COLOR]  
     import flash.desktop.NativeProcess;
        import flash.desktop.NativeProcessStartupInfo;
        import flash.filesystem.File;
        import flash.events.ProgressEvent;
        import flash.events.EventDispatcher;
        import flash.events.Event;
        import flash.events.NativeProces***itEvent;


        public class GetMediaInfo extends EventDispatcher {


            private var _np:NativeProcess;
            private var _npi:NativeProcessStartupInfo;
            private var _args:Vector.<String>;


            public var _data:String;
            public var _info:Object;


            public function GetMediaInfo() {
                // constructor code
            }


            public function getInfo(_path:String):void {
                _args = new Vector.<String>();
                _args.push("-i", _path);


                _npi = new NativeProcessStartupInfo();
                _npi.executable = File.applicationDirectory.resolvePath("ffmpeg32/bin/ffmpeg.exe");
                _npi.arguments = _args;


                _np = new NativeProcess();
                _np.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, onDataRecieve);
                _np.addEventListener(NativeProces***itEvent.EXIT, onExit);
                _np.start(_npi);
            }


            private function onExit(e:NativeProces***itEvent):void {
                var _reg:RegExp;
                var _time:Array = new Array();
                var _match:Array = new Array();


                _info = new Object();            


                // Get Duration
                if (_data.indexOf("Duration:") != -1) {
                    _reg = /Duration:([^,]+)/;
                    _match = _data.match(_reg);
                    if (_match.length > 0) {
                        _time = _match[1].split(":");
                        try {
                            _info.duration = ((Number(_time[0]) * 3600) + (Number(_time[1]) * 60) + Number(_time[2]));
                        } catch (e:Error) {


                    }
                    }
                }


                // Get Bitrate
                if (_data.indexOf("bitrate:") != -1) {
                    _reg = /bitrate:([^k]+)/;
                    _match = _data.match(_reg);
                    try {
                        _info.bitrate = Number(_match[1]);
                    } catch (e:Error) {


                    }
                }


                // Get width and Height
                if (_data.indexOf("Video:") != -1) {
                    _reg = /(\d{2,})x(\d{1,})/;
                    _match = _data.match(_reg);
                    try {
                        _info.dimension = _match[0];
                        _info.width = Number(_match[1]);
                        _info.height = Number(_match[2]);
                    } catch (e:Error) {


                    }
                }


                // Get fps
                if (_data.indexOf("fps") != -1) {
                    _reg = /([^,]+)fps/;
                    _match = _data.match(_reg);
                    try {
                        _info.fps = Number(_match[1]);
                    } catch (e:Error) {


                    }
                }


                // Get video bitrate
                if (_data.indexOf("Video:") != -1) {
                    _reg = /([^,]+)kb\/s/;
                    _match = _data.slice(_data.indexOf("Video:"),_data.indexOf("kb/s",_data.indexOf("Video:")) + 5).match(_reg);
                    try {
                        _info.videoBitrate = Number(_match[1]);
                    } catch (e:Error) {


                    }
                }


                // Get video Codec
                if (_data.indexOf("Video:") != -1) {
                    _reg = /Video: ([^(]+)/;
                    _match = _data.match(_reg);
                    try {
                        _info.videoCodec = _match[1];
                    } catch (e:Error) {


                    }
                }


                // Get audio Codec
                if (_data.indexOf("Audio:") != -1) {
                    _reg = /Audio: ([^(]+)/;
                    _match = _data.match(_reg);
                    try {
                        _info.audioCodec = _match[1];
                    } catch (e:Error) {


                    }
                }


                // Get audio Frequency
                if (_data.indexOf("Hz") != -1) {
                    _reg = /([^,]+)Hz/;
                    _match = _data.match(_reg);
                    try {
                        _info.audioRate = Number(_match[1]);
                    } catch (e:Error) {


                    }
                }


                // Get audio bitrate
                if (_data.indexOf("Audio:") != -1) {
                    _reg = /([^,]+)kb\/s/;
                    _match = _data.slice(_data.indexOf("Audio:"),_data.indexOf("kb/s",_data.indexOf("Audio:")) + 5).match(_reg);
                    try {
                        _info.audioBitrate = Number(_match[1]);
                    } catch (e:Error) {


                    }
                }


                _np.removeEventListener(ProgressEvent.STANDARD_ERROR_DATA, onDataRecieve);
                _np.removeEventListener(NativeProces***itEvent.EXIT, onExit);
                dispatchEvent(new Event(Event.COMPLETE));
            }


            private function onDataRecieve(e:ProgressEvent):void {
                _data += _np.standardError.readUTFBytes(_np.standardError.bytesAvailable);
            }


        }


    [COLOR=#222222][FONT=Tahoma]}[/FONT][/COLOR]
    نکته: درصورت استفاده از کلاسه NativeProcess حتما باید تنظیمات Profile مربوط به خروجی پروژه Air را فقط روی Extended Desktop تنظیم کرده باشید. در غیر اینصورت کلاسه NativeProcess قابل اجرا نخواهد بود.

    منبع: http://flashcenter.ir/blog/?p=381
     
    آخرین ویرایش: ‏17 جولای 2013
    نوشته شده توسط yaa110 در ‏17 جولای 2013
    ++Hadi++ از این پست تشکر کرده است.

به اشتراک بگذارید