百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 软件资讯 > 正文

Streamlit「体验视频交互式学习」

ninehua 2025-02-08 12:19 31 浏览


Streamlit[体验视频交互式学习]


一只小胖子

[互联网运营 | 直播电商 | 广告行业] 从业者

4 人赞同了该文章


说明: 本文可理解为MPV前两篇内容的后续篇,讲解基于网页交互的方式来学习视频,PDF笔记.

一只小胖子:MPV播放器系列(一)-剪辑在线视频5 赞同 · 17 评论文章

一只小胖子:MPV播放器系列(二)-完成课堂笔记5 赞同 · 2 评论文章

Streamlit是一款基于Python语言的开源库,支持通过Python编写简单的几行代码来直接生成丰富的前端可交互式界面. 在数据分析,智能AI团队场景中使用广泛.同时在个人应用场景开发上也非常的高效,简单实用.

官网展示的图表示例

有了它,我们能在绝大多数常见的应用场景中快速开发,免去再单独开发一套前端Web界面,不必像传统应用开发时,在写完后台业务代码的API后,还要再写前端来请求API读数据. 本文就来简单介绍一下,在具体场景中使用Streamlit它能解决什么问题. 官网介绍从这里点入:

https://streamlit.io/streamlit.io/

1.场景示例

使用Streamlit编写一个类似"飞书妙记"会议笔记,以及"十行笔记"应用.满足视频内容界面交互的功能.实现快速视频检索/播放/笔记记录及管理,以及对视频字幕内容进行定制分析等.这里的示例只是streamlit的基础功能展示,好让大家知道streamlit在开发交互式应用上是多么的高效.

十行笔记|专业的音视频AI笔记videoai.perspectivar.com/

飞书妙记-智能会议纪要,快捷语音识别转文字,将会议交流沉淀为知识,一切皆可妙记!www.feishu.cn/product/minutes

下面先放几张最终的交互效果图(注:案例支持PDF同样可使用Streamlit的HTML组件来加载):

应用左右布局主界面视频检索/播放/展示界面词云图及关键字分析笔记查看及管理界面功能

2.使用流程

  • 基础配置: 安装streamlit pip包 | 下载实例代码(另存为demo.py)

一.运行streamlit应用在终端/CMD下运行 streamlit run demo.py 来打开浏览器

二.直接在浏览器中操作,使用视频标题内容来检索内容(分析词频,快速检索,保存笔记等)

  • 如果本地已准备视频和字幕,以下第三/第四步骤可跳过,不然使用第三/第四步骤来准备

三.准备视频 通过直接下载或录制的方式把视频保存到目录上或者使用MPV的剪辑功能

四.生成字幕 下载并配置好VideoSrt软件,并把第三步的视频批量导入转换成字幕或文本

一. 基础配置

不再具体介绍PyCharm,Python的安装,Python我使用的是3.9的版本,PyCharm为社区版本.如下代码中第二行stream hello运行后浏览器会自动打开一个网址,显示了官方案例效果.

#?终端pip安装$?pip?install?streamlit?#?安装软件$?streamlit?hello??#?打开官方示例

二. 实例代码

这里直接放置代码内容及链接了,详细的说明及注释都写在代码里了,所以这里不再过多的解释.

GitHub内容链接: 实现飞书妙记/十行笔记等软件类似功能 , 如下为代码内容直接展示,方便上

不了外网的同学. 复制粘贴保存至demo.py后, streamlit run demo.py 运行可看到效果.

提示: 注意按自己的情况修改参数为视频目录 self.mpv_gen_path = " 你的视频文件夹目录 "

