0

少し問題があります.VS2010 win 7のwinFormアプリでx86にコンパイルすると、Alvas.Audioが機能しているように見えます。参考までに (c# 例: http://alvas.net/alvas.audio,tips.aspx#tip94 ) を参照してください。

 Dim data() As Byte = wr.ReadData(second * i, second)

結果は私に与えますdata.length()=0。例外はありません。フォーマットを読み取ることができ、どのリーダーを使用してもこの問題が発生しました。

編集: いくつかのテストの後、最初のステップで作成した非圧縮ファイル (.wav 拡張子を持つ PCM 形式) は、2 番目のステップの Alvas.audio ライブラリで認識できないようです。オーディオ ファイルのマークアップなどの何かが欠けているに違いありません。

ソースである可能性のあるコードは次のとおりです (基本的に、これはステップ 1 です)。

    Dim functOut As String = String.Empty
    Dim wr As Alvas.Audio.IAudioReader = Nothing
    Dim fs As IO.FileStream = Nothing
    Dim i As Integer = 0
    Dim tmpData() As Byte = Nothing
    Dim dataPCM() As Byte = Nothing
    Dim newFormat As IntPtr = IntPtr.Zero
    Try
        Select Case IO.Path.GetExtension(filename).ToLower()
            Case ".wav"
                wr = New Alvas.Audio.WaveReader(IO.File.OpenRead(filename))
                filename = IO.Path.GetTempPath & IO.Path.GetFileNameWithoutExtension(filename) & "2" & IO.Path.GetExtension(filename)
            Case ".mp3"
                wr = New Alvas.Audio.Mp3Reader(IO.File.OpenRead(filename))
            Case Else : wr = New Alvas.Audio.DsReader(filename)
        End Select

        functOut = IO.Path.ChangeExtension(filename, ".wav")

        Dim format As IntPtr = wr.ReadFormat()
        Dim formatDetail As Alvas.Audio.WaveFormat = Alvas.Audio.AudioCompressionManager.GetWaveFormat(format)


        If formatDetail.wFormatTag = Alvas.Audio.AudioCompressionManager.MpegLayer3FormatTag Then
            Alvas.Audio.AudioCompressionManager.Mp3ToWav(filename, functOut)
            Return True
        Else
            IO.File.Create(functOut).Close()
            While True
                tmpData = wr.ReadData(SECONDS * i, SECONDS)
                If tmpData Is Nothing Or tmpData.Length = 0 Then Exit While

                If formatDetail.wBitsPerSample < 16 Then
                    Alvas.Audio.AudioCompressionManager.ToPcm16Bit(format, tmpData, newFormat, dataPCM)
                Else 
                    newFormat = format
                    dataPCM = tmpData
                End If

                formatDetail = Alvas.Audio.AudioCompressionManager.GetWaveFormat(newFormat)

                fs = IO.File.Open(filename, IO.FileMode.Append, IO.FileAccess.Write)
                Using ww As New Alvas.Audio.WaveWriter(fs, Alvas.Audio.AudioCompressionManager.FormatBytes(newFormat))
                    ww.Write(dataPCM, 0, dataPCM.Length())
                End Using

                i += 1
                tmpData = Nothing
            End While
            Return True
        End If

        wr.Close()
    Catch ex As Exception
        filename = String.Empty
        Throw ex
    Finally
        fs.Close()
        wr.Close()
        filename = functOut
        GC.Collect()
    End Try

結果のストリームを書き込んで、後で再度読み取ることができるようにするにはどうすればよいですか?

どんなアイデアでも大歓迎です。

4

1 に答える 1

0

解決策を見つけました。

PCM ファイルはヘッダーなしです。そのため、保存すると、waveWriter を使用してもその行Alvas.Audio.AudioCompressionManager.FormatBytes(newFormat)は無視されました。

次の 2 つのことを行うことができます。

  • ヘッダーのないファイルを認識し、そこから読み取ることができるリーダーを見つけてください。

  • 結果のファイルをファイルシステムに書き込むことなく、コードをリファクタリングしてPCMファイルにデコードし、新しい形式(.mp3など)にエンコードします(はるかに優れています)

于 2012-05-30T15:57:53.820 に答える