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

本文转载自:https://blog.csdn.net/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.csdn.net/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.csdn.net/download/u014552102/10671629,包含上述演示用的所有资源。包括上述的ffmpeg.exe,ffplay.exe,mp3文件,pcm文件等。
————————————————
版权声明:本文为CSDN博主「cuijiecheng2018」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u014552102/article/details/82734278

<think>好的,我现在需要帮助用户解决如何用Python实现从视频流中提取音频用Whisper实时文字的问题。首先,我得理清用户的需求。用户提到的是视频流,而不是本地视频文件,所以可能需要处理实时视频流,比如来自网络摄像头或者RTMP流的视频。 首先,视频流提取音频。常见的库有OpenCV和PyAV。PyAV在处理视频流方面更高效,特别是对于复杂的格式,但用户可能对OpenCV更熟悉。不过,对于提取音频,可能需要专门的音频处理库,比如ffmpeg-python或者直接使用PyAV的音频流处理功能。 接下来是音频提取。视频流中的音频通常是压缩格式,需要解码。PyAV可以解封装视频流,分离出音频流,将其换为原始音频数据,比如PCM格式,这样Whisper才能处理。这一步需要注意音频的采样率、声道数等参数是否与Whisper的输入要求匹配。 然后是实时录。Whisper模型通常用于处理音频文件,但实时的话需要处理连续的音频流。这里可能需要将音频分成块,比如每1秒或2秒的片段,然后逐个送入Whisper进行录。但需要注意,Whisper的模型大小和推理速度,实时处理可能需要较小的模型(如tiny或base),或者使用GPU加速。 此外,实时处理还需要考虑延迟问题。如果处理时间超过音频块的长度,可能会导致延迟累积。需要优化处理流程,比如多线程或异步处理,音频采集和推理行进行。 代码结构方面,可能需要以下几个步骤: 1. 使用PyAV打开视频流,读取音频包。 2. 将音频解码为原始数据,重采样为Whisper需要的16kHz单声道。 3. 将音频数据换为numpy数组,分块。 4. 使用Whisper的transcribe函数处理每个块,获取文本。 5. 实时输出或收集录结果。 需要测试不同的音频块大小对录准确性和延迟的影响。另外,Whisper在处理短音频时可能效果较差,可能需要添加上下文窗口,或者在模型调用时使用参数来优化。 可能遇到的问题包括:视频流的中断处理,音频和视频的同步问题,Whisper的内存占用,以及实时处理的性能瓶颈。需要逐一排查,比如使用性能分析工具查看哪部分耗时最多。 最后,还要考虑依赖库的安装,比如PyAV、ffmpeg、whisper等,可能需要用户提前安装好这些库,配置好环境,特别是GPU支持如果可用的话。</think>以下是如何使用Python从视频流中提取音频实时录的实现步骤: --- ### 一、环境准备 1. 安装依赖库: ```bash pip install av openai-whisper sounddevice numpy ``` 2. 确保已安装FFmpeg(Windows需手动配置环境变量) --- ### 二、代码实现 ```python import av import numpy as np import whisper # 初始化Whisper模型(建议使用base或small版本) model = whisper.load_model("base") def process_audio_frame(frame): # 将音频换为numpy数组归一化 audio_data = frame.to_ndarray()[0].astype(np.float32) / 32768.0 return audio_data def transcribe_stream(video_url, chunk_duration=5): container = av.open(video_url) audio_stream = next(s for s in container.streams if s.type == 'audio') buffer = [] for frame in container.decode(audio_stream): # 处理音频pcm_data = process_audio_frame(frame) buffer.extend(pcm_data) # 按时间分块处理 if len(buffer) >= 16000 * chunk_duration: # 16000Hz采样率 segment = np.array(buffer[:16000*chunk_duration]) result = model.transcribe(segment) print(f"实时录: {result['text']}") buffer = buffer[16000*chunk_duration:] if __name__ == "__main__": # 示例:处理网络视频流 transcribe_stream("rtmp://example.com/live/stream") # 本地摄像头可改用 transcribe_stream("/dev/video0") (Linux) ``` --- ### 三、关键技术点 1. **视频流处理**:使用PyAV库解封装视频流[^1],支持RTMP/RTSP/HLS等协议 2. **音频重采样**:Whisper要求16kHz单声道输入,PyAV自动处理采样率换 3. **实时分块**:通过设置`chunk_duration`控制处理延迟(建议5-10秒) 4. **内存优化**:使用生成器逐帧处理,避免加载完整视频流到内存 --- ### 四、性能优化建议 1. 使用`whisper.load_model("tiny.en")`降低计算需求 2. 添加GPU支持(需安装PyTorch GPU版本) 3. 实现双缓冲区机制:一个缓冲接收数据,另一个处理录 ```python from threading import Thread import queue audio_queue = queue.Queue(maxsize=2) def capture_thread(): while True: # 采集音频放入队列 def process_thread(): while True: # 从队列取出处理 ``` --- ### 五、应用场景示例 1. 直播实时字幕生成 2. 视频会议内容录 3. 安防监控语分析 4. 在线教育课程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值