簡體   English   中英

如何將mp3轉換為pcm

[英]How to convert mp3 to pcm

mpmediaitem信息必須轉換為字節數組流以用於服務器上載。 所以下面的代碼

參考

async void SoundPickingMedia(object sender, ItemsPickedEventArgs args)
    {
        if (args.MediaItemCollection.Items != null)
            foreach (var item in args.MediaItemCollection.Items)
            {
                var settings = NSDictionary.FromObjectsAndKeys(new object[]
                {
                    NSNumber.FromUInt32((int)AudioFormatType.LinearPCM),
                    NSNumber.FromFloat(44100.0f),
                    NSNumber.FromUInt32(16),
                    NSNumber.FromUInt32(2),
                    NSNumber.FromBoolean(false),
                    NSNumber.FromBoolean(false),
                    NSNumber.FromBoolean(false)
                },
                new object[]
                {
                    AVAudioSettings.AVFormatIDKey,
                    AVAudioSettings.AVSampleRateKey,
                    AVAudioSettings.AVLinearPCMBitDepthKey,
                    AVAudioSettings.AVNumberOfChannelsKey,
                    AVAudioSettings.AVLinearPCMIsBigEndianKey,
                    AVAudioSettings.AVLinearPCMIsFloatKey,
                    AVAudioSettings.AVLinearPCMBitDepthKey,
                });

                NSError outError;
                byte[] src;
                int size = 0;
                using (var asset = new AVUrlAsset(item.AssetURL))
                using (var assetReader = new AVAssetReader(asset, out outError))
                using (var assetOutput = new AVAssetReaderTrackOutput(asset.Tracks[0], settings))
                {                     

                    if (outError != null)
                        return;

                    if (!assetReader.CanAddOutput(assetOutput))
                        return;

                    assetReader.AddOutput(assetOutput);

                    if (!assetReader.StartReading())
                        return;
                    using (var allData = new NSMutableData())
                    {
                        while (assetReader.Status != AVAssetReaderStatus.Completed)
                        {
                            using (var buffer = assetOutput.CopyNextSampleBuffer())
                            {
                                if (buffer == null)
                                    continue;
                                using (var blockbuffer = buffer.GetDataBuffer())
                                {
                                    if (blockbuffer == null)
                                        continue;
                                    size = (int)(blockbuffer.DataLength);
                                    if (size <= 0)
                                        continue;
                                    using (var data = NSMutableData.FromLength((nint)size))
                                    {
                                        var err = blockbuffer.CopyDataBytes(0, (uint)size, data.MutableBytes);
                                        if (err != CMBlockBufferError.None)
                                            continue;
                                        allData.AppendData(data);
                                    }
                                }
                            }
                        }
                        src = allData.ToArray();
                    }
                }
             }
          }

但是字節數組不播放。 我認為,您需要將pcm轉換為mp3等。xamarin如何在c#環境中轉換?

實際上,pcm數據可能效果很好。 如果pcm無法正常工作,則應重新考慮。 TT

PCM是一種編碼方案,而不是文件格式。如果要將語音轉換為mp3。我建議您使用Nuget的NAudio.Lame軟件包。

using System.IO;
using NAudio.Wave;
using NAudio.Lame;

public static class Codec
{
 // Convert WAV to MP3 using libmp3lame library
 public static void WaveToMP3(string waveFileName, string mp3FileName, int bitRate = 128)
  {
    using (var reader = new AudioFileReader(waveFileName))
    using (var writer = new LameMP3FileWriter(mp3FileName, reader.WaveFormat, bitRate))
        reader.CopyTo(writer);
  }

 // Convert MP3 file to WAV using NAudio classes only
 public static void MP3ToWave(string mp3FileName, string waveFileName)
  {
    using (var reader = new Mp3FileReader(mp3FileName))
    using (var writer = new WaveFileWriter(waveFileName, reader.WaveFormat))
        reader.CopyTo(writer);
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM