最近在搞小程序录音,然后使用百度接口做语音识别。

小程序目前仅支持mp3和aac编码格式。虽然百度接口提供的m4a格式支持能直接识别小程序的录音文件,但由于自己还有其他一系列需求(比如直接读取数据,根据需要进行其他处理等),我还是希望能把m4a文件转换成pcm编码的文件。

后端使用ffmpeg命令如下:

# 基于文件操作
ffmpeg -n -i input-1576685164r111.m4a -acodec pcm_s16le -f wav -ac 1 -ar 8000 output-8k-mono.wav

但是如果你用Python从网上下载一个文件,(比如我把文件存在百度对象存储,BOS),你可能更倾向于使用BytesIO这种内存文件。

这时ffmpeg基于文件的转换操作需要你建立一个临时文件,转换后再将其删除,这需要你在文件系统上进行操作,效率低而且比较麻烦。

是时候了解ffmpeg基于stdin、stdout的操作了:

# 仅输入使用pipe
cat input-1576685164r111.m4a | ffmpeg -n -i pipe: -acodec pcm_s16le -f wav -ac 1 -ar 8000 output-8k-mono.wav
# 或全使用pipe
cat input-1576685164r111.m4a | ffmpeg -n -i pipe: -acodec pcm_s16le -f wav -ac 1 -ar 8000 pipe:

使用python和BytesIO怎么操作呢?好了,我写好了:

#!/usr/bin/env python3
# coding: utf-8
#
# Created by dylanchu on 2019/12/20 from io import BytesIO
from subprocess import Popen, PIPE def m4a2wav_bytes_io(bytes_io_file):
bytes_io_file.seek(0)
content = bytes_io_file.getvalue()
cmd = ['ffmpeg', '-n', '-i', 'pipe:', '-acodec', 'pcm_s16le', '-f', 'wav', '-ac', '1', '-ar', '8000', 'pipe:']
p = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE, bufsize=-1)
out, _ = p.communicate(input=content)
p.stdin.close()
return BytesIO(out) if out.startswith(b'RIFF\xff\xff\xff') else None

_省去的是error message,即ffmpeg其他的信息输出。

这几个参考链接零零碎碎提供了一些帮助:

https://stackoverflow.com/questions/20321116/can-i-pipe-a-io-bytesio-stream-to-subprocess-popen-in-python

https://stackoverflow.com/questions/49013020/scipy-io-wavfile-read-the-stdout-from-ffmpeg

https://segmentfault.com/a/1190000016652277?utm_source=tag-newest

如果你想前端使用js直接转换格式,而不是后端转换:

https://segmentfault.com/a/1190000018200927

https://segmentfault.com/a/1190000018215367

最新文章

  1. OAF_开发系列20_实现OAF打印功能
  2. CA签发工具
  3. PHPBB公布新的维护版本
  4. Spring mvc框架 controller间跳转 ,重定向 ,传参
  5. 四则运算GUI设计
  6. Linux 使用 su 切换用户提示 Authentication Failure 的解决方法
  7. 全球最低功耗蓝牙单芯片DA14580的硬件架构和低功耗
  8. 和菜鸟一起学linux总线驱动之初识spi驱动数据传输流程【转】
  9. Selenium Waits
  10. 把SVN添加到windows服务
  11. 面向对象程序设计-C++_课时18内联函数
  12. Code:Blocks中文输出乱码解决方法
  13. tomcat中的线程问题2
  14. javah tool for Android Native Application
  15. SSM-Spring-12:Spring中NameMatchMethodPointcutAdvisor名称匹配方法切入点顾问
  16. Link Between SAP SD, MM & FI
  17. tomcat启动项目报错:The specified JRE installation does not exist
  18. linux虚拟机设置本地yum源
  19. C# 中 List.Sort运用(IComparer<T>)排序用法
  20. JS格式化数字保留两位小数点示例代码

热门文章

  1. windows openssh安装
  2. jquery用法初探
  3. Web 开发中很实用的效果【源码下载】
  4. php面试专题---12、JavaScript和jQuery基础考点
  5. jQuery FileUpload doesn't trigger 'done'
  6. Dpr ppi 适配 等概念 弹性属性的讲解
  7. Python3实现简单的钉钉机器人调用
  8. linux文件夹 权限为所有用户可 读写
  9. PHP 调试 - Xdebug
  10. 设计模式 - 装饰器模式(Decorator)