使用什么ffmpeg命令将无符号整数列表转换为音频文件?

时间:2019-03-21 17:32:26

标签: audio ffmpeg esp32

我有一个文件,其中包含大约四万个用空格定界的整数的列表,每个整数在0到255之间。这里是此文件:

https://github.com/johnlai2004/sound-project/blob/master/integers.txt

如果将扬声器连接到ESP32分支板上,然后以24kHz的频率通过数模转换器运行此整数列表,您会听到一句话,“那不是您错过的帖子”。

我想知道的是如何使用FFMPEG将整数列表转换为其他计算机可以播放以听到相同短语的声音文件?我尝试了以下命令:

ffmpeg -f u8 -ac 1 -ar 24000 -i integers.txt -y audio.wav

但是我的audio.wav听起来像白噪声。我为-f-ar尝试了其他一些值,但是我听到的只是白噪声的频率不同,也许还有一些嗡嗡声。

是否可以使用ffmpeg将整数列表转换为音频文件以供其他计算机播放?如果是这样,什么是正确的ffmpeg命令执行此操作?

其他说明

如果有帮助,如果我想听音频,这是我上传到ESP32的草图文件:

https://github.com/johnlai2004/sound-project/blob/master/play-audio.ino

简而言之,文件如下所示:

#define speakerPin 25                          //The pins to output audio on. (9,10 on UNO,Nano)
#define bufferTotal 1347
#define buffSize 32

byte buffer[bufferTotal][buffSize];
int buffItemN = 0;
int bufferN = 0;

hw_timer_t * timer = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;

void IRAM_ATTR onTimer() {
  portENTER_CRITICAL_ISR(&timerMux);


  byte v = buffer[bufferN][buffItemN];
  dacWrite(speakerPin,v);

  buffItemN++;

  if(buffItemN >= buffSize){                                      //If the buffer is empty, do the following
    buffItemN = 0;                                              //Reset the sample count
    bufferN++;
    if(bufferN >= bufferTotal)
      bufferN = 0;
  }

  portEXIT_CRITICAL_ISR(&timerMux);

}

void setup() {      

/* buffer records */
buffer[0][0]=88;  // I split the long list of integers and load it into a 2D array
buffer[0][1]=88;
buffer[0][2]=86;
buffer[0][3]=85;
//etc....
buffer[1346][28]=94;
buffer[1346][29]=92;
buffer[1346][30]=92;
buffer[1346][31]=95;


/* end buffer records */

  timer = timerBegin(0, 80, true);
  timerAttachInterrupt(timer, &onTimer, true);
  timerAlarmWrite(timer, 41, true);
  timerAlarmEnable(timer);

}

void loop() {

}

buffer...是在integers.txt文件中找到的整数列表。

1 个答案:

答案 0 :(得分:1)

正如@Gyan在评论中建议的那样,在运行ffmpeg命令之前,我必须先将整数列表转换为二进制文件。因此,我创建了一个名为data () { return { .... } } 的golang脚本:

var audioPlayer: AVAudioPlayer?
func playSound() {
        let audioFileURL = Bundle.main.url(forResource: "/Sound/music1", withExtension: "mp3")
        do {
            try audioPlayer = AVAudioPlayer(contentsOf: audioFileURL!)
        } catch let error {
            print(error.localizedDescription)
        }
        audioPlayer?.play()
    }

我运行main.go给我package main import ( "io/ioutil" "strings" "strconv" "os" ) func main() { input:="./integers.txt" output:="./binary.raw" // Load the list of integers into memory contentbyte, _ := ioutil.ReadFile(input) content := strings.Split(string(contentbyte)," "); // Prepare to output a new binary file f, err := os.OpenFile(output, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600) if err != nil { panic(err) } defer f.Close() for _,val := range content { // Convert each integer to a binary value and write to output file i,_ := strconv.Atoi(val) if _, err = f.Write([]byte{byte(i)}); err != nil { panic(err) } } } 文件。然后,我在问题中发布了运行ffmpeg的命令,例如go run main.go

binary.raw的声音听起来就像我想要的ESP32 +扬声器的输出。