Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Ruby FFIモジュールチュートリアル(例:VLCでMP3を再生)

簡単な質問に答えたい…

RubyのFFIとは ?

FFIは「ForeignFunctionInterface」の略です。

これは、他のプログラミング言語で定義された関数を使用する方法です。 。

RubyのFFIモジュールを使用すると、他の方法ではアクセスできない外部ライブラリとコードにアクセスできます。

これは、Cコードを操作するためによく使用されます。

例にはが含まれます :

  • rb-inotify
  • ルビー-vips
  • ruby​​-nfc

FFIモジュールを使用して、FFIを使用する独自のプログラムを作成できます。

どのように?

いくつかのコード例を見てみましょう!

FFIの基本:関数の読み込みとインポート

作成するモジュールにFFIの機能を含めることで、FFIを操作できます。

このように

require 'ffi'

module A
  extend FFI::Library
end

次に、モジュール内で、ffi_libを使用してライブラリをロードします。 メソッド。

Windowsの「DLL」やLinuxの「SO」などのCライブラリは、プログラムが他のユーザーが使用できるようにする「シンボル」または関数定義のリストをエクスポートします。

Cの標準ライブラリである「libc」を要求しましょう。

方法は次のとおりです

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

このライブラリから特定の関数をRubyメソッドとしてインポートできます。

attach_functionを使用 メソッド。

ここに例があります

module A
  extend FFI::Library
  ffi_lib 'c'

  attach_function :strlen, [:string], :int
end

A.strlen("abc")
# 3

これはどのように機能しますか?

まず、Cにはstrlenという関数があることがわかります。 、この関数はchars *を取ります 引数として。

chars * Stringに変換されます Rubyで。

次に…

このstrlen 関数は、文字列の長さである値を返します。

つまり、attach_function 3つのパラメータを取ります:

  1. C関数の名前
  2. 引数タイプの配列
  3. 返品タイプ

ドキュメントを読んで、特定の関数がどのタイプで機能するかを確認する必要があります。

別の例の時間です!

独自のメディアプレーヤーを構築する

さまざまな興味深いライブラリを見つけることができます。

Linuxでは、ほとんどが/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"

4番目のパラメータを追加することで、これらのメソッドにカスタム名を付けることができます。

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

それならできます

VLC.get_version

今mp3を再生するには何が必要ですか?

ドキュメントを見ると、libvlc_media_player_play 関数は進むべき道のように見えます。

この機能には、メディアプレーヤーの「オブジェクト」が必要です。

メディアプレーヤーにはメディアが必要であり、メディアにはVLCインスタンスが必要です。

プロセスは次のとおりです

VLC instance -> media -> media_player -> play

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)

これにより、視覚的なインターフェイスを開かなくても音楽が再生されます。

この上に独自のWebインターフェイスを構築できます。

試してみてください!

概要

FFIの驚くべき力について学びました !言語自体の一部であるかのように外部ライブラリを使用できるようにするRubyモジュール。

より多くの人が楽しめるように、この記事を共有してください🙂

読んでくれてありがとう!


  1. Rubyでパーサーを構築する方法

    構文解析は、一連の文字列を理解し、それらを理解できるものに変換する技術です。正規表現を使用することもできますが、必ずしもその仕事に適しているとは限りません。 たとえば、HTMLを正規表現で解析することはおそらく良い考えではないことは一般的な知識です。 Rubyには、この作業を実行できるnokogiriがありますが、独自のパーサーを作成することで多くのことを学ぶことができます。始めましょう! Rubyでの解析 パーサーの中核はStringScannerです クラス。 このクラスは、文字列のコピーと位置ポインタを保持します。ポインタを使用すると、特定のトークンを検索するために文字列をトラバ

  2. 例を含むRedisGEORADIUSBYMEMBERコマンド–Redisチュートリアル

    このチュートリアルでは、特定の領域に該当するキーに格納されている地理空間値の要素を取得する方法について学習します。このために、Redis GEORADIUSBYMEMBERを使用します コマンド。 GEORADIUSBYMEMBERコマンド このコマンドは、キーに格納されている地理空間値(Sorted Set)の1つ以上のメンバーを返すために使用されます。これらのメンバーは、経度、指定されたメンバーの緯度値、および半径の引数を使用して計算された領域の境界内にあります。この面積は、指定されたメンバーの経度、緯度の値を円の中心位置として使用し、指定された単位の半径を円の半径として使用して計算