ffmpeg提取音频文件命令并转化成pcm格式

本文深入解析PCM音频文件格式,介绍其与压缩格式如MP3的区别,展示如何使用FFmpeg将MP3转换为PCM,并分析PCM文件大小计算方法。同时,提供利用FFmpeg工具播放PCM文件的教程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文转载自:https://blog.youkuaiyun.com/u014552102/article/details/82734278

一、PCM文件的定义 
  PCM文件:模拟音频信号经模数转换(A/D变换)直接形成的二进制序列,该文件没有附加的文件头和文件结束标志。Windows的Convert工具能够把PCM音频格式的文件转换成Microsoft的WAV格式的文件。将音频数字化,事实上就是将声音数字化。最常见的方式是透过脉冲编码调制PCM(Pulse Code Modulation) 。

  上面这段话是博主在网上摘抄的关于PCM文件的定义。其实PCM简单地来说,就是一种无压缩的原始音频格式,而我们熟知的MP3等格式的音频文件是有压缩的(因为无压缩导致的结果就是占用空间会很大,会极大地增加存贮和传输的成本,所以存贮在电脑上的一般是MP3等压缩格式的文件)。播放器要想播放MP3,AAC,APE,FLAC等格式的音频文件,首先得把它们解码成PCM数据(解码出来后一般是FLT的格式,还要通过重采样转为声卡支持的S16格式),然后才能播放。

 

二、通过FFmpeg命令转换得到PCM文件
  如下图所示,工程目录下有audio1.mp3这个MP3文件,下面我们介绍把它转为PCM文件的方法。

 

在命令提示符cmd.exe中进入当前工程所在目录(ffmpeg.exe和audio1.mp3所在目录),然后输入命令:

ffmpeg -i audio1.mp3 -f s16le audio1.pcm
该命令的作用是把所在路径下的audio1.mp3文件转换为s16(声卡支持该格式)、小端格式的PCM文件:audio1.pcm。

注:
-i 表示设定输入流
-f 表示设定输出格式

执行该命令后,我们发现工程目录下会生成audio1.pcm文件,如下图所示:

 

三、PCM文件分析
  我们可以看到生成的audio1.pcm文件大小为49.5MB,比audio1.mp3文件的11.2MB大了数倍,如下图所示,证明了PCM文件占用空间比MP3文件要大。

 

 至于audio1.pcm文件大小为49.5MB,这个49.5MB,是可以根据公式算出来的。使用博主的另一篇博文《FFmpeg解封装(解复用)并获取本地媒体文件的信息》https://blog.youkuaiyun.com/u014552102/article/details/81709929中的程序可以看到audio1.mp3的采样频率(音频采样率)为44100Hz,采样位数为16位(这个从音频采样格式:AV_SAMPLE_FMT_S16P可以看出),声道(音频信道数目)为2。时间(音频总时长)为294秒,如下图所示:(在这两篇博客中我们都用同一个audio1.mp3文件,下图摘自我上述的那篇博客)

 

根据PCM文件所占容量的公式:存储量 = (采样频率*采样位数*声道)*时间/8(单位:字节数).

计算得出的audio1.pcm的大小 = (44100 * 16 * 2) * 294 / 8 =  51861600(字节) = 49.45MB

这个跟我们在电脑上看到的audio1.pcm文件大小为49.5MB是一致的。由此证明了PCM文件的大小是可以算出来的。

 

四、使用ffplay.exe播放PCM文件
  PCM文件是原始无压缩的音频格式文件,用市面上流行的播放器我们一般无法直接播放。但我们可以通过FFmpeg提供的ffplay.exe播放PCM文件。

  在命令提示符cmd.exe中进入当前工程所在目录(ffplay.exe和audio1.pcm所在目录),然后输入命令:

ffplay -ar 44100 -ac 2 -f s16le -i audio1.pcm
该命令的作用是使用ffplay播放频率为44100Hz,双通道,16位、小端的音频文件audio1.pcm。

注:
-i 表示指定的输入文件
-f 表示强制使用的格式
-ar 表示播放的音频数据的采样率
-ac 表示播放的音频数据的通道数

如下图所示,出现如下画面和能听到音乐,则表示播放成功。

 

五、遇到问题:
如果使用ffplay.exe播放媒体文件遇到错误:WASAPI can't initialize audio client。如下图所示:

 

则先在命令提示符执行命令:

set SDL_AUDIODRIVER=directsound
然后再使用ffplay.exe播放媒体文件。

 

