新浪微博、QQ空间等一些 APP 有这样的效果(比较常见,就不截视频了):在列表页刷到一个视频的内容,视频自动播放,但是没有声音,如果你正在播放音乐,当视频播放的时候,音乐不会停止;如果点击视频,就进入下一个视频界面,这时候有声音了,播放的音乐也会停止。先说说这样的用户体验:像微博列表会有文字类、图片类、视频类,假如在公共场合突然刷到一个视频并且自动播放,有声音的情况:突然一个声音就冒出来了,然后大家都看着你;没有声音:静静的看着视频,如果感兴趣,带上耳机或者调低声音进入视频界面。

播放视频

一般播放视频要么是使用第三方的,也有自己封装 mediaplayer 的,先看看官方建议怎么使用 mediaplayer ;官方给出的是播放音频,视频一般采用的 mediaplayyer + textureview ,下面给出最简单代码,具体的自行搜索

mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource("yourVideoUrl");
//setSurface 主要是将mediaplayer 和textureview 联系起来,这里仅仅做演示,所以最简单化写出来
mMediaPlayer.setSurface(s);
mMediaPlayer.prepareAsync();
//几个监听事件
mMediaPlayer.setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener);
mMediaPlayer.setOnCompletionListener(MediaPlayer.OnCompletionListener);
mMediaPlayer.setOnPreparedListener(MediaPlayer.OnPreparedListener);        mMediaPlayer.setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener);mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
//开始播放
mMediaPlayer.start();

调节音量

MediaPlayer 本身提供了调节音量的 api : MediaPlayer.setVolume(float leftVolume, float rightVolume) ,取值范围是(0.0 - 1.0),leftVolume:左音量 ,rightVolume :右音量 。结合本文目的 — 静音,应该设置 :

mMediaPlayer.setVolume( 0f , 0f )

经过测试,的确达到了静音效果。微博视频还有这样的效果,其他APP正在播放音乐,假如在列表视频的时候设置静音,这个时候音乐不会受到影响,会继续播放,点击全屏的时候,音乐停止,播放视频的声音。这个效果怎么实现的呢,请看 AudioFocus

AudioFocus

先给出官网地址,也可以自行搜索,音频焦点:手机中有很多声音来源,如果有多个 APP 都同时播放音乐,这样的用户体验想想都怕,音频焦点的作用就是 APP 满足 一些特定条件,就可以获取音频焦点,就像微博播放视频的时候(全屏),音乐会自动停止,视频播放完毕,音乐就自动恢复(不是所有的音乐都会恢复,需要看播放音乐 APP 怎么处理的),这样的前提是播放音乐的 APP 也按照音频焦点。这里说说2个重要的条件

requestAudioFocus

代码使用

AudioManager audioManager = (AudioManager) getSystemService( AUDIO_SERVICE );
audioManager.requestAudioFocus( afChangeListener, AudioManager.STREAM_MUSIC,  AudioManager.AUDIOFOCUS_GAIN_TRANSIENT );

请求音频焦点,获取音频焦点后,调节音量 setVolume 也会影响系统类型为 AudioManager.STREAM_MUSIC 的音量。官方建议播放完后释放音频焦点,也就是需要的时候就去请求焦点,不需要的就释放焦点

abandonAudioFocus

AudioManager audioManager = (AudioManager) getSystemService( AUDIO_SERVICE );
audioManager.abandonAudioFocus( afChangeListener)

释放焦点后,再调节音量 setVolume 就不会影响系统音量了。关于 AudioFocus 还有其他很多作用,具体搜索下,这里的目的主要是实现微博的效果,所以就不细讲。

微博列表静音,全屏恢复声音

思路也就明显了,也就是

列表静音: 播放释放假如有音频焦点就释放,并且设置 mMediaPlayer.setVolume( 0f , 0f );

全屏播放:全屏时候请求音频焦点,并且设置声音 mMediaPlayer.setVolume( 1f , 1f ) ,这里的数值看实际情况。

JieCaoVieoPlayer 实现静音

先说说有人说使用 mMediaPlayer.setVolume( ) 调节音量没有作用,据我实际使用中是有效果的,我想没有作用的情况应该是调用 setVolume 位置不对。在源码中

  mediaPlayer.release();mediaPlayer = new MediaPlayer();