####?代码存为demo.py?通过streamlit?run?demo.py运行?#####?https://gist.github.com/sz1262011/b1e12e0fbd6570f91d444e77fb462415#?!/usr/bin/env?python3#?-*-?coding:?utf-8?-*import?streamlit?as?stimport?reimport?osimport?jiebafrom?collections?import?Counterimport?pyecharts.options?as?optsfrom?pyecharts.charts?import?WordCloudfrom?pyecharts.globals?import?ThemeType#?实现飞书妙记/十行笔记等软件类似功能#?作者:?一只小胖子#?版本:?V0.1#?知乎链接:??https://www.zhihu.com/people/lxf-8868class?VideoShowMain:

????def?__init__(self):
????????self.app_main_name?=?"交互式视频播放器?V1.0"??#?窗口标题
????????self.player_open_file_name?=?""??#?正在播放文件路径
????????self.player_open_file_srt?=?""??#?视频文件字幕信息
????????self.html_file_name?=?"./srt_basic.html"??#?生成词云图html文件位置
????????self.keywords_stat_content_str?=?""??#?关键词内容数据
????????self.keywords_stat_most_common?=?120??#?返回几个关键词
????????self.mpv_gen_path?=?"/Users/Likey/Downloads"??#?学习的视频来源
????????self.support_media_type?=?[".mp4",?".avi",?".mkv",?".mov",?".m3u8"]??#?支持播放的视频类型
????????self.srt_all_content?=?""??#?返回的全部字幕信息
????????self.srt_word_content?=?""??#?返回的字幕文本信息
????????self.question_input_form_num?=?1??#?笔记默认填空表格数
????????self.player_open_file_s_name?=?""??#?视频文件名称
????????self.book_note_file_path?=?""??#?笔记保存的路径
????????self.select_box_list?=?[]??#?文件下拉列表的内容

????#?文本分词操作
????def?split_word(self,?text):
????????word_list?=?list(jieba.cut(text))
????????#?去掉一些无意义的词和符号,我这里自己整理了停用词库
????????with?open('../停用词库.txt')?as?f:
????????????meaningless_word?=?f.read().splitlines()
????????result?=?[]
????????#?筛选词语
????????for?i?in?word_list:
????????????if?i?not?in?meaningless_word:
????????????????result.append(i.replace('?',?''))
????????return?result

????#?collections的使用?https://zhuanlan.zhihu.com/p/108713135
????#?统计词频
????def?word_counter(self,?words):
????????#?词频统计,使用Count计数方法
????????words_counter?=?Counter(words)
????????#?将Counter类型转换为列表,这里只返回前?1000?条数据
????????words_list?=?words_counter.most_common(1000)
????????return?words_list

????#?制作词云图
????def?word_cloud(self,?data):
????????(
????????????#?width='600px',?height='500px',?theme=ThemeType.MACARONS)
????????????#?设置词云图的基本属性
????????????WordCloud(init_opts=opts.InitOpts(width='100%',?theme=ThemeType.MACARONS)).add(
????????????????series_name="热点分析",
????????????????#?添加数据
????????????????data_pair=data,
????????????????#?字间隙rue
????????????????word_gap=3,
????????????????#?调整字大小范围
????????????????word_size_range=[15,?60],
????????????????shape="cursive",
????????????????#?选择背景图,也可以不加该参数,使用默认背景
????????????????#?mask_image='购物车.jpg')
????????????).set_global_opts(
????????????????#?title_opts=opts.TitleOpts(
????????????????#?????title="热点分析",?title_textstyle_opts=opts.TextStyleOpts(font_size=12)
????????????????#?),
????????????????tooltip_opts=opts.TooltipOpts(is_show=True),
????????????).render(self.html_file_name)??#?输出为html格式
????????)

????#?获取词云图网页内容,通过streamlit网页组件展示
????def?get_word_cloud_html_str(self,?html_file_name_):
????????st_file_arr?=?[]
????????st_file_lines?=?open(html_file_name_).readlines()
????????for?st_file_str?in?st_file_lines:
????????????st_file_arr.append(st_file_str.strip(""))
????????st_file_arr_str?=?"?".join(st_file_arr)
????????return?st_file_arr_str

