Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Ruby

Ruby FFI समझाया: VLC के साथ MP3 चलाएं - एक व्यावहारिक ट्यूटोरियल

FFI बेसिक्स: फंक्शन्स लोड करना और आयात करना

आप FFI के साथ काम कर सकते हैं इसके फंक्शन्स को एक मॉड्यूल में शामिल करके जिसे आप बनाते हैं।

इस तरह:

 require 'ffi'
module A
  extend FFI::Library
end 

फिर, मॉड्यूल के अंदर, हम ffi_lib मेथड का उपयोग करके एक लाइब्रेरी लोड करने जा रहे हैं।

एक C लाइब्रेरी, जैसे विंडोज में "DLL", या लिनक्स में "SO", "सिम्बल्स" की एक सूची निर्यात करता है, या फंक्शन परिभाषाएं जो एक प्रोग्राम दूसरों के उपयोग के लिए उपलब्ध कराता है।

आइए "libc" की आवश्यकता करते हैं, C की स्टैंडर्ड लाइब्रेरी।

यहाँ कैसे:

 module A
  extend FFI::Library
  ffi_lib 'c'
end 

अब:

आप attach_function मेथड के साथ इस लाइब्रेरी से विशिष्ट फंक्शन्स को Ruby मेथड्स के रूप में आयात कर सकते हैं।

यहाँ एक उदाहरण है:

 module A
  extend FFI::Library
  ffi_lib 'c'
  attach_function :strlen, [:string], :int
end
A.strlen("abc") # 3 

यह कैसे काम करता है?

सबसे पहले, हम जानते हैं कि C में strlen नामक एक फंक्शन है, यह फंक्शन chars * को आर्गुमेंट के रूप में लेता है।

chars * Ruby में String में अनुवादित होता है।

फिर...

यह strlen फंक्शन एक मान लौटाता है, जो स्ट्रिंग की लंबाई है।

दूसरे शब्दों में, attach_function 3 पैरामीटर्स लेता है:

  1. C फंक्शन का नाम
  2. आर्गुमेंट टाइप्स की एक सरणी
  3. एक रिटर्न टाइप

आपको यह पता लगाने के लिए डॉक्यूमेंटेशन पढ़ना होगा कि एक विशेष फंक्शन किन टाइप्स के साथ काम करता है।

एक और उदाहरण के लिए समय!

अपना खुद का मीडिया प्लेयर बनाएं

आप खेलने के लिए कई दिलचस्प लाइब्रेरी ढूंढ सकते हैं।

लिनक्स में, अधिकांश /usr/lib/ डायरेक्टरी के तहत पाए जाते हैं, उनके नाम में "lib" से शुरू होकर और "so" एक्सटेंशन के साथ समाप्त होते हैं।

उन्हें इस तरह सूचीबद्ध करें:

 ls /usr/lib/lib*.so 

इस उदाहरण के लिए, हम VLC के मीडिया प्लेयर लाइब्रेरी का उपयोग करने जा रहे हैं:

 /usr/lib/libvlc.so 

हमारा लक्ष्य एक mp3 फाइल लोड करना और इसे चलाना है!

आइए इससे शुरू करें:

 require 'ffi'
module VLC
  extend FFI::Library
  ffi_lib 'vlc'
  attach_function :libvlc_get_version, [], :string
end 

यह आपको लाइब्रेरी सही ढंग से लोड हो रही है या नहीं टेस्ट करने और फिर उसका वर्जन प्रिंट करने की अनुमति देता है।

इस तरह:

 VLC.libvlc_get_version # "3.0.6 Vetinari" 

आप एक चौथा पैरामीटर जोड़कर इन मेथड्स को एक कस्टम नाम दे सकते हैं।

उदाहरण:

 attach_function :get_version, :libvlc_get_version, [], :string 

फिर आप ऐसा कर सकते हैं:

 VLC.get_version 

अब mp3 चलाने के लिए हमें क्या चाहिए?

यदि हम डॉक्यूमेंटेशन को देखते हैं, तो libvlc_media_player_play फंक्शन जाने का रास्ता लगता है।

इस फंक्शन को एक मीडिया प्लेयर "ऑब्जेक्ट" की आवश्यकता होती है।

एक मीडिया प्लेयर को एक मीडिया की आवश्यकता होती है, और एक मीडिया को एक VLC इंस्टेंस की आवश्यकता होती है।

यहाँ प्रक्रिया है:

 VLC इंस्टेंस -> मीडिया -> मीडिया_प्लेयर -> प्ले 

मैंने libVLC के लिए डॉक्यूमेंटेशन पढ़कर इसे एक साथ जोड़ा।

Ruby में मेमोरी पॉइंटर्स???

