Differenze tra le versioni di "Estrarre informazioni e TAG da un file audio con le funzioni esterne del API di SndFile"

Da Gambas-it.org - Wikipedia.
 
(10 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
 
'''SndFile''' è una libreria, scritta in C, per leggere e scrivere file che contengono suono campionato attraverso una libreria interfaccia standard.
 
'''SndFile''' è una libreria, scritta in C, per leggere e scrivere file che contengono suono campionato attraverso una libreria interfaccia standard.
  
Per poter usufruire delle risorse di ''SndFile'', è necessario avere installata la libreria (nella sua attuale versione): ''libsndfile.so.1.0.28''
+
Per poter usufruire delle risorse di ''SndFile'', è necessario avere installata la libreria (nella sua attuale versione): "''libsndfile.so.1.0.37'' ".
  
 
+
Mostreremo di seguito un semplice codice per estrarre informazioni generali e TAG, qualora possibile, da un file audio (<SPAN Style="text-decoration:underline">non MP3</span> !) con le funzioni esterne del API di ''SndFile'':
Mostreremo di seguito un semplice codice per estrarre informazioni generali e TAG, qualora possibile, da un file audio con le funzioni esterne del API di ''SndFile'':
+
  Library "libsndfile:1.0.37"
  Library "libsndfile:1"
 
 
   
 
   
 
  Public Struct SF_INFO
 
  Public Struct SF_INFO
Riga 11: Riga 10:
 
   samplerate As Integer
 
   samplerate As Integer
 
   channels As Integer   
 
   channels As Integer   
   formatI As Integer
+
   format_ As Integer
 
   sections As Integer
 
   sections As Integer
 
   seekable As Integer
 
   seekable As Integer
Riga 46: Riga 45:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
   Dim nome_file As String = "<FONT color=gray>''/percorso/del/file/audio''</font>"
+
   Dim nome_file As String = "<FONT color=darkgreen>''/percorso/del/file/audio''</font>"
 
   Dim infile As Pointer
 
   Dim infile As Pointer
 
   Dim ver As Boolean
 
   Dim ver As Boolean
 
   Dim sfinfo As New SF_INFO
 
   Dim sfinfo As New SF_INFO
 
   Dim major, minor As String
 
   Dim major, minor As String
 
 
   
 
   
 
  <FONT color=gray>' ''Apre il file audio:''</font>
 
  <FONT color=gray>' ''Apre il file audio:''</font>
  infile = sf_open(nome_file, SFM_READ, sfinfo)
+
  infile = sf_open(nome_file, SFM_READ, sfinfo)
 
        
 
        
  ver = sf_format_check(sfinfo)
+
  ver = sf_format_check(sfinfo)
  If ver = False Then Error.Raise("Errore nella raccolta delle informazioni dal file audio !")
+
  If ver == False Then Error.Raise("Errore nella raccolta delle informazioni dal file audio !")
 
    
 
    
 
  <FONT color=gray>' ''Ricava alcune informazioni dal file audio:''</font>
 
  <FONT color=gray>' ''Ricava alcune informazioni dal file audio:''</font>
  Print "== Informazioni del file audio =="
+
  Print "== Informazioni del file audio =="
  Print "\nNome file: ", Null; File.Name(nome_file)
+
  Print "\nNome file:   "; File.Name(nome_file)
  Print "Dimensione: ", Null; Stat(nome_file).Size; " byte"
+
  Print "Dimensione:   "; Stat(nome_file).Size; " byte"
  With sfinfo
+
  With sfinfo
    Print "Frames: ", Null; .frames
+
    Print "Frames:       "; .frames
    Print "Frequenza:", "Hz "; .samplerate
+
    Print "Frequenza:   "; .samplerate; " hertz"
    Print "Canali: ", Null; .channels
+
    Print "Canali:       "; .channels
    Print "Dati grezzi: ", Null; .frames * .channels; " byte"
+
    Print "Dati grezzi: "; .frames * .channels; " byte"
    If File.Ext(nome_file) = "wav" Then
+
    If File.Ext(nome_file) = "wav" Then
      Print "Risoluzione: ", Null; Fix(Stat(nome_file).Size / .frames / .channels * 8); " bit"
+
      Print "Risoluzione: "; Fix(Stat(nome_file).Size / .frames / .channels * 8); " bit"
      Print "Durata: ", Null; Date(0, 0, 0, 0, 0, 0, (Stat(nome_file).Size * 8) / (.samplerate * Fix(Stat(nome_file).Size / .frames / .channels * 8) * .channels) * 1000)
+
      Print "Durata:       "; Time(0, 0, 0, (Stat(nome_file).Size * 8) / (.samplerate * Fix(Stat(nome_file).Size / .frames / .channels * 8) * .channels) * 1000)
    Endif
+
    Endif
  End With
+
  End With
 
      
 
      
  Select Case Hex(sfinfo.formatI And &FFF0000&)
+
  Select Case Hex(sfinfo.format_ And &FFF0000&)
    Case "10000"
+
    Case "10000"
      major = "Microsoft WAV format (little endian default)."
+
      major = "Microsoft WAV format (little endian default)."
    Case "20000"
+
    Case "20000"
      major = "Apple/SGI AIFF format (big endian)."
+
      major = "Apple/SGI AIFF format (big endian)."
    Case "30000"
+
    Case "30000"
        major = "Sun/NeXT AU format (big endian)."
+
      major = "Sun/NeXT AU format (big endian)."
    Case "40000"
+
    Case "40000"
 
       major = "RAW PCM data."
 
       major = "RAW PCM data."
      Case "50000"
+
    Case "50000"
      major = "Ensoniq PARIS file format."
+
      major = "Ensoniq PARIS file format."
    Case "60000"
+
    Case "60000"
      major = "Amiga IFF / SVX8 / SV16 format."
+
      major = "Amiga IFF / SVX8 / SV16 format."
    Case "70000"
+
    Case "70000"
 
       major = "Sphere NIST format."
 
       major = "Sphere NIST format."
    Case "80000"
+
    Case "80000"
      major = "VOC files."
+
      major = "VOC files."
    Case "A0000"
+
    Case "A0000"
      major = "Berkeley/IRCAM/CARL"
+
      major = "Berkeley/IRCAM/CARL"
    Case "B0000"
+
    Case "B0000"
      major = "Sonic Foundry's 64 bit RIFF/WAV"
+
      major = "Sonic Foundry's 64 bit RIFF/WAV"
    Case "C0000"
+
    Case "C0000"
      major = "Matlab (tm) V4.2 / GNU Octave 2.0"
+
      major = "Matlab (tm) V4.2 / GNU Octave 2.0"
    Case "D0000"
+
    Case "D0000"
      major = "Matlab (tm) V5.0 / GNU Octave 2.1"
+
      major = "Matlab (tm) V5.0 / GNU Octave 2.1"
    Case "E0000"
+
    Case "E0000"
      major = "Portable Voice Format"
+
      major = "Portable Voice Format"
    Case "F0000"
+
    Case "F0000"
      major = "Fasttracker 2 Extended Instrument"
+
      major = "Fasttracker 2 Extended Instrument"
    Case "100000"
+
    Case "100000"
      major = "HMM Tool Kit format"
+
      major = "HMM Tool Kit format"
    Case "110000"
+
    Case "110000"
      major = "Midi Sample Dump Standard"
+
      major = "Midi Sample Dump Standard"
    Case "120000"
+
    Case "120000"
      major = "Audio Visual Research"
+
      major = "Audio Visual Research"
    Case "130000"
+
    Case "130000"
      major = "MS WAVE with WAVEFORMATEX"
+
      major = "MS WAVE with WAVEFORMATEX"
    Case "160000"
+
    Case "160000"
      major = "Sound Designer 2"
+
      major = "Sound Designer 2"
    Case "170000"
+
    Case "170000"
      major = "FLAC lossless file format"
+
      major = "FLAC lossless file format"
    Case "180000"
+
    Case "180000"
      major = "Core Audio File format"
+
      major = "Core Audio File format"
    Case "190000"
+
    Case "190000"
      major = "Psion WVE format"
+
      major = "Psion WVE format"
    Case "200000"
+
    Case "200000"
      major = "Xiph OGG container"
+
      major = "Xiph OGG container"
    Case "210000"
+
    Case "210000"
      major = "Akai MPC 2000 sampler"
+
      major = "Akai MPC 2000 sampler"
    Case "220000"
+
    Case "220000"
      major = "RF64 WAV file"
+
      major = "RF64 WAV file"
  End Select
+
  End Select
 
    
 
    
  Select Case Hex(sfinfo.formatI - (sfinfo.formatI And &FFF0000&), 2)
+
  Select Case Hex(sfinfo.format_ - (sfinfo.format_ And &FFF0000&), 2)
    Case "01"
+
    Case "01"
      minor = "Signed 8 bit data"
+
      minor = "Signed 8 bit data"
      Case "02"
+
    Case "02"
      minor = "Signed 16 bit data"
+
      minor = "Signed 16 bit data"
    Case "03"
+
    Case "03"
      minor = "Signed 24 bit data"
+
      minor = "Signed 24 bit data"
    Case "04"
+
    Case "04"
      minor = "Signed 32 bit data"
+
      minor = "Signed 32 bit data"
    Case "05"
+
    Case "05"
      minor = "Unsigned 8 bit data (WAV and RAW only)"
+
      minor = "Unsigned 8 bit data (WAV and RAW only)"
    Case "06"
+
    Case "06"
        minor = "32 bit float data"
+
      minor = "32 bit float data"
    Case "07"
+
    Case "07"
      minor = "64 bit float data"
+
      minor = "64 bit float data"
      Case "10"
+
    Case "10"
      minor = "U-Law encoded."
+
      minor = "U-Law encoded."
    Case "11"
+
    Case "11"
        minor = "A-Law encoded."
+
      minor = "A-Law encoded."
    Case "12"
+
    Case "12"
      minor = "IMA ADPCM."
+
      minor = "IMA ADPCM."
    Case "13"
+
    Case "13"
      minor = "Microsoft ADPCM."
+
      minor = "Microsoft ADPCM."
    Case "20"
+
    Case "20"
      minor = "GSM 6.10 encoding."
+
      minor = "GSM 6.10 encoding."
    Case "21"
+
    Case "21"
      minor = "OKI / Dialogix ADPCM"
+
      minor = "OKI / Dialogix ADPCM"
    Case "30"
+
    Case "30"
 
       minor = "32kbs G721 ADPCM encoding."
 
       minor = "32kbs G721 ADPCM encoding."
    Case "31"
+
    Case "31"
 
       minor = "24kbs G723 ADPCM encoding."
 
       minor = "24kbs G723 ADPCM encoding."
    Case "32"
+
    Case "32"
      minor = "40kbs G723 ADPCM encoding."
+
      minor = "40kbs G723 ADPCM encoding."
    Case "40"
+
    Case "40"
      minor = "12 bit Delta Width Variable Word encoding."
+
      minor = "12 bit Delta Width Variable Word encoding."
    Case "41"
+
    Case "41"
      minor = "16 bit Delta Width Variable Word encoding."
+
      minor = "16 bit Delta Width Variable Word encoding."
    Case "42"
+
    Case "42"
      minor = "24 bit Delta Width Variable Word encoding."
+
      minor = "24 bit Delta Width Variable Word encoding."
    Case "43"
+
    Case "43"
      minor = "N bit Delta Width Variable Word encoding."
+
      minor = "N bit Delta Width Variable Word encoding."
    Case "50"
+
    Case "50"
      minor = "8 bit differential PCM (XI only)"
+
      minor = "8 bit differential PCM (XI only)"
    Case "51"
+
    Case "51"
      minor = "16 bit differential PCM (XI only)"
+
      minor = "16 bit differential PCM (XI only)"
    Case "60"
+
    Case "60"
      minor = "Xiph Vorbis encoding."
+
      minor = "Xiph Vorbis encoding."
  End Select
+
  End Select
 
      
 
      
  Print "Formato file: "; major, minor
+
  Print "Formato file: "; major, minor
 
      
 
      
  Print "\nInformazioni sul brano audio:"
+
  Print "\nInformazioni sul brano audio:"
  Print "- Titolo:    "; sf_get_string(infile, SF_STR_TITLE)
+
  Print "- Titolo:    "; sf_get_string(infile, SF_STR_TITLE)
  Print "- Copyright: "; sf_get_string(infile, SF_STR_COPYRIGHT)
+
  Print "- Copyright: "; sf_get_string(infile, SF_STR_COPYRIGHT)
  Print "- Software:  "; sf_get_string(infile, SF_STR_SOFTWARE)
+
  Print "- Software:  "; sf_get_string(infile, SF_STR_SOFTWARE)
  Print "- Artista:  "; sf_get_string(infile, SF_STR_ARTIST)
+
  Print "- Artista:  "; sf_get_string(infile, SF_STR_ARTIST)
  Print "- Commento:  "; sf_get_string(infile, SF_STR_COMMENT)
+
  Print "- Commento:  "; sf_get_string(infile, SF_STR_COMMENT)
  Print "- Date:      "; sf_get_string(infile, SF_STR_DATE)
+
  Print "- <nowiki>Data</nowiki>:      "; sf_get_string(infile, SF_STR_DATE)
  Print "- Album:    "; sf_get_string(infile, SF_STR_ALBUM)
+
  Print "- Album:    "; sf_get_string(infile, SF_STR_ALBUM)
  Print "- Licenza:  "; sf_get_string(infile, SF_STR_LICENSE)
+
  Print "- Licenza:  "; sf_get_string(infile, SF_STR_LICENSE)
  Print "- Traccia:  "; sf_get_string(infile, SF_STR_TRACKNUMBER)
+
  Print "- Traccia:  "; sf_get_string(infile, SF_STR_TRACKNUMBER)
  Print "- Genere:    "; sf_get_string(infile, SF_STR_GENRE)
+
  Print "- Genere:    "; sf_get_string(infile, SF_STR_GENRE)
 
+
 
 
  <FONT color=gray>' ''Va in chiusura:''</font>
 
  <FONT color=gray>' ''Va in chiusura:''</font>
  sf_close(infile)
+
  sf_close(infile)
 
    
 
    
  '''End'''
+
  End
 
 
  
  

Versione attuale delle 17:37, 13 gen 2024

SndFile è una libreria, scritta in C, per leggere e scrivere file che contengono suono campionato attraverso una libreria interfaccia standard.

Per poter usufruire delle risorse di SndFile, è necessario avere installata la libreria (nella sua attuale versione): "libsndfile.so.1.0.37 ".

Mostreremo di seguito un semplice codice per estrarre informazioni generali e TAG, qualora possibile, da un file audio (non MP3 !) con le funzioni esterne del API di SndFile:

Library "libsndfile:1.0.37"

Public Struct SF_INFO
  frames As Long
  samplerate As Integer
  channels As Integer  
  format_ As Integer
  sections As Integer
  seekable As Integer
End Struct

Private Enum SF_STR_TITLE = 1,
             SF_STR_COPYRIGHT,
             SF_STR_SOFTWARE,
             SF_STR_ARTIST,
             SF_STR_COMMENT,
             SF_STR_DATE,
             SF_STR_ALBUM,
             SF_STR_LICENSE,
             SF_STR_TRACKNUMBER,
             SF_STR_GENRE = 16

Private Const SFM_READ As Byte = 16

' SNDFILE * sf_open (const char *path, int mode, SF_INFO *sfinfo)
' Open the specified file for read, write or both.
Private Extern sf_open(path As String, mode As Integer, SFinf As SF_INFO) As Pointer

' int sf_format_check  (const SF_INFO *info)
' Return TRUE if fields of the SF_INFO struct are a valid combination of values.
Private Extern sf_format_check(infoStr As SF_INFO) As Boolean

' const char* sf_get_string (SNDFILE *sndfile, int str_type)
' Retrieves and setting string data within sound files.
Private Extern sf_get_string(sndfile As Pointer, str_type As Integer) As String

' int  sf_close  (SNDFILE *sndfile)
' Close the SNDFILE and clean up all memory allocations associated with this file.
Private Extern sf_close(sndfile As Pointer) As Integer


Public Sub Main()
 
 Dim nome_file As String = "/percorso/del/file/audio"
 Dim infile As Pointer
 Dim ver As Boolean
 Dim sfinfo As New SF_INFO
 Dim major, minor As String

' Apre il file audio:
 infile = sf_open(nome_file, SFM_READ, sfinfo)
     
 ver = sf_format_check(sfinfo)
 If ver == False Then Error.Raise("Errore nella raccolta delle informazioni dal file audio !")
  
' Ricava alcune informazioni dal file audio:
 Print "== Informazioni del file audio =="
 Print "\nNome file:    "; File.Name(nome_file)
 Print "Dimensione:   "; Stat(nome_file).Size; " byte"
 With sfinfo
   Print "Frames:       "; .frames
   Print "Frequenza:    "; .samplerate; " hertz"
   Print "Canali:       "; .channels
   Print "Dati grezzi:  "; .frames * .channels; " byte"
   If File.Ext(nome_file) = "wav" Then
     Print "Risoluzione:  "; Fix(Stat(nome_file).Size / .frames / .channels * 8); " bit"
     Print "Durata:       "; Time(0, 0, 0, (Stat(nome_file).Size * 8) / (.samplerate * Fix(Stat(nome_file).Size / .frames / .channels * 8) * .channels) * 1000)
   Endif
 End With
    
 Select Case Hex(sfinfo.format_ And &FFF0000&)
   Case "10000"
     major = "Microsoft WAV format (little endian default)."
   Case "20000"
     major = "Apple/SGI AIFF format (big endian)."
   Case "30000"
     major = "Sun/NeXT AU format (big endian)."
   Case "40000"
     major = "RAW PCM data."
   Case "50000"
     major = "Ensoniq PARIS file format."
   Case "60000"
     major = "Amiga IFF / SVX8 / SV16 format."
   Case "70000"
     major = "Sphere NIST format."
   Case "80000"
     major = "VOC files."
   Case "A0000"
     major = "Berkeley/IRCAM/CARL"
   Case "B0000"
     major = "Sonic Foundry's 64 bit RIFF/WAV"
   Case "C0000"
     major = "Matlab (tm) V4.2 / GNU Octave 2.0"
   Case "D0000"
     major = "Matlab (tm) V5.0 / GNU Octave 2.1"
   Case "E0000"
     major = "Portable Voice Format"
   Case "F0000"
     major = "Fasttracker 2 Extended Instrument"
   Case "100000"
     major = "HMM Tool Kit format"
   Case "110000"
     major = "Midi Sample Dump Standard"
   Case "120000"
     major = "Audio Visual Research"
   Case "130000"
     major = "MS WAVE with WAVEFORMATEX"
   Case "160000"
     major = "Sound Designer 2"
   Case "170000"
     major = "FLAC lossless file format"
   Case "180000"
     major = "Core Audio File format"
   Case "190000"
     major = "Psion WVE format"
   Case "200000"
     major = "Xiph OGG container"
   Case "210000"
     major = "Akai MPC 2000 sampler"
   Case "220000"
     major = "RF64 WAV file"
 End Select
  
 Select Case Hex(sfinfo.format_ - (sfinfo.format_ And &FFF0000&), 2)
   Case "01"
     minor = "Signed 8 bit data"
   Case "02"
     minor = "Signed 16 bit data"
   Case "03"
     minor = "Signed 24 bit data"
   Case "04"
     minor = "Signed 32 bit data"
   Case "05"
     minor = "Unsigned 8 bit data (WAV and RAW only)"
   Case "06"
     minor = "32 bit float data"
   Case "07"
     minor = "64 bit float data"
   Case "10"
     minor = "U-Law encoded."
   Case "11"
     minor = "A-Law encoded."
   Case "12"
     minor = "IMA ADPCM."
   Case "13"
     minor = "Microsoft ADPCM."
   Case "20"
     minor = "GSM 6.10 encoding."
   Case "21"
     minor = "OKI / Dialogix ADPCM"
   Case "30"
     minor = "32kbs G721 ADPCM encoding."
   Case "31"
     minor = "24kbs G723 ADPCM encoding."
   Case "32"
     minor = "40kbs G723 ADPCM encoding."
   Case "40"
     minor = "12 bit Delta Width Variable Word encoding."
   Case "41"
     minor = "16 bit Delta Width Variable Word encoding."
   Case "42"
     minor = "24 bit Delta Width Variable Word encoding."
   Case "43"
     minor = "N bit Delta Width Variable Word encoding."
   Case "50"
     minor = "8 bit differential PCM (XI only)"
   Case "51"
     minor = "16 bit differential PCM (XI only)"
   Case "60"
     minor = "Xiph Vorbis encoding."
 End Select
   
 Print "Formato file: "; major, minor
   
 Print "\nInformazioni sul brano audio:"
 Print "- Titolo:    "; sf_get_string(infile, SF_STR_TITLE)
 Print "- Copyright: "; sf_get_string(infile, SF_STR_COPYRIGHT)
 Print "- Software:  "; sf_get_string(infile, SF_STR_SOFTWARE)
 Print "- Artista:   "; sf_get_string(infile, SF_STR_ARTIST)
 Print "- Commento:  "; sf_get_string(infile, SF_STR_COMMENT)
 Print "- Data:      "; sf_get_string(infile, SF_STR_DATE)
 Print "- Album:     "; sf_get_string(infile, SF_STR_ALBUM)
 Print "- Licenza:   "; sf_get_string(infile, SF_STR_LICENSE)
 Print "- Traccia:   "; sf_get_string(infile, SF_STR_TRACKNUMBER)
 Print "- Genere:    "; sf_get_string(infile, SF_STR_GENRE)
 
' Va in chiusura:
 sf_close(infile)
 
End


Riferimenti