2016-10-28 2 views
0

FFMPEG를 사용하여 UUID를 고유 한 사운드로 바꾸고 싶지만이를 수행하는 방법이 확실하지 않습니다.ID를 FFMPEG로 고유 한 사운드로 변환

그래서 지금 내가 UUID를 다음과 같이한다 : '1e859915는-bcdf-4862-8af2-bb43f04e2158'

이 UUID처럼, 나는 독특한 1~2초 오디오 파일로 모든 각을 만들기 위해 독특한하려는 . FFMPEG가이 작업을 수행 할 수 있습니까? 아니면 다른 경로가 있습니까? FFMPEG의 SINE 함수가 뭔가 다른 것입니까?

+1

'는 FFmpeg -f lavfi -i 플라이트 = 텍스트 = 1e859915-bcdf-4862-8af2-bb43f04e2158 기분이 설명을 목적으로하는 atempo = 2' :) – aergistal

+2

이것은 생성하려는 오디오 종류에 따라 다릅니다. 사람들이 쉽게 구별 할 수있는 오디오? 프로그램에서 쉽게 읽을 수있는 태그는 무엇입니까? 재생할 수 있고, 잡음이 추가로 기록되며 여전히 디코딩 된 사운드가 있습니까? 음악적으로 즐거운 소리? 그것을 모른 채로 나는 우리가 많은 도움을 줄 수 있다고 생각하지 않는다. – Linuxios

답변

1

다음은 GUID의 각 니블을 A4-C6 범위의 톤으로 바꾸려는 시도입니다.

WAVE에 부호가없는 8 비트 PCM이 출력되고, ffmpeg은 필요하지 않습니다. 음성 = SLT의 -filter : 코드는 적절한 유효성 검사를 추가 부담 등

#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; 
} 
관련 문제