这里出现在 JCMediaManager 类中 HANDLER_PREPARE 事件中,也就说,调用时间不对,在这个代码之前设置音量 并不会有作用,只有在 new MediaPlayer() 后 在下次 mediaPlayer.release() 前才有用,因为播放完一段视频或者播放下端视频都会调用 release。

为了不影响 JieCaoVieoPlayer 的源代码或者说以最小的改动实现我们的效果,我们需要继承之前使用的 JCVideoPlayer ,github 上面建议使用 JCVideoPlayerStandard ;如果要达到静音效果,我建议继承 JCVideoPlayerStandard ,并且在继承类添加下面的代码并复写部分代码;当然你也可以在你自己自定义中去添加部分代码。我这里偷懒,就在 demo 中的 mainActivity 中的 MyJCVideoPlayerStandard 设置,代码如下

      //静音模式  默认为falseprivate boolean isSilencePattern = false;/*** 设置静音模式** @param isSilencePattern*/public void setSilencePattern(boolean isSilencePattern) {this.isSilencePattern = isSilencePattern;}/*** 设置音量** @param isSilence*/public void setVolume(boolean isSilence) {if (isSilence) {//静音JCMediaManager.instance().mediaPlayer.setVolume(0f, 0f);} else {JCMediaManager.instance().mediaPlayer.setVolume(1f, 1f);}}/*** 请求或者释放焦点** @param focus*/public void setAudioFocus(boolean focus) {AudioManager mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);if (focus) {//请求音频焦点mAudioManager.requestAudioFocus(onAudioFocusChangeListener, AudioManager.STREAM_MUSIC,  AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);} else {//释放mAudioManager.abandonAudioFocus(onAudioFocusChangeListener);}}

现在就需要知道合理的位置调用合理的方法

焦点处理

在 JCVideoPlayer 中 startVideo 方法中,

出现了请求焦点,所以需要我们在子类中去复写 startVideo

    @Overridepublic void startVideo() {super.startVideo();if (isSilencePattern) {setAudioFocus(false);}}

注意这添加的方法需要在 super.startVideo() 下面,如果放在上面会先执行 请求释放焦点,然后去执行 startVideo 中的请求焦点。

静音

