Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby FFI 모듈 튜토리얼(예:VLC로 MP3 재생)

간단한 질문에 답하고 싶습니다...

Ruby의 FFI란 무엇입니까? ?

FFI는 "외부 기능 인터페이스"를 의미합니다.

다른 프로그래밍 언어로 정의된 함수를 사용하는 방법입니다. .

Ruby의 FFI 모듈을 사용하면 다른 방법으로는 가질 수 없는 외부 라이브러리 및 코드에 액세스할 수 있습니다.

우리는 종종 이것을 C 코드로 작업하는 데 사용합니다.

예: :

  • rb-inotify
  • 루비 VIP
  • 루비-nfc

FFI 모듈의 도움으로 FFI를 사용하는 프로그램을 직접 작성할 수 있습니다.

어떻게?

몇 가지 코드 예제를 살펴보겠습니다!

FFI 기본 사항:함수 로드 및 가져오기

생성한 모듈에 기능을 포함하여 FFI와 함께 작업할 수 있습니다.

좋아요 :

'ffi'module A 확장 FFI::Libraryend 필요

그런 다음 모듈 내부에서 ffi_lib를 사용하여 라이브러리를 로드합니다. 방법.

Windows의 "DLL" 또는 Linux의 "SO"와 같은 C 라이브러리는 다른 사람이 사용할 수 있도록 프로그램에서 제공하는 "기호" 목록 또는 함수 정의를 내보냅니다.

C의 표준 라이브러리인 "libc"가 필요합니다.

방법은 다음과 같습니다. :

모듈 A 확장 FFI::Library ffi_lib 'c'end

지금 :

이 라이브러리의 특정 함수를 Ruby 메서드로 가져올 수 있습니다.

attach_function 사용 방법.

예시 :

모듈 A 확장 FFI::Library ffi_lib 'c' attach_function :strlen, [:string], :intendA.strlen("abc")# 3

어떻게 작동하나요?

먼저 C에 strlen이라는 함수가 있다는 것을 알고 있습니다. , 이 함수는 chars *를 취합니다. 주장으로.

chars * String로 변환 루비에서.

그럼...

strlen 함수는 문자열의 길이인 값을 반환합니다.

즉, attach_function 3개의 매개변수를 사용합니다:

  1. C 함수의 이름
  2. 인수 유형의 배열
  3. 반환 유형

특정 함수가 어떤 유형에 작동하는지 알아보려면 문서를 읽어야 합니다.

다른 예를 들어볼 시간입니다!

나만의 미디어 플레이어 만들기

재미있는 라이브러리를 많이 찾을 수 있습니다.

Linux에서 대부분은 /usr/lib/ 아래에 있습니다. 이름이 "lib"로 시작하고 "so" 확장자로 끝나는 디렉토리입니다.

다음과 같이 나열 :

ls /usr/lib/lib*.so

이 예에서는 VLC의 미디어 플레이어 라이브러리를 사용할 것입니다. :

/usr/lib/libvlc.so

우리의 목표는 mp3 파일을 로드하고 재생하는 것입니다!

이것부터 시작하겠습니다 :

'ffi' 모듈 VLC 확장 FFI::Library ffi_lib 'vlc' attach_function :libvlc_get_version, [], :stringend 필요

이를 통해 라이브러리가 올바르게 로드되는지 테스트한 다음 해당 버전을 인쇄할 수 있습니다.

좋아요 :

VLC.libvlc_get_version# "3.0.6 베티나리"

네 번째 매개변수를 추가하여 이러한 메소드에 사용자 정의 이름을 지정할 수 있습니다.

:

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

할 수 있습니다 :

VLC.get_version

지금 mp3를 재생하려면 무엇이 필요합니까?

설명서를 보면 libvlc_media_player_play 기능은 갈 길이 보입니다.

이 기능에는 미디어 플레이어 "개체"가 필요합니다.

미디어 플레이어에는 미디어가 필요하고 미디어에는 VLC 인스턴스가 필요합니다.

절차는 다음과 같습니다. :

VLC 인스턴스 -> 미디어 -> 미디어 플레이어 -> 재생

libVLC에 대한 문서를 읽어서 이것을 하나로 묶었습니다. .

루비의 메모리 포인터???

C에서는 객체를 찾을 수 없으며 모든 것이 메모리 포인터로 처리됩니다.

메모리 포인터는 데이터가 있는 메모리 주소입니다.

코드 예를 살펴보겠습니다. :

모듈 VLC 확장 FFI::라이브러리 ffi_lib 'vlc' attach_function :get_version, :libvlc_get_version, [], :string attach_function :new, :libvlc_new, [:int, :int], :pointerendVLC.new(0, 0) # FFI::포인터 주소=0x000055c6f04ae7b0

VLC.new를 호출한 결과 포인터를 얻습니다.

이를 필요로 하는 다른 C 함수에 전달해야 합니다.

지금 :

전체 예제 및 사용 방법.

모듈 VLC 확장 FFI::라이브러리 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], :의도

음악을 재생하기에 충분합니다. :

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(플레이어) 

시각적 인터페이스를 열지 않고 음악을 재생합니다.

이 위에 자신만의 웹 인터페이스를 구축할 수 있습니다.

시도해 보세요!

요약

FFI의 놀라운 힘에 대해 배웠습니다. ! 외부 라이브러리를 언어 자체의 일부인 것처럼 사용할 수 있게 해주는 Ruby 모듈입니다.

더 많은 분들이 볼 수 있도록 이 글을 공유해주세요 🙂

읽어주셔서 감사합니다!