Differenze tra le versioni di "Convertire un file OggVorbis in WAV con le funzioni esterne del API di Libvorbisidec"

Da Gambas-it.org - Wikipedia.
Riga 16: Riga 16:
  
  
Il codice Gambas potrà essere il seguente:  
+
Il codice Gambas potrà essere il seguente:
 +
Public Struct vorbis_info
 +
  version As Integer
 +
  channels As Integer
 +
  rate As Long
 +
  bitrate_upper As Long
 +
  bitrate_nominal As Long
 +
  bitrate_lower As Long
 +
  bitrate_window As Long
 +
  codec_setup As Pointer
 +
End Struct
 +
 +
 
  Library "libvorbisidec:1.0.3"
 
  Library "libvorbisidec:1.0.3"
 
   
 
   
Riga 26: Riga 38:
 
  ' ''Decode a Vorbis file within a loop.''</font>
 
  ' ''Decode a Vorbis file within a loop.''</font>
 
  Private Extern ov_read(vfP As Pointer, buffer As Byte[], length As Integer, bitstream As Pointer) As Long
 
  Private Extern ov_read(vfP As Pointer, buffer As Byte[], length As Integer, bitstream As Pointer) As Long
 +
 +
<FONT color=gray>' ''vorbis_info *ov_info(OggVorbis_File *vf,int link)''
 +
' ''Returns the vorbis_info struct for the specified bitstream.''</font>
 +
Private Extern ov_info(vfP As Pointer, linkI As Integer) As Vorbis_info
 +
 +
<FONT color=gray>' ''ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i)''
 +
' ''Returns the total pcm samples of the physical bitstream or a specified logical bitstream.
 +
Private Extern ov_pcm_total(vfP As Pointer, i As Integer) As Long
 
   
 
   
 
   
 
   
Riga 56: Riga 76:
 
   Shell "gcc -o /tmp/libadhoc.so " & Application.Path &/ "libadhoc.c -shared" Wait
 
   Shell "gcc -o /tmp/libadhoc.so " & Application.Path &/ "libadhoc.c -shared" Wait
 
    
 
    
   fin = fopen("/home/ploppo/Scrivania/LINUX/Hydrate-Kenny_Beltrey.ogg", "rb")
+
   fin = fopen("''/percorso/del/file.ogg''", "rb")
 
   
 
   
 
   f = Open filefinaleWAV For Create
 
   f = Open filefinaleWAV For Create
Riga 64: Riga 84:
 
   err = ov_open(fin, vf, Null, 0)
 
   err = ov_open(fin, vf, Null, 0)
 
   If err < 0 Then Error.Raise("Il file caricato potrebbe non essere del formato Ogg !")
 
   If err < 0 Then Error.Raise("Il file caricato potrebbe non essere del formato Ogg !")
 +
 +
<FONT color=gray>' ''Estrae alcune informazioni generali del file audio Ogg caricato:''</font>
 
    
 
    
 
  <FONT color=gray>' ''Ciclo per la decodifica dei dati Ogg e per la scrittura del file contenente i dati grezzi PCM:''</font>
 
  <FONT color=gray>' ''Ciclo per la decodifica dei dati Ogg e per la scrittura del file contenente i dati grezzi PCM:''</font>

Versione delle 21:25, 24 apr 2014

La libreria Libvorbisidec (Tremor) intende essere il più possibile simile alla libreria Vorbisfile distribuita gratuitamente da Xiph.org . Essa fornisce una libreria di solo numeri interi destinati alla decodifica di tutti i formati di file Vorbis attuali e futuri.


Per poter fruire delle risorse del API di Libvorbisidec si dovrà utilizzare la libreria (nella sua attuale versione): "libvorbisidec.so.1.0.3"


Di seguito mostreremo un semplice codice per convertire un file OggVorbis in file WAV. Poiché l'uso della libreria esterna Libvorbisidec prevede il richiamo di una complessa Struttura esterna, ed al fine di poter gestire detta Struttura esterna in modo assolutamente sicuro, ci serviremo di una libreria esterna scritta in C, che realizzeremo ad hoc e che richiameremo all'interno del codice Gambas:

#include <stdio.h>
#include "tremor/ivorbisfile.h"


int Dim_OggVorbis_File() {
  return sizeof(OggVorbis_File);
}