C में आपको कोई ऑब्जेक्ट्स नहीं मिलेंगे, सब कुछ मेमोरी पॉइंटर्स के साथ संभाला जाता है।

एक मेमोरी पॉइंटर डेटा के साथ एक मेमोरी एड्रेस है।

आइए एक कोड उदाहरण देखें:

 module VLC
  extend FFI::Library
  ffi_lib 'vlc'
  attach_function :get_version, :libvlc_get_version, [], :string
  attach_function :new, :libvlc_new, [:int, :int], :pointer
end
VLC.new(0, 0) # FFI::Pointer address=0x000055c6f04ae7b0 

VLC.new को कॉल करने के परिणामस्वरूप हमें एक पॉइंटर मिलता है।

हमें इसे अन्य C फंक्शन्स को पास करना होगा जिन्हें इसकी आवश्यकता है।

अब:

पूरा उदाहरण और इसका उपयोग कैसे करें।

 module VLC
  extend FFI::Library
  ffi_lib 'vlc'
  attach_function :version, :libvlc_get_version, [], :string
  attach_function :new, :libvlc_new, [:int, :int], :pointer
  attach_function :libvlc_media_new_path, [:pointer, :string], :pointer
  attach_function :libvlc_media_player_new_from_media, [:pointer], :pointer
  attach_function :play, :libvlc_media_player_play, [:pointer], :int
  attach_function :stop, :libvlc_media_player_stop, [:pointer], :int
  attach_function :pause, :libvlc_media_player_pause, [:pointer], :int
end 

यह कुछ संगीत चलाने के लिए पर्याप्त है:

 vlc = VLC.new(0, 0)
media = VLC.libvlc_media_new_path(vlc, "/home/jesus/Downloads/meditation.mp3")
player = VLC.libvlc_media_player_new_from_media(media)
VLC.play(player) 

यह बिना किसी विजुअल इंटरफेस के संगीत चलाएगा।

आप इसके ऊपर अपना खुद का वेब इंटरफेस बना सकते हैं।

इसे आज़माएं!

सारांश

आपने FFI की अद्भुत शक्ति के बारे में सीखा! एक Ruby मॉड्यूल जो आपको एक्सटर्नल लाइब्रेरीज का उपयोग करने की अनुमति देता है जैसे कि वे भाषा का हिस्सा हों।

कृपया इस आर्टिकल को शेयर करें ताकि अधिक लोग इसका आनंद ले सकें 🙂

पढ़ने के लिए धन्यवाद!


  1. गूगल TCMalloc के साथ रूबी की मेमोरी आवंटन प्रोफाइलिंग गूगल TCMalloc के साथ रूबी की मेमोरी आवंटन प्रोफाइलिंग

    रूबी में मेमोरी आवंटन कैसे काम करता है? रूबी मेमोरी को चंक्स में प्राप्त करता है, जिन्हें पेज कहा जाता है, नए ऑब्जेक्ट्स यहां सहेजे जाते हैं। फिर… जब ये पेज भर जाते हैं, तो अधिक मेमोरी की आवश्यकता होती है। रूबी malloc फंक्शन के साथ ऑपरेटिंग सिस्टम से अधिक मेमोरी का अनुरोध करता है। यह malloc फंक्शन ऑ

  1. रूबी पार्सिंग में मास्टर करें: स्क्रैच से अपना खुद का पार्सर बनाएं रूबी पार्सिंग में मास्टर करें: स्क्रैच से अपना खुद का पार्सर बनाएं

    पार्सिंग स्ट्रिंग्स के एक समूह को समझने और उन्हें किसी ऐसी चीज़ में बदलने की कला है जिसे हम समझ सकें। आप रेगुलर एक्सप्रेशन्स का उपयोग कर सकते हैं, लेकिन वे हमेशा इस काम के लिए उपयुक्त नहीं होते। उदाहरण के लिए, यह सामान्य ज्ञान है कि HTML को रेगुलर एक्सप्रेशन्स से पार्स करना शायद एक अच्छा विचार नहीं

  1. Redis GEORADIUSBYMEMBER का उपयोग: उदाहरणों के साथ व्यावहारिक गाइड Redis GEORADIUSBYMEMBER का उपयोग: उदाहरणों के साथ व्यावहारिक गाइड

    GEORADIUSBYMEMBER कमांड यह कमांड की पर संग्रहीत जियोस्पेशियल मान (सॉर्टेड सेट) के एक या अधिक मेंबर्स को लौटाने के लिए उपयोग किया जाता है, जो निर्दिष्ट मेंबर के लॉन्गिट्यूड, लैटिट्यूड मान को सर्कल के केंद्र स्थान के रूप में और निर्दिष्ट यूनिट में रेडियस को सर्कल की त्रिज्या के रूप में उपयोग करके गणना