Estrarre informazioni e TAG da un file audio con le funzioni esterne del API di SndFile
Da Gambas-it.org - Wikipedia.
Versione del 24 ago 2018 alle 09:48 di Vuott (Discussione | contributi)
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
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" Public Struct SF_INFO frames As Long samplerate As Integer channels As Integer formatI 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: ", Null; File.Name(nome_file) Print "Dimensione: ", Null; Stat(nome_file).Size; " byte" With sfinfo Print "Frames: ", Null; .frames Print "Frequenza:", "Hz "; .samplerate Print "Canali: ", Null; .channels Print "Dati grezzi: ", Null; .frames * .channels; " byte" If File.Ext(nome_file) = "wav" Then Print "Risoluzione: ", Null; 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) Endif End With Select Case Hex(sfinfo.formatI 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.formatI - (sfinfo.formatI 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: ", Null; major, minor Print "\nInformazioni sul brano audio:" Print "- Titolo: ", Null; sf_get_string(infile, SF_STR_TITLE) Print "- Copyright: ", Null; sf_get_string(infile, SF_STR_COPYRIGHT) Print "- Software: ", Null; sf_get_string(infile, SF_STR_SOFTWARE) Print "- Artista: ", Null; sf_get_string(infile, SF_STR_ARTIST) Print "- Commento: ", Null; sf_get_string(infile, SF_STR_COMMENT) Print "- Data: ", Null; sf_get_string(infile, SF_STR_DATE) Print "- Album: ", Null; sf_get_string(infile, SF_STR_ALBUM) Print "- Licenza: ", Null; sf_get_string(infile, SF_STR_LICENSE) Print "- Traccia: ", Null; sf_get_string(infile, SF_STR_TRACKNUMBER) Print "- Genere: ", Null; sf_get_string(infile, SF_STR_GENRE) ' Va in chiusura: sf_close(infile) End
Riferimenti
- Il sito del API di SndFile.