????#?生成词云图
????def?gen_word_cloud_html(self,?s_text):
????????sword?=?self.split_word(s_text)
????????word_stat?=?self.word_counter(sword)
????????self.word_cloud(word_stat)

????????#?返回前self.keywords_stat_most_common个关键词(默认按词频降序)
????????srt_keywords_stat?=?""
????????#?for?x_obj?in?word_stat[:5]?#?取列表中前5个元组
????????#?元组取值?x_obj[0],?x_obj[1]
????????#?只返回关键词内容,不含统计数
????????for?(s_keyword_value,?s_keyword_count)?in?word_stat[:self.keywords_stat_most_common]:
????????????srt_keywords_stat?=?srt_keywords_stat?+?"?"?+?s_keyword_value

????????#?返回关键词内容字符串
????????self.keywords_stat_content_str?=?srt_keywords_stat
????????return?srt_keywords_stat

????#?字幕加载函数
????def?load_srt_content(self):
????????s_line_str?=?""??#?字幕内容(包括时间/序号)
????????s_content?=?""??#?字幕内容(只返回文本内容)
????????with?open(self.player_open_file_srt,?encoding="utf-8",?mode="r")?as?f:
????????????split_count_?=?0??#?用于按固定行分割,统计数
????????????for?line_str?in?f.readlines():
????????????????#?去除空行(第4行)
????????????????if?len(str(line_str).strip().strip("?"))?==?0:
????????????????????continue
????????????????#?当前匹配次数
????????????????split_count_?=?split_count_?+?1
????????????????line_str?=?line_str.strip()??#?去换行符号
????????????????#?每6行加换行符号
????????????????if?split_count_?%?3?==?0:
????????????????????s_line_str?=?s_line_str?+?line_str?+?"xx:"??#?分割符号
????????????????else:
????????????????????s_line_str?=?s_line_str?+?line_str?+?"???"
????????????????#?每3行取一次文本
????????????????if?split_count_?%?3?==?0:
????????????????????s_content?=?s_content?+?line_str?+?"???"
????????????#?返回所有字幕信息
????????????self.srt_all_content?=?s_line_str
????????????#?返回字幕文本信息
????????????self.srt_word_content?=?s_content

????#?按关键字搜索视频文件
????def?search_video_file(self,?s_key_word):
????????#?for?f_name?in?os.listdir(mpv_gen_path):??#?os.listdir?在文件夹不存在时会报错
????????if?not?os.path.isdir(self.mpv_gen_path):
????????????st.error("视频主存储目录不存在!")
????????????st.text("{}{}".format("视频目录:",?self.mpv_gen_path))
????????#?获取传入路径下的:?当前目录,?子目录列表,?文件列表
????????for?f_path,?dir_names,?f_names?in?os.walk(self.mpv_gen_path):
????????????#?去除.开头的隐藏目录及不支持的视频格式
????????????f_names?=?[f_name?for?f_name?in?f_names?if?not?f_name.startswith(".")?and?f_name.__contains__(".")
???????????????????????and?str("."?+?f_name.split(".")[1])?in?self.support_media_type]
????????????#?按关键字查询过滤视频文件名
????????????if?s_key_word?==?"*":
????????????????self.select_box_list?=?f_names??#?所有的视频文件列表值
????????????????pass
????????????else:
????????????????f_names?=?[f_name?for?f_name?in?f_names?if?str(f_name).__contains__(s_key_word)]
????????????#?选择的视频文件路径
????????????if?f_names:
????????????????video_file_name?=?st.selectbox("请选择要打开的文件:?",?f_names)
????????????????video_path_str?=?"{}{}{}".format(f_path,?"/",?video_file_name)
????????????????#?播放文件位置
????????????????self.player_open_file_name?=?video_path_str??#?返回视频播放地址
????????????????#?字幕文件位置
????????????????self.player_open_file_srt?=?os.path.splitext(video_path_str)[0]?+?".srt"
????????????else:
????????????????st.error("未查询到匹配结果!")

????????????break??#?只返回根目录下的内容,其它文件夹忽略

????#?界面初始化配置
????st.set_page_config(
????????page_title="交互式视频播放器",??#?st.get_option(""),
????????page_icon=":shark",
????????layout="wide",
????????initial_sidebar_state="auto",
????)

????#?界面初始化入口
????def?ui_main(self):
????????#?with?st.beta_container():
????????#?st.components.v1.html("
") ????????#?st.markdown("
",?unsafe_allow_html=True) ????????container1?=?st.beta_container() ????????#?streamlit界面布局(分列显示) ????????col1,?col2?=?st.beta_columns([5,?3])??#?各列占宽比例 ????????#?使用容器简单布局 ????????with?container1: ????????????st.header(self.app_main_name) ????????????st.markdown("
",?unsafe_allow_html=True) ????????????#?左侧的内容 ????????????with?col1: ????????????????#?设置背景音乐 ????????????????with?st.beta_expander(label="打开文件",?expanded=False): ????????????????????#?多文件载入 ????????????????????uploaded_files?=?st.file_uploader("设置背景乐",?type=['mp3',?'mp4'],?accept_multiple_files=True) ????????????????????for?uploaded_file?in?uploaded_files: ????????????????????????bytes_data?=?uploaded_file.read() ????????????????????????#?https://github.com/streamlit/streamlit/issues/904 ????????????????????????#?st.write("文件属性:",?uploaded_file.name,?uploaded_file.size,uploaded_file.type,?uploaded_file.id) ????????????????????????#?self.player_open_file_name?=?"/Users/Likey/Downloads/Learning?Human?Anatomy?with?SuperMemo.mp4" ????????????????????????st.audio(bytes_data) ????????????????#?按标题关键词搜索 ????????????????search_key?=?st.text_input("视频查询:?输入标题关键词回车?-?输入*查询所有",?"*") ????????????????if?search_key: ????????????????????#?视频播放地址已设置 ????????????????????if?self.player_open_file_name?!=?"": ????????????????????????#?字幕文件位置 ????????????????????????self.player_open_file_srt?=?os.path.splitext(self.player_open_file_name)[0]?+?".srt" ????????????????????????pass ????????????????????else: ????????????????????????self.search_video_file(search_key) ????????????????else: ????????????????????st.error("未输入标题查询关键词!") ????????????????????#?视频播放地址已设置 ????????????????????if?self.player_open_file_name?!=?"": ????????????????????????#?字幕文件位置 ????????????????????????self.player_open_file_srt?=?os.path.splitext(self.player_open_file_name)[0]?+?".srt" ????????????????????????pass ????????????????if?not?os.path.exists(self.player_open_file_name): ????????????????????#?st.error("视频文件:?{}?不存在!".format(self.player_open_file_name)) ????????????????????pass ????????????????if?not?os.path.exists(self.player_open_file_srt): ????????????????????st.error("未找到有效的字幕文件!") ????????????????????st.text("{}{}".format("字幕文件:",?self.player_open_file_srt)) ????????????????else: ????????????????????self.load_srt_content()??#?加载字幕文件 ????????????????#?生成词云图 ????????????????srt_keywords_str?=?self.gen_word_cloud_html(self.srt_word_content) ????????????????word_cloud_html_str?=?self.get_word_cloud_html_str(self.html_file_name) ????????????????#?显示云图(不能用%绝对长宽?expected?one?of:?int,?long,?float) ????????????????r_width?=?1100 ????????????????r_height?=?580 ????????????????r_scrolling?=?True ????????????????#?st.components.v1.html(word_cloud_html_str,?width=r_width,?height=r_height,?scrolling=r_scrolling) ????????????????with?st.beta_expander("查看词云图"):??#?指定高度值,未设置宽度 ????????????????????st.components.v1.html(word_cloud_html_str,?height=r_height,?scrolling=r_scrolling) ????????????????st.text("")??#?可以用st.write(" ")来换行并解析网页链接 ????????????????st.text("视频文件:"?+?self.player_open_file_name) ????????????????#?st.markdown("
",?unsafe_allow_html=True) ????????????????#?显示视频文件 ????????????????if?os.path.isfile(self.player_open_file_name)?and?os.path.exists(self.player_open_file_name)?and?????????????????????????os.path.splitext(self.player_open_file_name)[1]?in?self.support_media_type: ????????????????????st.video(self.player_open_file_name) ????????????????else: ????????????????????st.error("未找到有效的视频文件!") ????????????????#?#?展示关键字并设置样式 ????????????????#?st.text("关键词:?") ????????????????#?st.markdown("{}{}{}".format("**",?self.keywords_stat_content_str,?"**")) ????????????????st.markdown("
",?unsafe_allow_html=True) ????????????????s_question_answer_content?=?""??#?要添加的笔记内容 ????????????????#?获取文件名称部分 ????????????????player_open_file_name_?=?os.path.split(self.player_open_file_name)[1] ????????????????#?如果是网址的形式 ????????????????if?str(player_open_file_name_).__contains__("?"): ????????????????????#?文件名称 ????????????????????player_open_file_name_?=?player_open_file_name_.split("?")[0] ????????????????#?视频播放名称(本地OK,在线的短路径则需优化) ????????????????self.player_open_file_s_name?=?player_open_file_name_ ????????????????#?笔记文件名称 ????????????????if?player_open_file_name_?and?player_open_file_name_?!=?"": ????????????????????self.book_note_file_path?=?"{}{}{}".format(self.mpv_gen_path,?"/",?os ???????????????????????????????????????????????????????????????.path.splitext(player_open_file_name_)[0]?+?".txt") ????????????????with?st.beta_expander("笔记删除"): ????????????????????if?st.button("删除我的笔记"): ????????????????????????if?os.path.exists(self.book_note_file_path): ????????????????????????????os.remove(self.book_note_file_path) ????????????????????????????st.success("笔记删除成功!") ????????????????????????else: ????????????????????????????st.error("笔记已不存在!") ????????????????with?st.beta_expander("笔记加载"): ????????????????????if?st.button("加载笔记内容"): ????????????????????????if?os.path.exists(self.book_note_file_path): ????????????????????????????with?open(self.book_note_file_path,?encoding="utf-8",?mode="r")?as?f_: ????????????????????????????????st.text("".join(f_.readlines())) ????????????????????????else: ????????????????????????????st.error("笔记尚未创建,请点?[保存笔记]?创建!") ????????????????with?st.beta_expander("笔记设置"): ????????????????????st.text("视频名称:"?+?self.player_open_file_s_name) ????????????????????st.text("笔记文件:"?+?self.book_note_file_path) ????????????????????book_note_description_text?=?st.text_area("笔记描述") ????????????????for?i?in?range(1,?self.question_input_form_num?+?1): ????????????????????book_note_question?=?st.text_input(str(i)?+?".问题") ????????????????????book_note_answer?=?st.text_area(str(i)?+?".答案") ????????????????????#?要写入的内容 ????????????????????s_question_answer_content?=?s_question_answer_content?+?" {}:?{} {}:?{}"????????????????????????.format("Q",?book_note_question.rstrip("?"),?"A",?book_note_answer.rstrip("?")) ????????????????if?st.button("保存笔记"): ????????????????????if?not?os.path.exists(self.player_open_file_name): ????????????????????????st.error("没有正在播放的视频,请先打开要播放的视频!") ????????????????????else: ????????????????????????#?创建文件 ????????????????????????if?not?os.path.exists(self.book_note_file_path): ????????????????????????????with?open(self.book_note_file_path,?"w")?as?f_: ????????????????????????????????if?book_note_description_text: ????????????????????????????????????f_.writelines("{}{}{}".format("######[",?book_note_description_text,?"]######")) ????????????????????????????????else: ????????????????????????????????????f_.writelines("######[描述信息]######") ????????????????????????????????f_.writelines(s_question_answer_content) ????????????????????????else: ????????????????????????????#?读取文件 ????????????????????????????with?open(self.book_note_file_path,?"r")?as?f_: ????????????????????????????????#?匹配描述信息(所有字符) ????????????????????????????????pattern?=?re.compile(r"######([sS]*)######") ????????????????????????????????s_line_str_list?=?[]??#?最终写入的内容 ????????????????????????????????for?s_line_str?in?f_.readlines(): ????????????????????????????????????if?pattern.match(s_line_str): ????????????????????????????????????????#?st.write(pattern.match(s_line_str)) ????????????????????????????????????????s_desc_text?=?pattern.match(s_line_str).groups()[0] ????????????????????????????????????????#?修改描述信息 ????????????????????????????????????????if?book_note_description_text?!=?s_desc_text: ????????????????????????????????????????????#?如果没有输入描述,写入默认 ????????????????????????????????????????????if?book_note_description_text.strip("?")?==?"": ????????????????????????????????????????????????book_note_description_text?=?"在此输入你的描述信息" ????????????????????????????????????????????s_line_str_list.append( ????????????????????????????????????????????????"######["?+?book_note_description_text?+?"]######") ????????????????????????????????????????else: ????????????????????????????????????????????s_line_str_list.append("######["?+?s_desc_text?+?"]######") ????????????????????????????????????elif?len(s_line_str.strip().strip("?"))?>?0: ????????????????????????????????????????s_line_str_list.append(s_line_str.strip()) ????????????????????????????????#?添加的答案信息 ????????????????????????????????s_question_answer_list?=?[_str?for?_str?in?s_question_answer_content.split(" ") ??????????????????????????????????????????????????????????if?len(_str.strip("?"))?>?0] ????????????????????????????????s_line_str_list.extend(s_question_answer_list) ????????????????????????????????#?st.write(s_line_str_list) ????????????????????????????????#?最终写入的内容 ????????????????????????????????book_note_all_content?=?" ".join(s_line_str_list) ????????????????????????????#?保存文件 ????????????????????????????with?open(self.book_note_file_path,?"w")?as?f_: ????????????????????????????????f_.writelines(book_note_all_content) ????????????????????????st.success("笔记创建成功!") ????????????????????????st.balloons()??#?气球效果 ????????????#?显示右侧的字幕内容 ????????????with?col2: ????????????????#?显示关键词 ????????????????with?st.beta_expander(label="查看关键词",?expanded=True): ????????????????????st.markdown("{}{}{}".format("",?self.keywords_stat_content_str,?"")) ????????????????st.text("") ????????????????#?st.write(" **".join(self.srt_word_content.split("xx:"))) ????????????????#?st.markdown("
",?unsafe_allow_html=True) ????????????????#?st.components.v1.html("
") ????????????????#?显示字幕信息 ????????????????st.text_area("视频讲话内容",?value=" ".join(self.srt_all_content.split("xx:")),?height=1600, ?????????????????????????????max_chars=None,?key=None) ????????????#?line_str_list?=?[line_str.strip()?re.find("d",?line_str).match()] ????????????#?st_content?=?("".join(line_str_list))??#?
????????#?结束 ????????st.markdown("
",?unsafe_allow_html=True)#?程序类入口if?__name__?==?'__main__': ????video_main?=?VideoShowMain() ????video_main.ui_main()

