audio - 使用 FFMPEG 将 ID 变成独特的声音

标签 audio ffmpeg

我想使用 FFMPEG 将我的 UUID 变成独特的声音,但我不确定如何做到这一点。

所以现在我的 UUID 看起来像这样:'1e859915-bcdf-4862-8af2-bb43f04e2158'

就像 UUID 是唯一的一样,我想让它们都变成唯一的 1-2 秒音频文件。 FFMPEG 可以做到这一点还是有不同的路线? FFMPEG 中的 SINE 函数会做什么还是其他什么?

最佳答案

这里尝试将 GUID 中的每个半字节转换为 A4-C6 范围内的音调。 .

它在 WAVE 中输出无符号 8 位 PCM , 没有 ffmpeg必需的。该代码仅用于说明目的,请随意添加适当的验证等。

#include <stdio.h>
#include <inttypes.h>
#include <math.h>

int main(void) {
    FILE* out;
    int duration = 2; // [s]
    int32_t rate = 44100; // [Hz]
    uint8_t guid[] = {0x1e, 0x85, 0x99, 0x15, 0xbc, 0xdf, 0x48, 0x62, 0x8a, 0xf2, 0xbb, 0x43, 0xf0, 0x4e, 0x21, 0x58};
    int32_t samples_per_nibble = (float) duration / 32 * rate;
    int32_t total_samples = samples_per_nibble * 32;
    int16_t c16;
    int32_t c32;

    if ((out = fopen("test.wav", "wb")) == NULL) {
        return 1;
    }

    // WAV header
    // ChunkID
    fputs("RIFF", out);
    // ChunkSize
    c32 = 36 + total_samples;
    fwrite(&c32, 4, 1, out);
    // Format
    fputs("WAVE", out);
    // Subchunk1ID
    fputs("fmt ", out);
    // Subchunk1Size
    c32 = 16;
    fwrite(&c32, 4, 1, out);
    // AudioFormat
    c16 = 1;
    fwrite(&c16, 2, 1, out);
    // NumChannels
    c16 = 1;
    fwrite(&c16, 2, 1, out);
    // SampleRate
    c32 = rate;
    fwrite(&c32, 4, 1, out);
    // ByteRate
    c32 = rate;
    fwrite(&c32, 4, 1, out);
    // BlockAlign
    c16 = 1;
    fwrite(&c16, 2, 1, out);
    // BitsPerSample
    c16 = 8;
    fwrite(&c16, 2, 1, out);
    // Subchunk2ID
    fputs("data", out);
    // Subchunk2Size
    c32 = total_samples;
    fwrite(&c32, 4, 1, out);

    // Data
    for (int b = 0; b < 16; b++) {
        // for each byte in the GUID
        for (int n = 0; n < 2; n++) {
            // for each nibble
            uint8_t nibble = (n ? guid[b] >> 4 : guid[b]) & 0x0f;
            // go nibble steps above A4
            float frequency = 440.0 * pow(1.059463094359, nibble);
            // write the samples
            for (int s = 0; s < samples_per_nibble; s++) {
                int sample = (sin(frequency * 2 * M_PI * s / rate) + 1) * 0.5 * 255;
                fputc(sample, out);
            }
        }
    }

    fclose(out);
    return 0;
}

关于audio - 使用 FFMPEG 将 ID 变成独特的声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40305236/

相关文章:

android - 在fft中应用窗口功能的正确方法

.net - 2 个视频的 FFMPEG 覆盖问题,第二个输入中缺少声音

ios - 尝试使用 Swift AVPlayer 播放音频

audio - Gmod-Lua错误- 'Attempting to index field ' GM'(零值)

c# - 如何正确地将字符串传递给ffmpeg?

javascript - 如果我在 Windows 控制台中传递此代码,它可以工作,但是当我在 node.js 代码中模拟 Windows 控制台时,它不起作用,并返回不清楚的错误

javascript - 在流式传输 Node js 时写入 wav 文件

bash - 使用 ffmpeg 创建视频时处理丢失的帧

ffmpeg - 并排加入视频

windows - 在过滤器 Parsed_concat_0 上找不到未标记输入垫 1 的匹配流