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

yaa110

کاربر فعال
منبع: 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 هم بسازید.
کد:
[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) در نظر بگیرید.
کد:
var _args:Vector.<String> = new Vector.<String>();

4. آرگومان های قابل اجرا توسط ffmpeg.exe را به vector اضافه کنید (لیست کاملی از آرگومان ها). توجه کنید که به جای عبارت _path باید آدرس فایل مدیا نوشته شود (مثلا "C:/flashcenter.wmv").
کد:
_args.push("-i", _path);

5. آدرس فایل مورد نظر را به NativeProcessStartupInfo معرفی کنید. برای اینکار از کلاسه File استفاده می کنیم.
کد:
_npi.executable = File.applicationDirectory.resolvePath("ffmpeg32/bin/ffmpeg.exe");

6. آرگومان های تعریف شده را به NativeProcessStartupInfo پیوست کنید.
کد:
_npi.arguments = _args;

7. در ادامه برای دریافت اطلاعات از ffmpeg یک EventListener از نوع ProgressEvent.STANDARD_ERROR_DATA و برای اطلاع از زمان اتمام دریافت اطلاعات یک EventListener دیگر از نوع NativeProces***itEvent.EXIT تعریف کنید.
کد:
[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 فراخوانی می شود را به صورت زیر تعریف کنید.
کد:
[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 هستند.

کد:
[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 دارید. بعنوان مثال، یک کلاسه دریافت اطلاعات فایل مدیا و استخراج داده های مختلف در زیر آمده است:
کد:
[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
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا