音频质量PESQ得分评估原理与步骤

音频质量PESQ得分评估原理与步骤

在实时音视频领域,我们经常需要评估音频质量。而语音质量评价是一个与语音学、语言学、信号处理、心理学、生理学等学科有密切联系的领域,因此语音质量评价是一个极其复杂的问题。语音质量评价方法从评价主体上可分为两大类:主观评价和客观评价。

主观评价:人评价(一般40人以上)。目前国内外使用较多的主观评价法有MOS法,韵母可懂度测量DRT,失真评价意见分DMOS,满意度测量DAM等。实际中,MOS法最常见,ITU.800标准定义了MOS评价方法。

客观评价:机器评价,原理上分为两类评价方式:基于输入输出方式的主动式评估和基于输出方式的被动式评估。客观评价主要依据的是原始语音信号和失真语[……]

继续阅读

表驱动优化代码、加速程序执行效率

表驱动优化代码、加速程序执行效率

表驱动介绍与优点

表驱动是一种编程模式,核心在于将输入变量作为直接或者间接索引到表里面查找直接的结果或者处理函数,索引表可以是一个数组、map、或者其它数据结构。

  • 可读性强,数据处理流程一目了然。
  • 便于维护,只需要增、删数据索引和方法就可以实现功能。
  • 精简代码,降低圈复杂度。减少if else、switch、case使用。

表驱动实现方式

表驱动可以处理三种查表方式,直接查询、索引查询、分段查询。如果我们要查找星期对应的英文名,就可以使用直接查询,例如,一个星期总共就7天,建立一个长度为7的char*数组,下标对应数字、内容对应英[……]

继续阅读

视频网站HLS技术分析与本地下载实践

视频网站HLS技术分析与本地下载实践

HLS技术介绍

现在的视频网站为了提升视频加载速度的同时节省带宽资源都采用HLS技术,网站后台把视频做成小的视频切片,这些切片记录在m3u8文件里面。每个切片都是一个ts文件,每个ts文件可以几百KB直接播放大概10s左右,浏览器播放的同时请求每个ts文件。视频网站小广告特别多,如果我们能把这些ts文件下载到本地直接本地播放。

视频网站HLS技术交互过程

当我们在网页上点击视频播放时,此时利用浏览器开发者工具Network分析发现,每个1s左右浏览器就会向服务器发起请求获取ts文件,如果某个ts文件获取超时视频就会卡顿。

初步推测[……]

继续阅读

linux下常见命令总结——grep和find使用方法

linux下常见命令总结——grep和find使用方法

       作为一名后台开发工程师需要频繁与linux系统“打交道”,掌握一些的Linux命令可以让这个交互过程更加流畅。本篇文章重点介绍grep和find两个查找命令,对工作中查找日志和文件有很大帮助。

grep 命令

grep [OPTIONS] PATTERN [FILE…]

文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文件逐行进行匹配检查,打印匹配的行。

PATTERN:正则表达式主要分为基本正则表达式、扩展正则表达式,grep都支持。

  • 查找文件中字符串

[root@VM_5_28_centos ~]# grep bash passwd 
root:x:0:0:root:/root:/bin/bash
  • 忽略大小写查找某个字符串并显示行号

[root@VM_5_28_centos ~]# cat test.txt 
oewjaiofewfoieawjfioeawjfoi
1
2
AAAA
aa
[root@VM_5_28_centos ~]# grep -n -i aa test.txt 
4:AAAA
5:aa
  • 查找不能被匹配到的数据

[root@VM_5_28_centos ~]# grep -v a test.txt 
1
2
AAAA
  • 查找被匹配到数据的前2行 (A 表示后几行、B表示前几行、C表示前后几行)

[root@VM_5_28_centos ~]# grep -B 2 aa test.txt 
2
AAAA
aa
  • 多条件查找被匹配到的数据(egrep支持多条件查找)

[root@VM_5_28_centos ~]# egrep "1|2" test.txt 
1
2
  • 利用grep进行递归多个文件查找某个字符串

[root@VM_5_28_centos ~]# grep -R aa ./*
Binary file ./go/hello matches
Binary file ./go/pkg/linux_amd64/github.com/dutchcoders/goftp.a matches
./go/test/test.txt:aa
Binary file ./test.mp4 matches
./test.txt:aa

find 命令

find [OPTIONS] [查找起始路径] [查找条件] [处理动作]

[查找起始路径] :制定具体搜索目标起始路径;默认为当前目录。

[查找条件]:指定的查找标准,可以根据文件名,大小,类型,从属关系,时间戳,权限等标准进行;默认为找出指定目录下的所有文件。

[处理动作]:对符合查找条件的文件做出的操作,例如删除等操作;默认为输出至标准输出。

  • 查找某个文件

[root@VM_5_28_centos ~]# find ./ -name test*  
./test.mp4
-name 区分大小  -iname 不区分大小写 ./ 表示当前路径下

  • 查找空文件

[root@VM_5_28_centos ~/go]# ll
total 1892
-rwxr-xr-x 1 root root 1919238 Aug 16 19:45 hello
-rw-r--r-- 1 root root      70 Aug 16 19:45 hello.go
drwxr-xr-x 3 root root    4096 Aug 16 20:17 pkg
drwxr-xr-x 3 root root    4096 Aug 16 20:17 src
drwxr-xr-x 2 root root    4096 Feb  5 16:54 test
-rw-r--r-- 1 root root       0 Feb  5 16:54 test.txt
[root@VM_5_28_centos ~/go]# find ./ -type f -empty
./test.txt
  • 查找空文件夹

