Android 音视频变速原理

视频倍速播放

假设视频帧率是24fps, 则播放器必须在1000/24 = 41.66ms 内 解封装 + 解码 + 渲染完一帧,一般只计算出把YUV数据从渲染队列中取出到渲染结束的时间(RenderTime),超过了这个时间就会出现播放卡顿,画面延迟

渲染是花不到41.66ms的,假设渲染时间是10ms,那么我们就要休眠 41.66-10 = 31.66ms ,再继续从渲染队列拿帧数据。

倍速播放就是24fps换成48fps,即1000ms内播放出48帧,即RenderTime = 41.66/2 = 20.83ms, 所以按照原理只需要改变RenderTime即可实现倍速播放

音频倍速播放

Android的音频播放大多采用两种方案,AudioTrack和OpenSL ES

注意参数:

采样率:sampleRate

声道数:channel

采样格式:audioFormat

假设现在有一段48000Hz,16位的单声道音频,用AudioTrack播放的时候,按照前面视频的思路,就是一秒钟的时间内,需要喂给播放器的数据是

48000 * 16 * 1 / 8 = 9600 字节/秒

如果是两倍速那么就是将9600 * 2 = 48000 * 16 * / 40 即提高采样率即可实现音频倍速播放

音频倍速实现


MediaPlayer.setPlaybackParams(PlaybackParams params) throws IllegalStateException, IllegalArgumentException
  • 具体实现:
val mediaplayer = MediaPlayer()
if (mediaplayer != null) {
    //倍速设置,必须在23以上
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        mediaplayer.playbackParams = mediaplayer.playbackParams.setSpeed(1.5f)
        mediaplayer.pause()
        mediaplayer.start()
    }
}

原文链接:Android 音视频变速原理 - 资料 - 我爱音视频网 - 构建全国最权威的音视频技术交流分享论坛 

  

本文福利, C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部↓↓ 

猜你喜欢

转载自blog.csdn.net/m0_60259116/article/details/125915061