三. 获取视频

方法有很多种,为了和之前知识联系起来,除常规下载外你也可以使用之前的MPV视频在线剪辑方法截取网上长视频的部分视频片段到本地磁盘. 此外还可以对在线播放的视频使用视频录制功能保存下来,直接使用ffmpeg或者PotPlayer就可实现.

1. 如是是MPV播放器,使用如下链接中的方法,播放时通过字母C选定开头及结尾,使用字母O键导出录制,直接在MPV播放器界面上操作即可,这种方式基本原理上是使用了ffmpeg的 -i 参数.

一只小胖子:MPV播放器系列(一)-剪辑在线视频5 赞同 · 17 评论文章

mpv播放时剪辑在线视频

2.如果你使用的是PotPlayer播放器的话,它有个录制的功能,直接使用它自带的录制功能即可.

PotPlayer播放时录制功能

ffmpeg转存直播为本地视频www.jianshu.com/p/3180c4626733

慕课网:FFMPEG常用命令69 赞同 · 5 评论文章

##?录视频
ffmpeg?-framerate?30?-f?avfoundation?-i?0?out.mp4?

-framerate?限制视频的采集帧率。这个必须要根据提示要求进行设置,如果不设置就会报错。
-f?指定使用?avfoundation?采集数据。
-i?指定视频设备的索引号。