六、资源下载
资源下载地址在https://download.youkuaiyun.com/download/u014552102/10671629,包含上述演示用的所有资源。包括上述的ffmpeg.exe,ffplay.exe,mp3文件,pcm文件等。
————————————————
版权声明:本文为优快云博主「cuijiecheng2018」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/u014552102/article/details/82734278

<think>好的,用户想用Python和FFmpeg拉取视频流,换成音频,然后用Whisper实现实时语文字。首先,我需要理清整个流程的步骤。 首先,视频流拉取。用户可能需要从网络摄像头、RTMP流或者其他视频源获取数据。Python中有一些库可以处理视频流,比如OpenCV或者FFmpeg命令行工具。不过FFmpeg更灵活,适合处理各种格式的视频流,所以这里应该使用FFmpeg。 接下来是换视频流为音频FFmpeg可以将视频流中的音频提取出来,换成适合Whisper处理的格式,比如16kHz、16位的单声道PCM音频。需要确定正确的FFmpeg参数,确保音频流能够实时传输,而不是保存为文件。可能需要使用管道将FFmpeg的输出直接传递给Python脚本。 然后是实时语文字。Whisper模型通常用于处理整个音频文件,但实时场景需要流式处理。这里可能需要将音频分成小块,比如每1秒的音频片段,然后连续传递给Whisper进行录。不过需要注意,Whisper的模型设计可能更适合较长的上下文,分块处理可能会影响准确性。另外,Whisper的推理速度是否能满足实时要求,可能需要使用较小的模型(如tiny或base)来减少延迟。 还需要考虑Python中如何调用FFmpeg。可以使用subprocess模块启动FFmpeg进程,读取其标准输出作为音频流。同时,音频数据需要正确解码为numpy数组或PyTorch张量,以供Whisper模型使用。 另外,实时处理中的缓冲和同步问题。音频数据需要被分成适当的块,且确保在处理当前块时,下一个块正在被接收,以保持实时性。可能需要多线程或异步处理,一边拉取音频数据,一边进行推理。 最后,整合所有步骤。确保FFmpeg正确捕获视频流提取音频,Python脚本实时读取音频数据,分块处理,调用Whisper模型录,输出文字结果。 可能遇到的问题包括:FFmpeg参数错误导致音频格式不正确,Whisper处理延迟过高,音频分块导致上下文丢失影响录准确性。需要逐一测试每个环节,优化参数和模型选择,以达到最佳实时效果。</think>要实现使用Python和FFmpeg拉取视频流换为音频,再用Whisper实现实时语文字,可按以下步骤实施: ### 一、视频流采集与音频换 1. **安装FFmpeg工具** ```bash # Ubuntu sudo apt install ffmpeg # MacOS brew install ffmpeg ``` 2. **Python调用FFmpeg捕获视频流** ```python import subprocess rtmp_url = "rtmp://example.com/live/stream" command = [ 'ffmpeg', '-i', rtmp_url, '-f', 's16le', # 输出16位小端格式 '-ar', '16000', # 采样率16kHz '-ac', '1', # 单声道 '-vn', # 禁止视频流 '-loglevel', 'quiet', 'pipe:1' # 输出到标准输出 ] process = subprocess.Popen(command, stdout=subprocess.PIPE) ``` ### 二、实时音频处理 ```python import numpy as np import whisper # 加载Whisper模型(推荐使用tiny/base模型) model = whisper.load_model("base") # 音频缓冲区配置 CHUNK_SIZE = 16000 * 2 # 1秒音频数据(16kHz * 16bit) buffer = bytearray() while True: raw_data = process.stdout.read(4096) if not raw_data: break buffer.extend(raw_data) # 当缓冲区积累足够1秒数据时处理 while len(buffer) >= CHUNK_SIZE: audio_chunk = np.frombuffer(buffer[:CHUNK_SIZE], dtype=np.int16) result = model.transcribe(audio_chunk.astype(np.float32) / 32768.0) print(result["text"]) del buffer[:CHUNK_SIZE] ``` ### 三、性能优化建议 1. **使用异步处理** ```python import asyncio from concurrent.futures import ThreadPoolExecutor async def process_audio(): executor = ThreadPoolExecutor() loop = asyncio.get_event_loop() while True: # ...获取音频数据... future = loop.run_in_executor(executor, model.transcribe, audio_chunk) result = await future ``` 2. **调整Whisper参数** ```python result = model.transcribe(audio_chunk, language='zh', fp16=False, # CPU环境关闭 temperature=0.2) ``` ### 四、部署建议 1. 使用GPU加速需安装CUDA版PyTorch 2. 对于低延迟场景,可尝试Whisper的流式处理分支 3. 推荐音频分块时长控制在1-3秒之间[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值