音视频播放对应文字同步高亮且滚动到指定位置(scrollTop)

保姆级教程:用Android TTS实现有声读物App的逐句高亮与播放控制 本文详细介绍了如何利用Android TTS(TextToSpeech)技术开发专业级有声读物App,涵盖逐句高亮、播放控制等进阶功能。通过代码示例展示了引擎选择、语言包管理、句子队列控制及语音参数调整等关键技术点,帮助开发者实现类似卡拉OK字幕的沉浸式阅读体验。 阅读详情
  • 需求
    播放音频或者视频,对应文字高亮展示以及滚动到该位置,红色方框是一个scroll
    如图下图

  • 数据
    数据类型

  • 代码

<div class="col-sm-12 float-none new-content" height="652">
    //some infos
    <input type="hidden" paraid="1" idindex="2" starttime="33.0" endtime="0.0" begintime="33">
    <p>最近有一部大尺度反腐剧《以人民的名义》火了,剧中饰演人民好官的达康书记成了最热门的网红,秒杀一众锥子脸。</p> 
    <span class="hidden">次处是对应的翻译</span>
</div>
//init定义每个元素的top位置(改变滚动条的位置时使用)
$(".new-content").each(function(){
    $(this).attr("height",$(this).offset().top);
});
//基本高度
heightFirst = $(".new-content:first").attr("height");
//media为空表示非媒体类型
if(media != ''){
    mediaEventListener(media);                  
}
function mediaEventListener(media){
    var mediaElement = $(media)[0];
    //效果:时间更新时间(每秒调用2-3次该函数)
    mediaElement.addEventListener('timeupdate', function(e){
        currentPlay(e.currentTarget.currentTime);
    });
    //循环播放事件
    mediaElement.addEventListener("playing", function(e){
        var currentTime = e.currentTarget.currentTime;
        if(currentTime == 0){
            $("#newInfoList").scrollTop(0);
            $(".current-play").removeClass('current-play');
        }
    });
}

/**
 * 当前播放时间
 * 正常情况下每秒调用2-3次
 * 快进或者快退时,每次调用间隔时间比较大
 * 基本思路:正常播放时根据beginTime,判断当前的播放位置,是否需要改变当前高亮行与滚动条位置
 *     快进或者快退:比较时间,判断快进还是快退,通过向上(prev())或者向下(next())遍历,确定对应的播放位
 * 置。通过init的每行的height的值,判断滚动位置。并记录本次currentTime,用于下次是否是快进或
 * 者快退,若每行的高度改变,那么初始化height对应的值
 * @param time
 * @returns
 */
function currentPlay(currentTime){
    //当前高亮行,current-play为高亮css(class)
    var play = $(".current-play");
    //是否需要调整滚动条的位置
    var scrollFlag = false;
    //通过比较timeLast判断是否时快进或者快退(间隔时间比较大)
    if(Math.abs(currentTime-timeLast)>1){
        var beginTime = play.find("input").attr("beginTime");
        var nextBeginTime = play.next().find("input").attr("beginTime");
        //判断是快进或者快退
        var playTag = play;
        //直接从开始快进到最后(音视频在结尾没有对应文字的情况)
        if(play.length == 0){
            var last = $(".new-content:last");
            $("#newInfoList").scrollTop(last.attr("height"));
            last.addClass('current-play');
            return;
        }
        if(currentTime<beginTime){      //快退 time小于当前高亮行的beginTime,或者循环播放
            //纠正播放高亮行
            while(true){
                var element = playTag.prev();
                if(element.length==0){
                    //快退到没有对应文字的位置
                    //改变滚动条的位置
                    $('#newInfoList').scrollTop(0);
                    play.removeClass("current-play");
                    break;
                }
                //上一文本的播放时间
                var prevBeginTime = element.find("input").attr("beginTime");
                //当前播放时间大于上一播放时间,表示位置正确(若小与说明位置不对)
                if(currentTime>prevBeginTime){   //高亮
                    scrollFlag = true;
                    play.removeClass("current-play");
                    element.addClass('current-play');
                    break;
                }else{
                    playTag = element;
                }
            }
        }else if(currentTime > nextBeginTime){ //大于下一高亮行的beginTime 快进
            while(true){
                var element = playTag.next();
                if(element.length==0){
                    //到达底部
                    var last = $(".new-content:last");
                    play.removeClass('current-play');
                    last.addClass("current-play");
                    $("#newInfoList").scrollTop(last.attr('height'));
                    break;
                }
                var nextBeginTime = element.find('input').attr("beginTime");
                var thisBeginTime = playTag.find("input").attr("beginTime")
                console.log("current:" + currentTime + " this:" + thisBeginTime + " next:" + nextBeginTime);
                //位置正确
                if(currentTime < nextBeginTime && currentTime > thisBeginTime){
                    play.removeClass('current-play');
                    playTag.addClass('current-play');
                    scrollFlag = true;
                    break;
                }else{
                    playTag = element;
                }
            }

        }
    }else{
        //正常播放处理
        var next = null;
        if(play.length == 0){
            next = $("#newInfoList").find(".new-content:first");
        }else{
            next = play.next();
        }
        var startTime = next.find("input").attr('startTime');
        if(startTime-currentTime<0.5){
            play.removeClass("current-play");
            next.addClass("current-play");
            scrollFlag = true;
        }           
    }
    //滚动到指定位置
    if(scrollFlag){
        $("#newInfoList").animate({
            scrollTop : $('.current-play').prev().attr("height") - heightFirst
        },10);
    }
    timeLast = currentTime;
}

音视频播放时,对应文字同步高亮,思路是接口返回的数据中带有的Timing的值。scrollTop也是根据高亮的位置,滚动到事先定义好的(div的heigth属性)位置

【信息科学与工程学】计算机科学与自动化——第六十三篇 人机交互之前端交互参数知识库02 每个分支下又细分了四个关键方向,并按照“研究对象/焦点、基本问题、核心理论/概念、研究方法、应用/目标、前沿/发展”的框架进行阐述,严格遵循了六级编码体系。在最终整合时,应建立唯一的学科分类编码表(例如,用两位数字或“ART”、“MED”、“ECO”等字母前缀),并确保所有下级编码(尺度、层次、类别、子类、具体项)的逻辑一致性。此回答中的编码为示例,实际系统需据此调整。控制过程(前馈、同期、反馈)、全面质量管理(TQM)、平衡计分卡(BSC)定量(调查、实验)、定性(访谈、民族志)、混合方法、大数据。 阅读详情

相关推荐

实现Android音乐播放器中的歌词同步滚动功能

本文还有配套的精品资源,点击获取 简介:本项目是一个关于音乐播放体验的Android开发项目,利用Java语言实现实时歌词滚动,提高用户听歌的沉浸感。项目覆盖了音乐播放框架、歌词解析、时间同步、UI滚动、线程管理、资源管理和用户交互等多个技术点。开发者可以通过学习本项目的源码,深入了解Android音乐播放器及歌词同步技术的实现细节。 1. 音乐播放框架的使用与选择 ...

weixin_33812391的博客 1705

Android高亮效果,Android实现文字动态高亮读取进度效果

本文实例为大家分享了Android实现文字动态高亮读取进度的具体代码,供大家参考,具体内容如下1、效果图类似歌词的效果。播放下面文字的音频,同时音频播放的进度和文字高亮进度保持一致。2、代码结构和实现简单的类图:ISubtitleView接口代码如下:/*** 简要功能描述* * ** @author : liuxs* @date : 2021/3/18*/public interface ISu...

weixin_30348133的博客 594

音频PCM播放

音频PCM播放

android 歌词逐渐高亮,Android--MediaPlayer音乐播放器歌词随时间高亮显示

package com.mrzhu.hightlight;import android.app.Activity;import android.graphics.Color;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.text.Spannable;impor...

weixin_29188759的博客 350

android文字高亮

高亮显示特殊信息,例如微博中的@ ##或者是url等等

android 音乐播放歌词高亮自动滚动,歌词换行等功能完美解决方案

歌词滚动项目完美解决方案 功能: 1、自动加载MP3文件和歌词文件,支持assets和SD卡加载文件, 2、准确读出MP3文件的总长时间; 3、播放MP3文件,歌词高亮,自动滚动歌词; 4、支持点击播放,点击某行歌词则播放该行MP3对于音频内容; 5、支持seekbar 拖动播放,则歌词文件自动跳转到对于节点; 6、支持文字歌词换行、歌词大小自定义、歌词颜色自定义; 7、定制滚动模式,逐行滚动或者逐页滚动;

