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

Audio 使用什么ffmpeg命令将无符号整数列表转换为音频文件?,audio,ffmpeg,esp32,Audio,Ffmpeg,Esp32,我有一个文件,其中包含一个由大约40000个整数组成的列表,这些整数以空格分隔,每个整数的值介于0和255之间。这里是这个文件: 如果您将扬声器连接到ESP32转接板,然后以24kHz的频率通过数模转换器运行此整数列表,您将听到这样一句话:“这不是您错过的帖子。” 我想知道的是,如何使用FFMPEG将这个整数列表转换成声音文件,以便其他计算机播放以听到相同的短语?我试过这个命令: ffmpeg -f u8 -ac 1 -ar 24000 -i integers.txt -y audio.wav

我有一个文件,其中包含一个由大约40000个整数组成的列表,这些整数以空格分隔,每个整数的值介于0和255之间。这里是这个文件:

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

我想知道的是,如何使用FFMPEG将这个整数列表转换成声音文件,以便其他计算机播放以听到相同的短语?我试过这个命令:

ffmpeg -f u8 -ac 1 -ar 24000 -i integers.txt -y audio.wav
但是我的
audio.wav
听起来就像白噪音。我尝试了
-f
-ar
的一些其他值,但我听到的只是不同频率的白噪声和一些额外的嗡嗡声

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

其他注释

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

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

#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
文件中找到的整数列表。

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

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)
    }
  }

}
我运行
go-run main.go
以获得
binary.raw
文件。然后,我运行了问题中发布的ffmpeg命令,如下所示
ffmpeg-f u8-ar 24000-ac 1-I binary.raw-y audio.wav


audio.wav
文件听起来就像我的ESP32+扬声器的输出,这正是我想要的。

ffmpeg无法读取整数列表。您需要将其转换为二进制文件,可能需要在while循环中使用sscanf。@Gyan谢谢,我编写了一个脚本来转换为二进制文件,希望它是正确的。我尝试了这个命令
ffmpeg-ar 24000-ac 1-I binary.txt-y audio.wav
,但是我得到的消息
Format image2检测到的分数很低,只有5分,可能是误判!未找到选项采样率。
您能建议一个合适的
-f
?还有其他标志吗?如果是无符号8位,则
-f u8-采样率24000-通道1-i binary.txt
还可以在以下位置看到完整的C示例: