有些视频如(rmvb)视频在使用vlc播放器播放时会出现进度条不能刷新的问题,
通过Java层代码找到刷新进度条的接口。是通过public native long getLength()(MediaPlayer Java文件中);本地函数得到具体要更新的值。

jlong Java_org_videolan_libvlc_MediaPlayer_getTime(JNIEnv *env,
jobject thiz) {
vlcjni_object *p_obj = VLCJniObject_getInstance(env, thiz);
if (!p_obj)
return -1;
return libvlc_media_player_get_time(p_obj->u.p_mp); }

而libvlc_media_player_get_time 所在位置是在vlc库中,这段代码实在Linux中编译通过的。在vlc/lib/media_player.c文件中实现。

libvlc_time_t libvlc_media_player_get_time( libvlc_media_player_t *p_mi )
{
input_thread_t *p_input_thread;
libvlc_time_t i_time;

p_input_thread = libvlc_get_input_thread ( p_mi );
if( !p_input_thread )return -1;i_time = from_mtime(var_GetInteger( p_input_thread , "time" ));
vlc_object_release( p_input_thread );
return i_time; }

而具体的进度是通过读取p_input_thread这个指针结构体的变量而得到的。

VLC_USED static inline int64_t var_GetInteger( vlc_object_t *p_obj,
const char *psz_name ) {
vlc_value_t val;
if( !var_GetChecked( p_obj, psz_name, VLC_VAR_INTEGER, &val ) )
return val.i_int;
else
return 0; }

下面函数就是通过在p_obj中查找“time”关键字,把对应的内存值赋给变量val,得到时间。
现在要去分析这个input_thread_t *p_input_thread变量是什么时候被创建,并且是哪个线程在实时的进行对其维护更新的。
带着问题我们分析,这个函数读取的时候视频文件已经在播放了。

void Java_org_videolan_libvlc_MediaPlayer_nativePlay(JNIEnv *env,
jobject thiz) {
vlcjni_object *p_obj = VLCJniObject_getInstance(env, thiz);
if (!p_obj)
return;
libvlc_media_player_play(p_obj->u.p_mp); }

这个函数就是负责播放的函数。

var_AddCallback( p_input_thread, “program-scrambled”,
input_scrambled_changed, p_mi );
var_AddCallback( p_input_thread, “intf-event”, input_event_changed, p_mi );
add_es_callbacks( p_input_thread, p_mi );

if( input_Start( p_input_thread ) )
{unlock_input(p_mi);del_es_callbacks( p_input_thread, p_mi );var_DelCallback( p_input_thread, "intf-event", input_event_changed, p_mi );。。。。。。
}

这段代码是libvlc_media_player_play函数实现的一段代码,通过input_Start函数将p_input_thread作为实参。

int input_Start( input_thread_t *p_input ) {
assert( !p_input->p->is_running );
/* Create thread and wait for its readiness. */
p_input->p->is_running = !vlc_clone( &p_input->p->thread,
Run, p_input, VLC_THREAD_PRIORITY_INPUT );
if( !p_input->p->is_running )
{
input_ChangeState( p_input, ERROR_S );
msg_Err( p_input, “cannot create input thread” );
return VLC_EGENERIC;
}
return VLC_SUCCESS; }

使用vlc_clone函数创建线程,

int vlc_clone (vlc_thread_t th, void (entry) (void ), void *data,
int priority) {
(void) priority;
return vlc_clone_attr (th, entry, data, false); }



这个的这个start_routine函数就是vlc_clone( &p_input->p->thread, Run, p_input, VLC_THREAD_PRIORITY_INPUT ); 传递进来的Run函数。
vlc_clone函数在vlc\src\input\input.c文件中,Run函数也在本文件中。

/******************************************************************* * Run: main thread loop * This is the “normal” thread that spawns the input processing chain, * reads the stream, cleans up and waits
*******************************************************************/ static void *Run( void *obj ) {
input_thread_t p_input = (input_thread_t )obj;

vlc_interrupt_set(&p_input->p->interrupt);if( !Init( p_input ) )
{MainLoop( p_input, true ); /* FIXME it can be wrong (like with VLM) *//* Clean up */End( p_input );
}input_SendEventDead( p_input );
return NULL; }

主函数MainLoop有点想Linux系统中init进程启动后进入的函数名称。

上面是对整个vlc播放器源码的分析,至于对time当前时间不更新,是解码时间的参数有问题,我的解决方法,直接升级ffmpeg解码模块。找到ffmpeg源码所在目录,修改sh文件。将下载最新的源码拷贝进去编译。生成静态库。问题完美解决。