Tale codice in linguaggio C in questo esempio sarà posto nella cartella Dati dell'applicativo Gambas, e andrà poi trasformato in una libreria condivisa .so , che - come già accennato - sarà richiamata nel codice Gambas.


Il codice Gambas potrà essere il seguente:

Public Struct vorbis_info
  version As Integer
  channels As Integer
  rate As Long
  bitrate_upper As Long
  bitrate_nominal As Long
  bitrate_lower As Long
  bitrate_window As Long
  codec_setup As Pointer
End Struct


Library "libvorbisidec:1.0.3"

' int ov_open(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes)
' Open and initialize an OggVorbis_File structure.
Private Extern ov_open(f As Pointer, vfP As Pointer, initial As String, ibytes As Long) As Integer

' long ov_read(OggVorbis_File *vf,char *buffer,int length, int *bitstream)
' Decode a Vorbis file within a loop.
Private Extern ov_read(vfP As Pointer, buffer As Byte[], length As Integer, bitstream As Pointer) As Long

' vorbis_info *ov_info(OggVorbis_File *vf,int link)
' Returns the vorbis_info struct for the specified bitstream.
Private Extern ov_info(vfP As Pointer, linkI As Integer) As Vorbis_info

' ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i)
' Returns the total pcm samples of the physical bitstream or a specified logical bitstream. 
Private Extern ov_pcm_total(vfP As Pointer, i As Integer) As Long


Library "libc:6"

' FILE *fopen(const char *path, const char *mode)
' Apre il file path associandolo ad uno stream.
Private Extern fopen(path As String, mode As String) As Pointer

' int fclose(FILE *stream)
' Chiude il file associato a stream.
Private Extern fclose(stmP As Pointer) As Integer


Library "/tmp/libadhoc"

Private Extern Dim_OggVorbis_File() As Integer


Public Sub Main()

 Dim vf, fin As Pointer
 Dim eo, current_section, err As Integer
 Dim ret As Long
 Dim filefinaleWAV As String = "/tmp/datiPCMgrezzi"
 Dim pcmout As New Byte[](4096)
 Dim f As File

' Creiamo la libreria ad hoc per la gestione "sicura" della Struttura "OggVorbis_File":
  Shell "gcc -o /tmp/libadhoc.so " & Application.Path &/ "libadhoc.c -shared" Wait
 
  fin = fopen("/percorso/del/file.ogg", "rb")

  f = Open filefinaleWAV For Create
 
  vf = Alloc(Dim_OggVorbis_File())
 
  err = ov_open(fin, vf, Null, 0)
  If err < 0 Then Error.Raise("Il file caricato potrebbe non essere del formato Ogg !")

' Estrae alcune informazioni generali del file audio Ogg caricato:
 
' Ciclo per la decodifica dei dati Ogg e per la scrittura del file contenente i dati grezzi PCM:
  While Not eo
    ret = ov_read(vf, pcmout, pcmout.Count, VarPtr(current_section))
    If ret = 0 Then
      eo = 1
    Else
' Scrive il file contenente i dati grezzi PCM:
      pcmout.Write(f, 0, ret)
    Endif
  Wend
 
' Va a creare il file WAV finale:
  crea_file_wav(filefinaleWAV)


' Va in chiusura:
  Free(vf)
  f.Close
  fclose(fin)

End


Private Procedure crea_file_wav(audioWAV As String)
 
 Dim fl, fwav As File
 Dim dati As New Byte[](Stat(audioWAV).Size)
 Dim bh As Byte[] = [&52, &49, &46, &46, &00, &00, &00, &00, &57, &41, &56, &45, &66, &6D, &74, &20, &10, &00, &00, &00, &01, &00, &02, &00,
                   &44, &AC, &00, &00, &10, &B1, &02, &00, &04, &00, &10, &00, &64, &61, &74, &61, &00, &00, &00, &00]    ' blocco d'intestazione del file wav futuro: 2 canali, 16 bit, hz 44100
                   

  fl = Open audioWAV For Read Write
  dati.Read(fl)
  fl.Close
     
  bh.Insert(dati, 44)

  fwav = Open "/tmp/fileAudio.wav" For Create

' Inizia la scrittura del file wav:
  bh.Write(fwav, 0, bh.Count)
   
  dati.Clear
  bh.Clear
  fl.Close
  fwav.Close
 
End


Riferimenti

[1] L'API di Tremor-Libvorbisidec