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.
(18 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. | + | 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" |
+ | |||
Public Struct SF_INFO | Public Struct SF_INFO | ||
frames As Long | frames As Long | ||
samplerate As Integer | samplerate As Integer | ||
channels As Integer | channels As Integer | ||
− | + | format_ As Integer | |
sections As Integer | sections As Integer | ||
seekable As Integer | seekable As Integer | ||
End Struct | End Struct | ||
− | |||
− | |||
− | |||
Private Enum SF_STR_TITLE = 1, | Private Enum SF_STR_TITLE = 1, | ||
Riga 47: | Riga 45: | ||
− | + | Public Sub Main() | |
− | Dim nome_file As String = "''/percorso/del/file/audio''" | + | 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) | |
− | + | ver = sf_format_check(sfinfo) | |
− | + | 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 "\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." | 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." | 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." | minor = "32kbs G721 ADPCM encoding." | ||
− | + | Case "31" | |
minor = "24kbs G723 ADPCM encoding." | 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 "- <nowiki>Data</nowiki>: "; 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) | ||
+ | |||
<FONT color=gray>' ''Va in chiusura:''</font> | <FONT color=gray>' ''Va in chiusura:''</font> | ||
− | + | sf_close(infile) | |
− | + | End | |
− | |||
=Riferimenti= | =Riferimenti= | ||
− | * | + | * http://www.mega-nerd.com/libsndfile/api.html |
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