Android 实现歌曲播放时歌词同步显示

From:http://www.2cto.com/kf/201305/212102.html

MaximusKiang的专栏 1004

【rPPG】基于多光谱摄像头的非接触式睡眠血氧监测系统(传统建模方法解析)

本文深入解析了基于多光谱摄像头的非接触式睡眠血氧监测系统,重点探讨了rPPG技术的原理、硬件设计及传统建模方法。通过多光谱摄像头捕捉皮肤微弱光学变化,实现医疗级精度的心率和血氧监测,特别适合长期睡眠监测场景。文章详细介绍了摄像头选型、照明系统设计以及PBV模型等核心技术,并对比了与传统传感器的性能差异。

weixin_30300225的博客 561

聊天语音转写的文字记录显示框内,聊天语句随聊天音频播放而滚动,定位并高亮显示

具体实现如下图:

ma_luping的博客 1008

IKM 测试题 - Java SE 8 评估测试题目

IKM 测试题 - Java SE 8 评估测试题目

licheng11y的博客 1313

【RTOS】 Vxworks 653 第一章 —— 初识 vx653 3.x

。。不是很重要,自己搜吧鲁棒分区是一种确保共享计算资源中独立运行功能实现​​时空隔离​​的机制,其目标是为集成模块中的混合临界性应用提供与联邦式部署(federated implementation)同等级别的功能隔离保障。具体表现为:​​多关键性共存​​:支持不同安全等级应用(如飞控系统A级与娱乐系统D级)在同一模块中协同运行。​​抗干扰能力​​:防止未授权或意外的时空干扰(如内存越界、时间窗口冲突),确保应用间互不影响。​​。

qq_38183694的博客 1280

JavaScript-歌词展示与音乐同步

一、歌词数据 1、歌词加载 2、把歌词解析为JS对象 3、把搜集好的歌词信息,展示到页面上 4、整体代码 二、歌词与音乐同步 1、歌词和音乐展示 2、歌词和音乐同步,当前行高亮,随播放滚动

m0_51315555的博客 4570

MTK眼中6G物理层与无线协议的进化之路

提议统一波束和小区级的测量、报告和切换框架/流程,进一步减少移动性切换过程中的中断,采用可扩展框架/流程,允许在不同移动性场景中进行部分用户设备配置更新以实现快速切换,支持用户设备发起的移动性(同步/切换)以降低延迟和因信令交换导致的失败,设计移动性RS以实现空闲状态下的节能和连接状态下的无缝用户体验,实现5G/6G间的无缝互操作移动性,为固定无线接入(FWA)提供潜在增强,构建统一的跨层移动性框架以降低复杂度、减少中断和失败。为适应多样化的流量类型,需要灵活的帧结构和高层时间对齐。

asd199086的博客 1745

一段关于文字音乐高光效果的设置代码摘录.