上面也说了,需要在合适的位置调用才会生效,为了从一开始播放就静音,就找到开始播放前就设置静音,这里我选择的 onStatePlaying 这个方法,还有其他地方也可以,需要去看源码了解各个方法的作用复写。

     @Overridepublic void onStatePlaying() {super.onStatePlaying();//在列表 或者 普通模式下,可以根据实际需求改变if (isSilencePattern && (currentScreen == SCREEN_LAYOUT_NORMAL ||  currentScreen == SCREEN_LAYOUT_LIST)) {setVolume(true);}}

当是全屏(或者小屏) 需要去请求音频焦点和设置音量,退出全屏(或小屏) 又恢复静音

    /*** 进入全屏*/@Overridepublic void startWindowFullscreen() {super.startWindowFullscreen();if (isSilencePattern) {setAudioFocus(true);setVolume(false);}}

退出全屏

    /*** 退出全屏*/@Overridepublic void playOnThisJcvd() {super.playOnThisJcvd();if (isSilencePattern) {setAudioFocus(false);setVolume(true);}}

经过上面几个步骤,普通列表静音,全屏恢复声音的效果就实现了,如果需要静音模式,在使用 JCVideoPlayerStandard 的时候 调用

mJCVideoPlayerStandard.setSilencePattern(true); 

也就加了几句话,就不上传代码了,需要的看看实现过程复制代码即可,时间匆忙,写的不是很清楚,请见谅并指出,这篇的思路来自群里的一位朋友,以前也想达到这种效果,也遇到设置 设置音量不管用,没有认真看源码,在没有经过严格测试下,也得出一些不可靠的结论,这里感谢那位朋友。

Android 仿微博列表视频(一),静音播放相关推荐

  1. Android仿微博/QQ空间滑动自动播放视频功能

    最近做项目用到了滑动自动播放,下面是原理大家借鉴一下: 关键代码 1.监听滚动事件 首先要给listview添加setOnScrollListener监听,注意这个监听在recyclerView上是a ...

  2. Android 使用ViewPager2+ExoPlayer+VideoCache 实现仿抖音视频翻页播放

    1. 实现效果 效果图中,视频没有铺满 是因为使用了ExoPlayer的RESIZE_MODE_FIT模式, 虽然使用RESIZE_MODE_FILL模式可以填充整个父布局,但是本Demo中使用的视频 ...

  3. Android仿优酷视频的悬浮窗播放

    Android仿优酷视频的悬浮窗播放 之前接了需求要让视频播放时可以像优酷视频那样在悬浮窗里播放,并且悬浮窗和主播放页面之间要实现无缝切换,项目中使用的是自封装的ijkplayer 这个要求就代表不能 ...

  4. android浮窗播放器,Android仿优酷视频的悬浮窗播放效果

    之前接了需求要让视频播放时可以像优酷视频那样在悬浮窗里播放,并且悬浮窗和主播放页面之间要实现无缝切换,项目中使用的是自封装的ijkplayer 这个要求就代表不能在悬浮窗中新建视频控件,所以需要在悬浮 ...

  5. html5仿抖音全屏播放,仿抖音视频全屏播放滑动切换

    1 前言 随着移动技术的快速迭代,数据流量费用的快速下降,视频.直播正成为全民的媒体盛宴,我司必然也不会缺席此次盛宴,这里讲述的是通过h5实现仿抖音视频全屏播放&滑动切换的效果,供我司直播鉴定 ...

  6. 仿android微信视频编辑,Android 仿微信短视频录制

    VideoRecorder Android 仿微信短视频录制 预览 Bug 修复与更新日志: 更新日志: 1.2.0:仿照微信,短按拍照长按拍摄 --19.06.21 1.1.5:增加进度条,修改依赖 ...

  7. Android仿微信小视频录制功能(二)

    Android仿微信小视频录制功能(二) 接着上一篇,在完成了录制功能后,伟大的哲学家沃兹基索德曾经说过:"有录就有放.",那么紧接着就来实现播放功能,按照国际惯例,先上下效果图: ...

  8. Android 仿微信小视频录制

    Android 仿微信小视频录制 WechatShortVideo和WechatShortVideo文章

  9. Android 仿微信短视频录制

    VideoRecorder 项目地址:junerver/VideoRecorder 简介: Android 仿微信短视频录制 更多:作者   提 Bug 标签: Android 仿微信短视频录制 项目 ...

最新文章

  1. SQL错误提示档案(3):SQL Server连接中的四个最常见错误
  2. 批量修改root密码#shell脚本
  3. 32和64位jvm_我应该使用32位还是64位JVM?
  4. Mysql 的一些基本用法
  5. 【转】1.C Task.CompletedTask和Task.Result小记
  6. 【csust】最小素因子问题(树状数组)
  7. 美团AI全景图:吃喝玩乐背后的黑科技
  8. 汇编语言的简答入门--斐波那契数列(递归)
  9. 从.NET Core 3.1项目生成本地可执行文件
  10. 苹果终端date命令_苹果M1 Mac电脑关闭SIP方法
  11. Java 稳步成长、Kotlin 崛起、Go 保持独特风格,2020 年各大编程语言发展趋势一览...
  12. mybatis 不生效 参数_Spring Boot(七):你不能不知道的Mybatis缓存机制
  13. STM32的Bootloader实现
  14. 学习笔记(02):10小时掌握区块链开发教程-2小时构建以太坊智能合约-1
  15. 沟通的艺术与处世智慧 ——戴尔卡耐基(笔记)
  16. win10 EFI分区迁移至新盘的方法
  17. Win10系统磁盘扩展分区与恢复分区
  18. DM达梦数据库dminit使用手册
  19. 2800首无损格式经典歌曲分享
  20. FICO 里面的替代和校验 以及调试

热门文章

  1. 知识图谱:行业图谱实战
  2. 看Credit Karma如何掘金个人信用市场
  3. 机器学习总结3 #博学谷IT学习技术支持#
  4. 树莓派linux扫码枪,树莓派应用:摄像头条形码扫描
  5. java多线程编程从入门到卓越(超详细总结)
  6. 程序员跳槽一般涨薪多少合适?最高160%倍还有一位网友扎心了
  7. 天空卫士香港公司 | 开创兔年新局面、见证安全新未来
  8. matlab振荡环节的频率特性,试验五典型环节和系统频率特性的测量
  9. 苹果开始测试macOS Big Sur 11.0.1?
  10. 虚拟机压缩虚拟磁盘的方法