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

Posted

技术标签:

【中文标题】使用啥 ffmpeg 命令将无符号整数列表转换为音频文件?【英文标题】:What ffmpeg command to use to convert a list of unsigned integers into an audio file?使用什么 ffmpeg 命令将无符号整数列表转换为音频文件? 【发布时间】:2019-03-21 17:32:25 【问题描述】:

我有一个文件,其中包含大约四万个用空格分隔的整数的列表,每个整数的值在 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 文件中找到的整数列表。

【问题讨论】:

ffmpeg 无法读取整数列表。您需要将其转换为二进制文件,可能在 while 循环中使用 sscanf。 @Gyan 谢谢,我写了一个脚本来转换为二进制,希望它是正确的。我试过这个命令ffmpeg -ar 24000 -ac 1 -i binary.txt -y audio.wav,但我收到消息Format image2 detected only with low score of 5, misdetection possible! Option sample_rate not found.你能建议一个合适的-f吗?还有其他标志吗? 如果是无符号8位,则-f u8 -sample_rate 24000 -channels 1 -i binary.txt 【参考方案1】:

正如@Gyan 在 cmets 中建议的那样,在运行 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([]bytebyte(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 + 扬声器的输出,这正是我想要的。

【讨论】:

完整的 C 示例也可以在以下位置查看:***.com/questions/732699/…

以上是关于使用啥 ffmpeg 命令将无符号整数列表转换为音频文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 x86(32 位)程序集中将无符号整数转换为浮点数?

如何将无符号整数加载到 SIMD 中

将无符号整数存储在指针中

如何从 Python 将无符号值发送到 dBus

将无符号整数输入属性传递给顶点着色器

将无符号字节流转换为有符号字节流 Golang