vlc 播放器的播放进度条的时间不刷新相关推荐

  1. android第三方开源音频播放器,Android第三方开源SeekBarCompat:音乐类播放器等APP进度条常用...

     Android第三方开源SeekBarCompat:音乐类播放器等APP进度条常用 Android平台原生的SeekBar设计简单,然而,比如现在流行的一些音乐播放器的播放进度控制条,如果直接使 ...

  2. 前端 mediaRecorder 录制视频源代码实例,和本地播放器无法定位进度条问题分析和解决

    问题 mediaRecorder 本质上录制的是webm 当我们使用getUserMedia.MediaRecorder等API生成的webm视频时,会发现最终的webm是无法拖动进度条的 解决方案 ...

  3. html5模仿手机音乐播放器(添加音乐进度条和时长)

    今天用html+js+cs写了一个类似手机音乐播放器的小东东,代码规范性不是很好,高手切勿喷,新手可以看看,其中歌词同步js代码参考了一个老师的代码.自己添加的是点击按钮页面滑动,和上一曲下一曲播放, ...

  4. YouTube iframe嵌入式播放器及播放器参数 自动播放,循环播放,播放列表,不显示 YouTube 徽标

    YouTube 嵌入式播放器及播放器参数 概览 本文档介绍如何在应用中嵌入 YouTube 播放器,并定义了 YouTube 嵌入式播放器可以使用的参数. 通过将参数附加到 iframe 网址末尾,您 ...

  5. 怎么隐藏audio播放器的播放进度条,只保留播放按钮?

    怎么隐藏audio播放器的播放进度条,只保留播放按钮? 截图 在页面最右边的button中嵌套了audio音频播放器,播放器默认的样式有一个播放进度条,导致页面宽度被撑开了,布局被破坏. 第一种: 第 ...

  6. 异常:谷歌浏览器video标签播放视频不能拖动进度条

    谷歌浏览器video标签播放视频不能拖动进度条 当前端video的src不是直接使用视频文件的地址,而是通过后台下载接口返回文件流时,后台返回流因为没为response的header设置一些参数,会在 ...

  7. 多个VLC播放器同步播放本地VCam视频流

    多个VLC播放器同步播放本地VCam视频流 配置如下: 下载安装VLC播放器,VCam虚拟摄像头 VCam打开一个视频文件 VLC设置捕获设备选择适配设备名称为e2esoft VCam:然后点击播放 ...

  8. Android学习之路4——音乐播放器后台播放

    Android学习之路4--音乐播放器后台播放 一.实验题目 简单音乐播放器 二.实现内容 实现一个简单的播放器,要求功能有: 播放.暂停.停止.退出功能,按停止键会重置封面转角,进度条和播放按钮:按 ...

  9. 【Android FFMPEG 开发】OpenSLES 播放音频 ( 创建引擎 | 输出混音设置 | 配置输入输出 | 创建播放器 | 获取播放/队列接口 | 回调函数 | 开始播放 | 激活回调 )

    文章目录 I . FFMPEG 播放视频流程 II . OpenSLES 播放音频流程 III . OpenSLES 播放参考 Google 官方示例 IV . OpenSL ES 播放代码 ( 详细 ...

最新文章

  1. ballerina 学习二十九 数据库操作
  2. android模糊后面视频,在安卓手机上怎么制作中间是横视频上下是模糊效果的竖视频?手机视频短片制作...
  3. wxWidgets:wxActiveXEvent类用法
  4. 2020 China Collegiate Programming Contest Weihai Site补题部分
  5. 苹果手机显示iphone已停用连接itunes_iphone忘记密码怎么办 iphone忘记密码解决方法【详细步骤】...
  6. kibana如何使用linux命令,Kibana 用户指南(安装Kibana)
  7. NMAP命令探测端口是否开通
  8. 嵌入式 CIF/4CIF/QCIF/D1分辨率
  9. 第一篇:FC-SAN存储技术
  10. 抖音抓包下载完整版视频
  11. 谷歌浏览器实现按下按键的脚本_谷歌浏览器快捷键设置方法详解
  12. 计算机上自带的打字游戏,Steam这款打字游戏,让多少人想起自己曾经学校上电脑课的日子?...
  13. Kinect绿灯闪烁解决方法
  14. 时间漩涡的世界 (一)
  15. php 抓取搜狗页面,爬虫解决方案之爬取“搜狗引擎”
  16. iPad点餐助力餐饮业发展
  17. 基于卷积神经网络进行图像分类
  18. python 批量修改后缀名
  19. Altium Designer--如何制作过孔(Via)库
  20. 第五期_信息收集《Metasploit Unleashed Simplified Chinese version(Metasploit官方文档教程中文版)》

热门文章

  1. 【吐血整理】java三元表达式比较三个数
  2. linux (centos7) 如何破解UltraEdit
  3. 将影像地图发布成wmts服务,并在客户端加载影像地图
  4. (专升本)Word(格式化表格操作)
  5. 使用UltraISO制作U盘启动安装系统的方法
  6. JS 提交表单后清空表单
  7. 简述Bug生命周期与Bug管理
  8. Linux操作系统 系统界面设计
  9. 分治法:线性时间选择
  10. 泊松过程中各个事件持续时间之和的期望