[root@VM_5_28_centos ~/go]# find ./ -type d -empty
./src/github.com/dutchcoders/goftp/.git/objects/info
./src/github.com/dutchcoders/goftp/.git/refs/tags
./src/github.com/dutchcoders/goftp/.git/branches
./test
[root@VM_5_28_centos ~/go]# ls -ltr test
total 0

  • 查找空文件并执行删除

# find ./ -type f -empty -exec rm -f {} \;
# ll
total 1892
-rwxr-xr-x 1 root root 1919238 Aug 16 19:45 hello
-rw-r--r-- 1 root root      70 Aug 16 19:45 hello.go
drwxr-xr-x 3 root root    4096 Aug 16 20:17 pkg
drwxr-xr-x 3 root root    4096 Aug 16 20:17 src
drwxr-xr-x 2 root root    4096 Feb  5 16:54 test

       find是一个实时查找命令,可以根据名字、权限、文件大小实时查找文件、文件夹,支持模糊和递归查找。最后一个参数“处理动作”可以用来对查找到的结果进行处理,例如删除文件、查看文件大小等。

vim 巧应用

vim查看日志一行特别长,一行内显示不下,怎么办?

  • 直接在vi的命令模式中输入:set wrap

  • 利用gk、gj进行上下查看,防止直接跳到下一行不方便查看。

  • 如果想取消,就输入:set nowrap

想要替换文中的某个字符,怎么办?

  • 直接在vim的命令模式中输入:s/原始字符/新字符/g   替换单行内字符

  • 直接在vim的命令模式中输入:%s/原始字符/新字符/g   替换文中所有原始字符

[……]

继续阅读

2020-这将是不平凡的一年

2020-这将是不平凡的一年

20春节武汉肺炎肆掠而来,春节假期延长2天、全国人民躲在家中不给国家增加负担。湖北周边地区封路、封村、对“武汉人”进行隔离。

伊美冲突、中东地区不稳定性因素加剧。美国发动对伊朗军事领导的刺杀,加剧中东地区不稳定因素。

希望20年能像这天空一样,纯净、湛蓝、清澈。

[……]

继续阅读

记一次pop_front引发coredump问题

记一次pop_front引发coredump问题

一 deque日常用法

C++ STL里面的deque是一个双端队列,在项目开发中我们经常将一些有先后顺序的数据保存在队列里面,以保证应用程序处理数据的顺序是合理的,例如12306在处理用户购买火车票的订单,一般就会用一个队列缓存用户的请求。

二 pop_front函数异常场景

在实际项目中,对于队列的常见操作就是从尾部插入数据,从头部取出数据。这个时候就需要使用2个函数,push_back()和pop_front()。可是这2个函数使用方法不对,就会带来意外惊喜。例如,下面这个例子。

#include <deque>

int main()

{

    std::de[……]

继续阅读

因memcpy引起的string变量cordump问题

因memcpy引起的string变量cordump问题

问题现象

最近项目中某个服务升级支持ipv6,该服务在测试过程中出现了coredump现象,并且每次调试core文件崩溃堆栈都是在不同的位置上。出现这种堆栈异常,想通过gdb调试出崩溃原因还是很困难。

pastedGraphic.png

原因分析

2.1 信号signal 6 产生原因

从上述堆栈信息可以看出,程序是因为收到一个signal 6 导致进程挂掉的。那么什么情况下出现程序被这个信号杀死呢?

1 进程内部初始化已申请内存时报错,但是程序没有做处理。

      malloc的申请会被OS尽可能延后的分配,所以很有可能已经申请的内存早就OOM了,但是程序还可以运行一段时间,这个时候再读写内存就会出[……]

继续阅读

冒泡与快速排序的算法原理与性能对比

冒泡与快速排序的算法原理与性能对比

一 概述

       在日常开发过程中,我们经常需要对各种类型的数据进行排序,例如将订单按照金额进行降序排列。快速排序算法的时间复杂度为O(nlogn),空间复杂度为O(n)而常见的冒泡、选择、插入排序算法它的平均时间复杂度为O(n2),时间复杂度表示算法运行的时间,因此快速排序算法又被成为最优的排序算法。接下来主要对比冒泡排序和快速排序进行介绍、并对比两者性能的差异。

二 算法实现原理

2.1.1 冒泡排序算法原理

  1. 从第一个元素开发遍历,比较相邻的元素。如果第一个比第二个大,就交换他们两个。

  2. 对每一对相邻元素做同样的工作,从开[……]

    继续阅读

vscode 更新后无法使用ssh远程开发

vscode 更新后无法使用ssh远程开发

一 问题原因描述

开发环境采用 VSCode + Remote SSH 所有的配置已经搭建完成本地开发,代码自动同步到服务器。今天Visual Studio Code 推出1.4.11版本,VS code自动安装成功后,本地无法打开远程服务器文件进行开发,提示 Waiting for vscode-scp-done.flag and vscode-server-linux-x64.tar.gz to exist。

二 原因分析

从终端输出的日志来看ssh连接成功、一直在请求获取vscode-server-linux-x64.tar.gz 这个文件,导致安装进程阻塞。

从这个[……]

继续阅读

C++ STL中erase()函数使用陷阱

C++ STL中erase()函数使用陷阱

一  陷阱现象描述

      最近在项目中需要实现一个超时数据自动删除功能,采用了deque这个数据结构使用它的头删尾插功能。在实现删除功能时,程序出现了crash。

     程序在iOS平台上未出现异常现象,但是在Android平台偶尔会出现crash现象。通过ndk-stack 定位堆栈,发现是crash在下面这个地方。

       仔细分析这里的item是一个deque结构 m_naks的迭代器(it)的引用,只是对变量执行自增,并没有其它复杂逻辑。那么为什么会crash在这个地方呢?再有一种可能那就是item是个非法的迭代器自增在写内存的时候出现crash。m_[……]

继续阅读