本段代码转自一个示例代码. 播放器文字高光效果: -(void)settext:(NSString *)te {     if (text!=nil)     {         [text release];         text = nil;     }     text = [te retain];          CGSize size1 = [

icekiller 1396

结合qtdesigner,用pyqtgraph在界面上绘制波形图(一)

思路:先画图,然后在qtdesigner上放一个容器,给这个容器添加一个布局,然后把图当作一个Widget放入布局中。二、PyUIC把test.ui转换成test.py,再新建一个load_test.py写脚本。就这么简单,基础部分就完成了。也可以给它添加样式,我知道的样式不算多,但会继续写。一、随便拖进来一个容器控件,我拖了一个Widget。要想把波形图显示在界面上,核心思想其实很简单。三、load_test.py的代码。

learninger_lt7的博客 1802

DMA 定制固件教程:小白跟做即得单人固件,超详细纯喂饭教程,100% 成功秘籍!FPGA仿真1:1、中断逻辑和TLP核心都在。

DMA 定制固件教程 小白跟着操作做可以做出的单人固件。DMA仿真技术io、中断逻辑,从零仿真。图文链接教程:https://docs.qq.com/doc/DQ01lVGtHelROVHNv

qq_15741349的博客 3万+

DELPHI实现文本文件显示和声音同步播放

---- 一、材料的制作 ---- 首先,我们选择几篇文章,这里我们选择马丁路德金、林肯和里根的演说,每一篇文章分为若干句,在制作声音文件时,记下每个句子的开始时间和结束时间,然后将其记到一个数据表中,这个表有如下字段:NO、TEXT、STARTTIME,分别表示每句序号、内容、开始时间。 ---- 二、 界面的制作 ---- 在DELPHI中创建一个新工程,在FORM中放入多媒体控件,RTF编辑...

weixin_34220963的博客 238

基于深度学习的垃圾邮件识别

垃圾邮件的大量存在严重威胁着电子邮件系统的安全和效率。基于深度学习的垃圾邮件识别技术已经成为目前最有效的解决方案之一。本文将详细介绍使用深度学习技术进行垃圾邮件识别的方法,并提供相应的代码实现。 随着电子邮件的广泛应用,垃圾邮件的数量不断增加,传统的规则和统计方法已经无法满足对垃圾邮件进行准确识别的需求。深度学习技术以其强大的模式识别能力和自动特征提取能力成为解决垃圾邮件识别难题的有效工具。

一键难忘的博客 1093

Android WebView代码高亮

引用自http://www.xukailun.me/article/200/ 先说明,本博客是参考了上面的博客后,通过自己的总结写出来的。 要使用WebView来做代码高亮,其实是跟浏览器上的原理一样的,无非都是css和js。这些css和js是有现成的了,来自SyntaxHigh...

chijin6756的博客 362

彻底摆脱文献只能读开头的痛苦!这款文献检索神器真能帮你跨越文献付费限制(附实操演示)

大家是不是有过这样的经历,好不容易通过关键词搜到了和自己主题高度相关的文献,想要快速获取文献信息,推进研究进度,却又因为付费或者需订阅才能下载PDF,而被劝退。粘贴完成后,点击搜索,搜索结果页面会显示这篇文献的相关信息,有的文献有“下载PDF”,有的文献则只有“求助PDF”,不管是哪种情况,直接点击进入;我这里点击的是“下载PDF”,接着它会跳转页面。我用 Book 学术下载过不少付费文献,实测下来 80% 左右的文献,都能通过它的求助方式成功获取到,只有少部分文献等待的时间会稍微久一些或者没办法下载。

qq_64378896的博客 162

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

WebRTC 音视频同步原理与实现

所有的基于网络传输的音视频采集播放系统都会存在音视频同步的问题,作为现代互联网实时音视频通信系统的代表,WebRTC 也不例外。本文将对音视频同步的原理以及 WebRTC 的实现做深入分析...

音视频开发进阶 1064

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Android 文字动态高亮读取进度效果

文章目录1,效果图2,代码结构和实现3,其它 1,效果图 类似歌词的效果。播放下面文字的音频,同时音频播放的进度和文字高亮进度保持一致。 2,代码结构和实现 简单的类图: ISubtitleView接口代码如下: /** * 简要功能描述 * <p> * <详细功能描述> * * @author : liuxs * @date : 2021/3/18 */ public interface ISubtitleView { /** * 获取当前的带

weixin_41605683的博客 613

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

原生js实现音乐播放器功能,可以实时显示歌词并且高亮当前句

最近在做项目,总结一下学到的知识, 首先就是一个简单的音乐播放器。可以显示歌词,并且突出显示当前播放的这一句。

眉目成书 9859

语音朗读带进度高亮显示

语音朗读文章,支持高亮显示,自动滚动播放位置,支持播放进度显示,支持进度条拖动朗读位置!语音SDK使用自科大讯飞! github:https://github.com/baiyuliang/VoiceSpeekHighLight ...

白玉梁的专栏 2197

前端显示代码高亮

前端显示代码高亮 Time:2021-3-22 前言 搭建博客网站的过程还真是多bug…什么奇奇怪怪的问题都有,很大原因就是这个VueCLI版本太高级了…都没什么关于这个版本的使用的资料,中文的官方文档简单的就好像什么都没说,基本的vue语法就那样,但是工程的结构和一些关键API却没有详细说明,难受。使得我总是只能自己不断揣测和尝试。这个代码高亮也是,搞了两天,终于才觉悟问题何在。 转载请注明出处!!! Author:雾雨霜星 欢迎来我的个人网站进行学习: https://www.shuangxing.to

weixin_44786238的博客 2902
上一篇: Easyui 在dialog中加载datagrid,并实现可拖放行(drag and drop rows)
下一篇: ffmpeg 音频转amr
effiu
博客等级 码龄14年 24粉丝 18原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值