##视频+音频
ffmpeg?-framerate?30?-f?avfoundation?-i?0:0?out.mp4?

##?录音
ffmpeg?-f?avfoundation?-i?:0?out.wav

四. 生成字幕

字幕文件生成我使用的是一款开源软件.在之前的文章中我有详细介绍过.当然,市面上有多种方案来提取字幕信息,适合自己就是好的.我推荐你使用VideoSrt或者使用ffmpeg / pydub / 百度API语音接口自己开发等两种方式来实现,主要是开源,高度可定制化,实现起来也不复杂.

如果你不会代码也没有关系,我这里讲解的是VideoSrt,直接配置下使用就好. VideoSrt是一款开源的批量一键字幕生成 / 字幕翻译小工具可以通过自定义配置来支持调用腾讯/阿里/百度/迅飞等厂商提供的语音引擎.你可以参考如下的链接:

一只小胖子:常见的-语音转文本及字幕方案3 赞同 · 1 评论文章

https://gitee.com/641453620/video-srt-windowsgitee.com/641453620/video-srt-windows

如上: 项目链接上提供了详细的说明以及B站的示例操作,按操作一步步配置下就可以使用了,下图是我配置好后批量视频转字幕后的效果.

使用VideoSrt批量生成字幕

至此,你就可以愉快的在一个界面完成所有的操作了,快速搜索及打开视频,控制播放,分析字幕内容,实时对每个播放视频保存笔记了.....

