python ffmpeg pipe_ffmpeg-python通过pipe与librosa进行数据流交互
本项目的音频分类流程如下,整个处理流程都基于python实现:
从线上拿到m3u8媒体数据流,解析ts链接,通过ffmpeg库提取视频流中的音频数据,音频重采样到16k,切分为10s的音频段,使用librosa库提取10s音频段的mfcc特征,得到m*n*1的特征数组,将特征数组送入到cnn网络中(keras-tf实现)进行分类。
在实际的操作过程中,会遇到ffmpeg与librosa库之间的数据交互,librosa.load()、audioread.audio_open()函数都只能读取音频文件,因此最开始的方案是ffmpeg从视频中提取音频数据、重采样、切分后,保存到本地的音频文件(.wav、.mp3等),librosa.load()再从本地读取该音频文件,进行特征提取和分类。该方案会涉及到磁盘io的读写,当数据流很大时,会导致磁盘io的高负荷读写,减小磁盘的使用寿命,同时磁盘文件的读写也会影响整个数据处理的速度,无法满足线上的需求。
改进后的解决方案:所有的音视频数据的处理过程都在内存中完成,不用对文件进行读写,重点解决ffmpeg如何将音频数据流写入内存中,以及librosa如何从内存中读取音频数据流。通过不断查资料和测试,ffmpeg库可以通过pipe将数据写入到内存中,然后在读取内存里的音频数据流时,使用soundfile.read()函数,而不是librosa.load()、audioread.audio_open()函数。直接上代码,需要手动安装ffmpeg-python库(
),ffmpeg.probe、ffmpeg.input支持大部分主流的url媒体数据流和本地音视频格式文件。
# -*- coding: UTF-8 -*-
import sys
sys.path.append('/xxx/ffmpeg-python')
import ffmpeg
import librosa
import librosa.display
import numpy as np
import subprocess as sp
import soundfile as sf
import io,os
from keras.models import load_model
import pandas as pd
import pymysql
import urllib2,json
max_pad_size = 313
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
mymodel = load_model('xxx.h5')
def predict(test_data):
predict = mymodel.predict(test_data)
predict_label = np.argmax(predict) # 取最大值的位置
predict_class = audio_classes[predict_label]
predict_class_score = predict[0][predict_label]
print('result class:{0}, score:{1}'.format(predict_class, predict_class_score))
return
# 1.获取url
ts_list = get_url() # 解析后的ts链接
ts_len = len(ts_list)
for k in range(ts_len):
ts_file = ts_list[k]
file_name = (ts_file.split('.')[-2]).split('/')[-1]
# ts_file= '1.mp4' # 或者使用本地的视频文件
# 2.从url中获取音视频的长度
probe = ffmpeg.probe(ts_file)
#audio_stream = next((stream for stream in probe['streams'] if stream['codec_type'] == 'audio'), None)
#duration_seconds = float(audio_stream['duration'].encode('utf-8')) #获取音视频的长度
duration_seconds = float(probe['format']['duration'].encode('utf-8'))
print('audio duration_seconds:',duration_seconds)
interval = 10 # 10s
duration_length = int(duration_seconds / interval)
if (duration_length > 0):
for i in range(duration_length):
start_s = int((i * interval) % 60)
start_m = int((i * interval) / 60)
start_h = int((i * interval) / 3600)
if(start_s < 10):
start_s = '0'+str(start_s)
if (start_m < 10):
start_m = '0' + str(start_m)
if (start_h < 10):
start_h = '0' + str(start_h)
start_s = str(start_s)
start_m = str(start_m)
start_h = str(start_h)
# 3.从url中提取音频,切割10s音频
FFMPEG_BIN = "ffmpeg"
command_in = [ FFMPEG_BIN,
'-i', ts_file,
'-f', 'wav', #soundfile只支持wav格式
'-ar', '16000',
'-ab', '128000',
'-ac','1',
'-ss',start_h + ':' + start_m + ':' + start_s,
'-t','00:00:10',
'-']
pipe_in = sp.Popen(command_in, stdout = sp.PIPE, stderr=sp.PIPE)
while True:
raw_audio = pipe_in.stdout.read() #从内存中读取音频流
if (raw_audio == ''):
break
tmp_stream = io.BytesIO(raw_audio)
data, samplerate = sf.read(tmp_stream) #soundfile只支持wav格式
if(len(data)<1):
break
# 4.提取音频的mfcc特征
mfccs = np.array(librosa.feature.mfcc(y=data, sr=samplerate, n_mfcc=32).T)
y_shape = mfccs.shape[0]
if y_shape < max_pad_size:
pad_size = max_pad_size - y_shape
mfccs = np.pad(mfccs, ((pad_size, 0), (0, 0)), mode='constant')
else:
mfccs = mfccs[:max_pad_size, :]
mfcc_data = mfccs.reshape(-1, max_pad_size, 32, 1)
# 5.对音频进行分类
predict(mfcc_data)
pipe_in.stdout.flush()
参考:
python ffmpeg pipe_ffmpeg-python通过pipe与librosa进行数据流交互相关推荐
- python ffmpeg模块,python执行ffmpeg
python执行ffmpeg命令 能拿到ffmpeg正常输出 ffmpeg抛出异常时可以拿到异常信息 返回ffmpeg处理进度 以下代码依赖的pexpect,progressbar需要安装下 impo ...
- 七十行代码教你使用 python ffmpeg 压缩视频,再也不用担心视频过大了
前期准备 最近要压缩视频,然后发现一些压缩视频的工具要是收费,要么有水印,完全不符合要求啊.正当我发愁的时候突然想到,去年的时候接触过 ffmpeg ,可以用python ffmpeg 来压缩视频啊, ...
- python调用摄像头做监控_《自拍教程68》Python + ffmpeg调用摄像头,实现自动化监控录像...
案例故事: 场景一:反复重启Android终端产品100次,每重启一次录一个视频; 场景二:做压力测试比如Monkey一晚上,我们需要涉及长时间录像; 场景三:做自动化测试的时候,跑一条自动化用例,录 ...
- 使用python+ffmpeg开发的wav分割小工具
工具分享: 最近项目有接触到音频神经网络训练,但是准备训练数据实在是太难受了,所以用python+ffmpeg写了个自动分割wav文件的小工具,使用前需要配置ffmpeg环境哦 工具代码 需要引入三个 ...
- Python help 函数 - Python零基础入门教程
目录 一.Python help 函数简介 二.Python help 函数使用 1.查看内置函数的帮助信息 2.查看数据类型的帮助信息 三.猜你喜欢 基础 Python 学习路线推荐 : Pytho ...
- Python next 函数 - Python零基础入门教程
目录 一.Python next 函数简介 二.Python next 函数使用 三.猜你喜欢 基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 ...
- Python oct 函数 - Python零基础入门教程
目录 一.Python oct 函数简介 二.Python oct 函数使用 1.Python chr 函数将 ascll 码转为字符 2.Python ord 函数将字符转为 ascll 码 三.猜 ...
- Python min 函数 - Python零基础入门教程
目录 一.Python min 函数简介 二.Python min 函数使用 三.猜你喜欢 基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一. ...
- Python reload 函数 - Python零基础入门教程
目录 一.Python reload 函数简介 二.Python reload 函数使用 三.猜你喜欢 基础 Python 学习路线推荐 : Python 学习目录 >> Python 基 ...
最新文章
- $(document).ready()和window.onload的区别
- 【Android 应用开发】Activity 返回堆栈管理 ( 阶段总结 | 任务栈管理 | 返回堆栈 | 清除返回堆栈 | 亲和性 | 启动模式补充 | standard | singleTop )
- nodejs(log4js)服务中应用splunk进行Log存储、搜索、分析、监控、警告
- Redis 命令--Redis集合(Set)
- Mybatis、使用注解的方式编写用户和角色一对多关系,并使用延迟加载
- 基于spring-redis发布订阅模式的实现
- JavaScript运算符的优先级(案例讲解)
- leetcode LRUCache题目
- GridView的操作:导出Excel[方案一]
- 4月27日--28日课堂内容
- myeclipse自带客户端连接mysql数据库
- 性能监控工具yourkit的安装及eclipse、tomcat的集成
- C#学习笔记(十):反射
- paip.云计算以及分布式计算的区别
- 电脑系统及软件安装日期查看
- 如何在知网下载PDF文件
- windows自带备份驱动
- 移动端H5页面中加载的图片,在chrome和安卓手机中显示正常,在iphone和safari浏览器中个别图片显示问号的问题处理
- 【免费or付费】外卖优惠券公众号的申请以及做法有什么不同?
- 《AngularJS深度剖析与最佳实践》一1.1 环境准备
热门文章
- orm框架有哪些_java技术哪些是必学的?
- 参照WebStorm设置VSCode快捷键Alt+Enter快速修复部分报错代码(默认是Ctrl+.)
- webkit入门准备
- [转载] static class 静态类(Java)
- Linux中/etc/resolv.conf文件简析
- BZOJ3930: [CQOI2015]选数
- 解决keepalived脑裂问题
- 转帖:硬盘生产全过程(图)
- 高并发大型网站架构设计
- C#获得文件版本信息及只读文件的删除