HarmonyOS鸿蒙Next中如何创建一段空白的音频或者是脉冲音频文件

HarmonyOS鸿蒙Next中怎么创建一段空白的音频或者是脉冲音频文件呢?

Android中是可以直接用代码创建一个脉冲音频,鸿蒙中能否实现呢

import android.media.AudioFormat;
import android.media.AudioTrack;

public class PulseAudioGenerator {
    private static final int SAMPLE_RATE = 44100;
    private static final int DURATION_MS = 100; // 脉冲持续时间(毫秒)
    private static final float FREQUENCY = 1000; // 脉冲频率(Hz)
    
    public static void generatePulse() {
        int numSamples = DURATION_MS * SAMPLE_RATE / 1000;
        short[] buffer = new short[numSamples];
        
        // 生成正弦波脉冲
        for (int i = 0; i < numSamples; ++i) {
            double angle = 2.0 * Math.PI * i / (SAMPLE_RATE / FREQUENCY);
            // 应用包络使声音更像脉冲
            double envelope = Math.exp(-i / (numSamples / 5.0)); // 指数衰减
            buffer[i] = (short) (Short.MAX_VALUE * Math.sin(angle) * envelope);
        }
        
        // 创建并播放AudioTrack
        AudioTrack audioTrack = new AudioTrack(
                AudioManager.STREAM_MUSIC,
                SAMPLE_RATE,
                AudioFormat.CHANNEL_OUT_MONO,
                AudioFormat.ENCODING_PCM_16BIT,
                buffer.length * 2, // 每个样本2字节
                AudioTrack.MODE_STATIC);
        
        audioTrack.write(buffer, 0, buffer.length);
        audioTrack.play();
        
        // 播放完成后释放资源
        audioTrack.setNotificationMarkerPosition(numSamples);
        audioTrack.setPlaybackPositionUpdateListener(new AudioTrack.OnPlaybackPositionUpdateListener() {
            @Override
            public void onMarkerReached(AudioTrack track) {
                track.release();
            }
            
            @Override
            public void onPeriodicNotification(AudioTrack track) {}
        });
    }
}

更多关于HarmonyOS鸿蒙Next中如何创建一段空白的音频或者是脉冲音频文件的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS Next中创建空白音频或脉冲音频,可使用AudioRenderer API。步骤如下:

  1. 创建音频参数:配置采样率(44100Hz)、声道数(2)、采样格式(SAMPLE_F32LE)
  2. 初始化AudioRenderer:指定音频流类型(STREAM_MUSIC)和参数
  3. 生成空白数据:创建全0字节数组作为静音,或生成脉冲波形数据
  4. 写入输出:调用write()方法写入数据

脉冲音频可通过算法生成特定频率的正弦波数据。示例代码使用ohos.multimedia.audio包,设置duration和bufferSize控制音频长度。

更多关于HarmonyOS鸿蒙Next中如何创建一段空白的音频或者是脉冲音频文件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中可以通过AudioRenderer API实现类似功能。以下是创建脉冲音频的示例代码:

import audio from '@ohos.multimedia.audio';

async function generatePulse() {
  const SAMPLE_RATE = 44100;
  const DURATION_MS = 100;
  const FREQUENCY = 1000;
  const numSamples = DURATION_MS * SAMPLE_RATE / 1000;

  // 1. 创建音频渲染器
  const audioRendererOptions = {
    streamInfo: {
      samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100,
      channels: audio.AudioChannel.CHANNEL_1,
      sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
      encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
    },
    rendererInfo: {
      usage: audio.StreamUsage.STREAM_USAGE_MEDIA,
      rendererFlags: 0
    }
  };

  const renderer = await audio.createAudioRenderer(audioRendererOptions);

  // 2. 生成脉冲音频数据
  const buffer = new ArrayBuffer(numSamples * 2); // 16bit=2bytes
  const dataView = new DataView(buffer);

  for (let i = 0; i < numSamples; i++) {
    const angle = 2.0 * Math.PI * i / (SAMPLE_RATE / FREQUENCY);
    const envelope = Math.exp(-i / (numSamples / 5.0));
    const value = Math.sin(angle) * envelope * 32767; // 16bit有符号最大值
    dataView.setInt16(i * 2, value, true); // 小端序
  }

  // 3. 播放音频
  await renderer.start();
  await renderer.write(buffer);

  // 4. 播放完成后释放资源
  setTimeout(async () => {
    await renderer.stop();
    await renderer.release();
  }, DURATION_MS);
}

关键点说明:

  1. 使用@ohos.multimedia.audio模块的AudioRenderer
  2. 音频参数配置与Android类似,包括采样率、声道数等
  3. 脉冲生成算法可以复用Android的实现逻辑
  4. 注意HarmonyOS中使用的是TypeScript/ArkTS语法

创建空白音频只需生成全0的buffer即可。这种方式可以实现与Android类似的脉冲音频效果。

回到顶部