android seekto 黑屏,关于VideoView视频播放遇到卡顿的问题。

近期项目出了个新需求,类似微信10秒小视频的上传和发布。

要实现这个需求需要满足三个点要点:

1.有一个相册,并且可以选择视频。

2.需要压缩视频。

3.需要播放视频。

对于1. 我们本身就继承了PictureSelector 点击打开链接,但是我们的需求需要将源码下载下来修改才能解决问题。

对于2. 压缩视频在网上找了下,现在使用的是small-video-record,这个库压缩10秒的本地视频需要11秒到15秒之间。体积可以从20m压缩到6M到8M。这个之后可以在单独研究研究鲁班,FFmpeg。

对于3. 播放视频首先能想到的必然是videoView 因为简单,不需要太复杂的调用。但是在使用的过程中遇到了比较重要的几个问题:

(3.1)视频在播放网络视频的之前的缓冲时间比较长(2秒到三秒)。

(3.2)在视频播放页面,分享到微信扣扣登第三方平台,再重新回到视频播放页的时候,视频在Android  版本比较高,性能比较好的手机上会有一秒到两秒的卡顿,在android 版本比较低或者性能不高的手机上会卡住,不会 继续播放,有的甚至直接为黑屏。

(3.3)在android  4.4的手机上mp4格式的网络视频,有的全部无法播放。

针对以上3.1和3.3因为是原生的VideoView 自己处理的只是简单的播放处理没有做过于复杂的封装,所以无法避免。如果要解决这两点问题,那最简单的就是更换一个播放器,推荐使用B站的IJkVideoPlayer,这样会使得3.1 和3.3 的问题得到较大的解决。

针对3.2.网站上也有很多的处理方法(但是好像不起什么作用。。。),这个因为我用的是videoview的方法调用有错(网上大部分的调用模板。。。),我的错误调用方法是在播放页面的onPause方法中记录下当时videoView的进度,然后在onResume中判断进度是否 大于-1(因为默认值是-1)来调用方法mVideoView.sart() 和mVideoView.seekTo(mCurrentPosition),因为方法调用的不对,所以会出现这个问题,我们可以把记录当前的位置mCurrentPositjion这一步去掉,直接在onResume()方法中调用mVideoView.resume()就可以解决3.2所述的问题。

就到这里,希望能帮到有需要的童鞋。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实训报告书 实训名称: Android视频播放器 系 (部): 专业班级: 学生姓名: 学 号: 指导教师: 完成日期: "实训课题 "Android视频播放器 " "实训人姓名 " "同组人员 " " "实训日期 " " "实训成绩 " " "指导教" " "师评语" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "指导教师签名:______________ " " "_______年 ____ 月____日 " 目 录 1 实训目的 1 2 android视频播放器系统的分析与设计 1 2.1 系统功能描述 1 2.2 系统模块设计 1 3 主要代码清单 2 4 程序运行与测试 2 5 实训总结 3 android视频播放器系统的设计与实现 1 实训目的 本学期我们学习了JAVA课程和Android应用程序开发课程。而Android应用程序是利用 Java语言开发的,本次实训能够对我们所学的Java语言和Android应用程序开发的一次综 合实践,使我们能够更好的掌握Java语言在实际开发中的应用,同时也为了使我们能够 更好的掌握和学习Android应用程序开发,对所学的知识进一步牢固。培养运用所学知识 解决实际课程的能力,培养开发Android应用程序的思想和方法。同时在实训过程中也能 不断学习新的知识。 2 Android视频播放器系统的分析与设计 2.1 系统功能描述 该系统是一个能够在Android平台下运行的视频播放器。能够实现一下功能: 1)播放功能: 能够实现mp4、avi格式文件的播放。 2)暂停功能: 点击暂停按钮时能够暂停播放视频,再次点击暂停按钮时能够继续播放。 3)重播功能: 点击重播按钮时能够从头开始播放视频。 4)停止功能: 点击停止按钮时能够停止播放视频,再点击播放按钮时能够从头开始播放。 5)快进功能: 点击快进按钮时能够向前跳跃5秒播放。 6)后退功能: 点击回退按钮时能够向后跳跃5秒播放。 7)显示进度条: 能够显示文件播放进度。 拖动进度条能够实现视频快进、快退功能。 8)退出功能: 点击退出按钮时能够正常退出程序。 2.2 系统模块设计 1、输入文件模块:在该模块中采用EditText控件来实现。 2、播放视频模块:该模块是用MediaPlayer类通过surfaceView来实现。 3、暂停播放模块:该模块是用MediaPlayer.push()方法来实现。 4、重播模块:该模块通过MediaPlayer.reset()方法来实现。 5、停止播放模块:该模块通过MediaPlayer.stop()方法实现。 6、快进模块:该模块通过MediaPlayer.seekTo()方法来实现。 7、后退模块:该模块通过MediaPlayer.seekTo()方法来实现。 8、退出模块:该模块通过调用finish()方法来实现,并释放资源。 3 主要代码清单 3.1 main.xml布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/textview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/filename" /> <EditText android:id="@+id/filename" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="yueshen.mp4" /> 该部分是在主界面上放置一个EditText看控件,在本程序中用于接收输入的文件名。 <SurfaceView android:id="@+id/surfaceView" android:layout_width="fill_parent" android:layout_height="300dp" /> SurfaceView控件是用于播放
您好!为了实现精确定位到指定帧的功能,您可以使用以下步骤: 1. 创建一个 MediaExtractor 对象,并设置要解析的媒体文件路径: ```java MediaExtractor extractor = new MediaExtractor(); extractor.setDataSource(filePath); ``` 2. 选择要解析的媒体轨道,例如音频轨道或视频轨道: ```java int trackIndex = selectTrack(extractor, mediaType); // mediaType可以是"audio"或"video" extractor.selectTrack(trackIndex); ``` 3. 使用 `seekTo()` 方法定位到指定时间或帧数。对于精确定位到指定帧,您需要知道帧的时间戳,并将其转换为微秒(以微秒为单位的时间戳): ```java long targetTimeUs = frameTimestamp * 1000; // 将帧的时间戳转换为微秒 extractor.seekTo(targetTimeUs, MediaExtractor.SEEK_TO_CLOSEST_SYNC); ``` 或者,如果您知道要跳转到的帧索引,可以使用如下方法: ```java extractor.seekTo(frameIndex, MediaExtractor.SEEK_TO_PREVIOUS_SYNC); ``` 请注意,`frameIndex` 是帧的索引,从0开始计数。 4. 迭代解析从 seekTo() 定位的帧直到您满足的条件为止。例如,如果您想解析一帧视频,则可以使用以下代码: ```java MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); boolean foundFrame = false; while (!foundFrame) { int inputBufferIndex = decoder.dequeueInputBuffer(timeoutUs); if (inputBufferIndex >= 0) { // 将输入数据填充到解码器输入缓冲区 // ... // 解码缓冲区的输出数据 // ... // 检查输出数据是否是您要寻找的帧 // 如果是,则将 foundFrame 设置为 true } } ``` 注意:以上代码只是示意,实际实现可能会有所不同。您需要根据您的需求和媒体类型进行适当的调整。 希望这些信息能对您有所帮助!如果您有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值