本文结束...


我是一只热爱学习的小胖子,如果你也热爱学习,并且对SuperMemo感兴趣,欢迎转发和评论!


相关推荐

数据可视化——R语言为ggplot图形添加P值和显著性水平

很久很久没有写原创文章了,今天给大家写一个大家发论文都用的到的操作--------为ggplot图形添加P值和显著性水平。建议先点收藏,再点关注,因为本文很长。掌握了本文,用R语言画下面这种图就不求人...

R语言从入门到精通:Day7(r语言入门教程)

原创小浣熊科研猫是时候关注我们一波了在向reviewer或者导师展示自己的统计分析结果时,一张图往往顶得上千言万语;在刚接触到数据时,图也能帮助我们发现数据中潜在的模式或者其中的异常值,这两个例子...

360儿童手表3评测 孩子遇危险一键SOS

儿童人身安全问题一直是家长最担忧的大事,多年来频频发生的儿童走失悲剧更是将这一话题推向了舆论高峰,在这个基础上,能打电话、防走丢的儿童智能手表迅速走红,可以说多了一剂强有力的助推剂。可以说,360儿童...

眼保健操想做就做,全面呵护孩子视力!喵喵儿童护眼仪体验

现在的孩子学习压力都很大,平时除了线下作业外,线上作业也不少,不是拍照上传小管家,就是录制视频发到班级群。作为家长的我们不能只关注孩子的学习,更要关注孩子的视力。根据国家卫健委数据显示,2020年我国...

