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
    评论
您好!为了实现精确定位到指定帧的功能,您可以使用以下步骤: 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、付费专栏及课程。

余额充值