本项目的音频分类流程如下,整个处理流程都基于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进行数据流交互相关推荐

  1. python ffmpeg模块,python执行ffmpeg

    python执行ffmpeg命令 能拿到ffmpeg正常输出 ffmpeg抛出异常时可以拿到异常信息 返回ffmpeg处理进度 以下代码依赖的pexpect,progressbar需要安装下 impo ...

  2. 七十行代码教你使用 python ffmpeg 压缩视频,再也不用担心视频过大了

    前期准备 最近要压缩视频,然后发现一些压缩视频的工具要是收费,要么有水印,完全不符合要求啊.正当我发愁的时候突然想到,去年的时候接触过 ffmpeg ,可以用python ffmpeg 来压缩视频啊, ...

  3. python调用摄像头做监控_《自拍教程68》Python + ffmpeg调用摄像头,实现自动化监控录像...

    案例故事: 场景一:反复重启Android终端产品100次,每重启一次录一个视频; 场景二:做压力测试比如Monkey一晚上,我们需要涉及长时间录像; 场景三:做自动化测试的时候,跑一条自动化用例,录 ...

  4. 使用python+ffmpeg开发的wav分割小工具

    工具分享: 最近项目有接触到音频神经网络训练,但是准备训练数据实在是太难受了,所以用python+ffmpeg写了个自动分割wav文件的小工具,使用前需要配置ffmpeg环境哦 工具代码 需要引入三个 ...

  5. Python help 函数 - Python零基础入门教程

    目录 一.Python help 函数简介 二.Python help 函数使用 1.查看内置函数的帮助信息 2.查看数据类型的帮助信息 三.猜你喜欢 基础 Python 学习路线推荐 : Pytho ...

  6. Python next 函数 - Python零基础入门教程

    目录 一.Python next 函数简介 二.Python next 函数使用 三.猜你喜欢 基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 ...

  7. Python oct 函数 - Python零基础入门教程

    目录 一.Python oct 函数简介 二.Python oct 函数使用 1.Python chr 函数将 ascll 码转为字符 2.Python ord 函数将字符转为 ascll 码 三.猜 ...

  8. Python min 函数 - Python零基础入门教程

    目录 一.Python min 函数简介 二.Python min 函数使用 三.猜你喜欢 基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一. ...

  9. Python reload 函数 - Python零基础入门教程

    目录 一.Python reload 函数简介 二.Python reload 函数使用 三.猜你喜欢 基础 Python 学习路线推荐 : Python 学习目录 >> Python 基 ...

最新文章

  1. $(document).ready()和window.onload的区别
  2. 【Android 应用开发】Activity 返回堆栈管理 ( 阶段总结 | 任务栈管理 | 返回堆栈 | 清除返回堆栈 | 亲和性 | 启动模式补充 | standard | singleTop )
  3. nodejs(log4js)服务中应用splunk进行Log存储、搜索、分析、监控、警告
  4. Redis 命令--Redis集合(Set)
  5. Mybatis、使用注解的方式编写用户和角色一对多关系,并使用延迟加载
  6. 基于spring-redis发布订阅模式的实现
  7. JavaScript运算符的优先级(案例讲解)
  8. leetcode LRUCache题目
  9. GridView的操作:导出Excel[方案一]
  10. 4月27日--28日课堂内容
  11. myeclipse自带客户端连接mysql数据库
  12. 性能监控工具yourkit的安装及eclipse、tomcat的集成
  13. C#学习笔记(十):反射
  14. paip.云计算以及分布式计算的区别
  15. 电脑系统及软件安装日期查看
  16. 如何在知网下载PDF文件
  17. windows自带备份驱动
  18. 移动端H5页面中加载的图片,在chrome和安卓手机中显示正常,在iphone和safari浏览器中个别图片显示问号的问题处理
  19. 【免费or付费】外卖优惠券公众号的申请以及做法有什么不同?
  20. 《AngularJS深度剖析与最佳实践》一1.1 环境准备

热门文章

  1. orm框架有哪些_java技术哪些是必学的?
  2. 参照WebStorm设置VSCode快捷键Alt+Enter快速修复部分报错代码(默认是Ctrl+.)
  3. webkit入门准备
  4. [转载] static class 静态类(Java)
  5. Linux中/etc/resolv.conf文件简析
  6. BZOJ3930: [CQOI2015]选数
  7. 解决keepalived脑裂问题
  8. 转帖:硬盘生产全过程(图)
  9. 高并发大型网站架构设计
  10. C#获得文件版本信息及只读文件的删除