如何基于YoC播放器实时播放语音合成码流

简介: 如何基于YoC播放器实时播放语音合成码流

image.png

YoC播放器中支持的码流url类型有如下几种:

流类型 URL前缀 URL格式
http流 http(s):// http(s)://ip:port/xx.mp3
文件流 file:// file:///fatfs0/xx.mp3?avformat=%s&avcodec=%u&channel=%u&rate=%u
内存流 mem:// mem://addr=%u&size=%u&avformat=%u&avcodec=%u&channel=%u&rate=%u
fifo流 fifo:// fifo://tts/1?avformat=%s&avcodec=%u&channel=%u&rate=%u
由于fifo是基于生产者-消费者原理来实现的,我们可以基于fifo码流类型来实现实时语音合成码流播放。用户在创建fifo后,通过将fifo传递给播放器播放。与此同时可不断从网络上读取tts流,写入fifo中。

示例代码如下:
//核心代码片段
static player_t* g_player;
static nsfifo_t* g_tts_fifo;

static void _ptask(void *arg)
{

int fd;
int cnt = 0, rc, wlen;
char *val, *pos;
uint8_t reof = 0;
web_session_t *session;
/* 创建一个http会话 */
session = web_session_create();
/* 向指定地址发起http请求 */
rc = web_session_get(session, "http://www.srcbin.net/ai/result.mp3", 3);
if (rc) {
    LOGE(TAG, "web_session_get fail. rc = %d, code = %d, phrase = %s", rc, session->code, session->phrase);
    goto err;
}
/* 获取内容的长度 */
val = (char*)dict_get_val(&session->hdrs, "Content-Length");
CHECK_RET_TAG_WITH_GOTO(val != NULL, err);
fd = session->fd;
LOGD(TAG, "content len = %d", atoi(val));

for (;;) {
    /* 获取fifo的可写指针及长度 */
    wlen = nsfifo_get_wpos(g_tts_fifo, &pos, 8*1000);
    /* 获取播放器fifo读端是否退出(可能播放出错) */
    nsfifo_get_eof(g_tts_fifo, &reof, NULL);
    if (wlen <= 0 || reof) {
        LOGE(TAG, "get wpos err. wlen = %d, reof = %d", wlen, reof);
        break;
    }
    /* 从网络套接字中读取数据 */
    rc = sock_readn(fd, pos, wlen, 6*1000);
    if (rc <= 0) {
        LOGE(TAG, "readn err. rc = %d", rc);
        break;
    }
    /* 设置写指针 */
    nsfifo_set_wpos(g_tts_fifo, rc);
    cnt += rc;
}
LOGD(TAG, "rc = %8d, cnt = %8d", rc, cnt);

err:

/* 销毁web会话资源 */
web_session_destroy(session);
return;

}
/ 创建fifo,指定fifo地址和大小 /
g_tts_fifo = nsfifo_open("fifo://tts/1", O_CREAT, 64*1024);
if (g_tts_fifo) {

/* 创建 _ptask任务,用于通过网络获取码流数据 */
aos_task_new("xx_task", _ptask, NULL, 6*1024);
/* 设置播放器取流超时时间 */
player_ioctl(g_player, PLAYER_CMD_RCVTIMEO, AOS_WAIT_FOREVER);
/* 播放之前创建的fifo码流 */
player_play(g_player, "fifo://tts/1", 0);

}

相关文章
|
8月前
|
存储 弹性计算 应用服务中间件
阿里云轻量应用服务器出新品通用型实例了,全球26个地域可选
近日,阿里云再度发力,推出了首款全新升级的轻量应用服务器——通用型实例。这款服务器实例不仅标配了200Mbps峰值公网带宽,更在计算、存储、网络等基础资源上进行了全面优化,旨在为中小企业和开发者提供更加轻量、易用、普惠的云计算服务,满足其对于通用计算小算力的迫切需求。目前,这款新品已在全球26个地域正式上线,为全球用户提供了更加便捷、高效的上云选择。
751 27
|
机器学习/深度学习 运维 监控
智能化运维:从反应到预防的变革之路
在数字化时代的洪流中,智能化运维如同一艘航船,载着企业乘风破浪。本文将带你领略智能化运维的魅力所在,探索它如何从传统的反应式维护转变为主动预防的智能管理。我们将一起揭开智能化运维的神秘面纱,看看它是如何在提高效率、降低成本和增强安全性方面发挥着不可或缺的作用。
|
存储 API 持续交付
探索微服务架构:构建灵活、可扩展的后端系统
【8月更文挑战第25天】 本文将引导您理解微服务架构的核心概念,探讨其对现代后端系统设计的影响。我们将从基础讲起,逐步深入到微服务的高级应用,旨在启发读者思考如何利用微服务原则优化后端开发实践。
111 4
|
机器学习/深度学习 算法 数据处理
【计算机视觉】数据获取、数据标注、数据增强的概念简介
【计算机视觉】数据获取、数据标注、数据增强的概念简介
369 0
|
消息中间件
【消息队列开发】 实现Router类——交换机的转发规则
【消息队列开发】 实现Router类——交换机的转发规则
|
XML 数据格式
SpringMVC中拦截器使用实践详解
SpringMVC中拦截器使用实践详解
209 0
|
数据可视化 数据挖掘 大数据
Python中的数据分析与可视化库Matplotlib简介
在当前大数据时代,数据分析和可视化成为了技术领域的热门话题。Python作为一门流行的编程语言,拥有丰富的数据处理和可视化库,其中Matplotlib是其中的佼佼者。本文将介绍Matplotlib库的基本概念、功能特点以及在数据分析与可视化中的应用。
171 0
|
存储 SQL 安全
教你精通JavaSE语法之第七章、类和对象
Java是一门纯面向对象的语言(Object Oriented Program,简称OOP,在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好!一切皆为对象!面向对象程序设计关注的是对象,而对象是现实生活中的实体,比如:洗衣机。但是洗衣机计算机并不认识,需要开发人员告诉给计算机什么是洗衣机。
179 0
标准真值表行、列、单元格计算方式
标准真值表行、列、单元格计算方式
334 0
标准真值表行、列、单元格计算方式
|
小程序 Android开发 数据安全/隐私保护
uni-app黑马优购项目学习记录(七)
uni-app黑马优购项目学习记录(七)
uni-app黑马优购项目学习记录(七)