用眼过度?一套恢复视力的米字操 飞行员都用的护眼方法了解一下

咱都知道,现在这生活里,电子产品无处不在,不管是上班用电脑,下班刷手机,眼睛那是一刻都闲不下来,好多人都有用眼过度的毛病。眼睛干干痒痒的,时不时还流眼泪,近视、老花眼等问题也都找上门来了。今天啊,我就...

软硬件齐发力,OPPO Find X8手机配备五大屏幕护眼技术组合

 直到现在2024年,依然有不少消费者非常青睐LCD屏幕的手机,无他,皆是因为LCD屏幕相较于传统的OLED屏幕来说,护眼性能确实要更胜一筹。而全新发布的OPPOFindX8则在软硬件上齐发力,通...

一只360°的智能眼睛------360智能摄像机云台AI版

在数字安防物联网飞速发展的当今,很多品牌都在不断崛起,360作为其中的佼佼者,也推出了不少这类的产品,从第一代水滴摄像头开始,360可谓在可视安防品类的产品上保持了高速发展的态势,无论是室内还是室外...

扩展功能强大:文本编辑器EditPlus 3.8下载

IT之家(www.ithome.com):扩展功能强大:文本编辑器EditPlus3.8下载IT之家讯文本编辑器EditPlus最近更新到3.80版,此次更新增加了和改进了包括对不同文件类型适配不...

世上的计算机只有两种字体(世上的计算机只有两种字体是什么)

还在纠结在你的下一个演示文稿中要不要使用宋体显示小字,或是你打算在你的论文中使用微软雅黑字体吗?今天的推送就来给大家介绍一下两大字体系列:serif和sans-serif。Serif字体如Times...

安卓字体大师2.0.1更新 增加字体搜索及分类功能

手机自带字体看久了想要换个新面貌?如何才能轻松换得新字体呢?机友们有福了!字体控们更是不容错过!作为一款强大的字体美化管家,字体大师2.0.1更新再添个性周到化服务。此次更新,字体大师增加了字体搜索和...

升职加薪全靠它,6款B站知乎上万人推荐的宝藏神器!强烈建议收藏

今天,我们给大家推荐6款电脑软件,B站知乎上万人推荐,每一个都强大到没朋友,升职加薪全靠它,下面一起来看看吧!1.Quicker这是一款能提高我们工作效率的神器,其能帮我们快速打开一些常用工具,像执行...

18种好看的电子书字体推荐!(附实机照片)

对kindle自带的黑体楷体宋体圆体腻味了吗,其实kindle可以自定义字体的,下面推荐几款好看的电子书字体,话不多说直接上干货(以下图片均为kindleoasis2代实机拍摄,方便大家感受各类...

只需万元就能打造媲美影院的环绕音效,JBL BAR 1000回音壁真不错

自从给卧室更换了全新的智能投影,我就发现客厅电视的使用频率变低了,和家人探讨了一下,大家都一致认为这台电视的音效不如新换投影的效果好,但要真说因为音效再换一台电视又觉得不值。纠结再三之后,决定入手一套...

外国歌手杀疯了!比官方机位更震撼的是直播机位的现场舞台,真牛

刷到是缘分,感谢大家的阅读,希望您能动动小手帮忙点赞,关注,评论。你的支持和鼓励是我前进的动力。在此祝福大家天天快乐,日日开心!0102外国歌手这现场表现力真是绝了,直播机位捕捉到的细节比官方镜头更有...

使命召唤手游开启测试,战区手游下载方法/登录教程

《使命召唤》手游澳大利亚服在11月30日开启测试,应该有很多网友都有所了解。作为一款高人气的FPS游戏,《使命召唤》在国外的地位甚至可以与CF和PUBG相媲美了。而且截止到目前,官方针对不同的地区都推...