首页 > 其他分享 >VideoView 播放FFmpeg 处理成libx264的mp4文件视频黑屏,但是声音正常

VideoView 播放FFmpeg 处理成libx264的mp4文件视频黑屏,但是声音正常

时间:2023-04-11 14:02:35浏览次数:29  
标签:FFmpeg val libx264 mAction duration player context fun 黑屏


将VideoView 切换到ExoPlayer 即可。

与VideoView不同。

版本 2.18.1 下面是替换后的代码。

class CustomVideo : PlayerView {
    lateinit var player: SimpleExoPlayer
    private var mLocalMuteFlag = false // 本地静音标识
    private var mAction: PlayerUtil.OnMediaListener? = null
    private var mProgressTask: CoroutinesTask? = null // 进度任务
    private var mMediaDuration = 0L // 多媒体时长

    init {
        this.apply {
            controllerAutoShow = false
            controllerHideOnTouch = false
            controllerShowTimeoutMs = 0
//        controllerVisibilityListener = object : PlayerControlView.VisibilityListener {
//                override fun onVisibilityChange(visibility: Int) {
//                    // Do nothing
//                }
//            }
        }
    }

    // 设置播放事件
    fun setOnActionListener(listener: PlayerUtil.OnMediaListener?) {
        mAction = listener
    }

    // 设置多媒体路径
    fun setMediaUri(path: String) = catchException({
        if (player.isPlaying) player.stop()
        releaseProgressTask()
        val dataSourceFactory = DefaultDataSourceFactory(context)
        val videoUri = Uri.parse(path)
        val mediaItem: MediaItem = MediaItem.fromUri(videoUri)

        val mediaSource =
            ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(mediaItem)
        player.prepare(mediaSource)
    })

    // 播放视频
    fun playVideo() = catchException({
        if (!player.isPlaying) {
            player.playWhenReady = true
            startProgressTask()
            mAction?.onMediaStart()
        }
    })

    // 暂停播放
    fun pauseVideo() = catchException({
        if (player.isPlaying) {
            player.playWhenReady = false
            mAction?.onMediaPause()
        }
    })

    // 静音
    fun updateMuteStatus(muteFlag: Boolean) {
        mLocalMuteFlag = muteFlag
        val volume = if (muteFlag) 0f else 1f
        player.volume = volume
    }

    constructor(context: Context) : this(context, null, 0)
    constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
        context, attrs, defStyleAttr
    ) {
        player = SimpleExoPlayer.Builder(context).build()


        player.addListener(object : Player.Listener {
            override fun onPlayerError(error: PlaybackException) {
                mAction?.onMediaErr("media err what:${error.errorCode} extra:${error.cause}")
            }

            override fun onPlaybackStateChanged(state: Int) {
                if (state == Player.STATE_ENDED) {
                    mAction?.onMediaComplete()
                }
            }
        })

        player.addAnalyticsListener(object : AnalyticsListener {
            override fun onPositionDiscontinuity(
                eventTime: AnalyticsListener.EventTime, reason: Int
            ) {
                if (reason == Player.DISCONTINUITY_REASON_AUTO_TRANSITION) {
                    val position = player.currentPosition
                    val duration = player.duration
                    val progress = (position * 100f / duration).toInt()
                    mAction?.onMediaPlaying(
                        progress = progress, position = position, duration = duration
                    )
                }
            }
        })


        setPlayer(player)
    }

    // 开始进度任务
    private fun startProgressTask() {
        if (mProgressTask == null) mProgressTask = CoroutinesTask()
        if (!player.isPlaying) return
        if (mMediaDuration == 0L) mMediaDuration = (player.duration).toLong()
        val position = (player.currentPosition).toLong()
        val lastProgress = (position * 100f) / mMediaDuration
        val progress = if (mMediaDuration <= 0) 0 else (lastProgress + 0.6f).toInt()
        mAction?.onMediaPlaying(progress = progress, position = position, duration = mMediaDuration)
        mProgressTask?.launchDelayRequest(200) { startProgressTask() }
    }

    // 释放进度任务
    private fun releaseProgressTask() {
        mProgressTask?.destroyTask()
        mProgressTask = null
    }

    override fun onDetachedFromWindow() {
        super.onDetachedFromWindow()
        releaseProgressTask()
        player.release()

    }
}

标签:FFmpeg,val,libx264,mAction,duration,player,context,fun,黑屏
From: https://blog.51cto.com/u_14523369/6183205

相关文章

  • Mac版 下载安装FFmpeg(转)
    转自:Mac版下载安装FFmpeg法一,直接使用brew安装ffmpegbrewinstallffmpeg如果发现下载太慢,可以参考macOS】homebrew安装和解决brew安装速度慢的问题加快下载速度。方式二:官网下载安装(1)进入官网DownloadFFmpeg选择“mac”,点击下面的“macOS-64-bit”进入下载页面(2)......
  • ffmpeg 英特尔核显加速 (ubuntu环境)
    seokw:ffmpeg核显ffmpeg加速ffmpeg慢ffmpeg优化英特尔核显ubuntuffmpegubuntu视频正文安装i965-va-driversudoapt-getinstalli965-va-driver然后在ffmpeg命令中加入-hwaccelvaapi同时如果不介意码率低点可以加入-presetultrafast然后示范一下1.mkv转到2......
  • Qt-FFmpeg开发-保存视频流裸流(11)
    音视频/FFmpeg#QtQt-FFmpeg开发-保存视频流裸流......
  • Qt-FFmpeg开发-音频解码为PCM文件(9)
    音视频/FFmpeg#QtQt-FFmpeg开发-使用libavcodecAPI的音频解码示例(MP3转pcm)目录音视频/FFmpeg#QtQt-FFmpeg开发-使用libavcodecAPI的音频解码示例(MP3转pcm)1、概述2、实现效果3、主要代码4、完整源代码更多精彩内容......
  • Qt-FFmpeg开发-回调函数读取数据(8)
    音视频/FFmpeg#QtQt-FFmpeg开发-使libavformat解复用器通过自定义AVIOContext读取回调访问媒体内容目录音视频/FFmpeg#QtQt-FFmpeg开发-使libavformat解复用器通过自定义AVIOContext读取回调访问媒体内容1、概述2、实现效果3、主要代码4、完整源代码更多精彩内容......
  • Qt-FFmpeg开发-打开本地摄像头录制视频(7)
    音视频/FFmpeg#QtQt-FFmpeg开发-打开本地摄像头录制视频【软解码+OpenGL显示YUV】目录音视频/FFmpeg#QtQt-FFmpeg开发-打开本地摄像头录制视频【软解码+OpenGL显示YUV】1、概述2、实现效果3、FFmpeg录制视频编码流程4、主要代码5、完整源代码更多精彩内容......
  • Qt-FFmpeg开发-打开本地摄像头(6)
    音视频/FFmpeg#QtQt-FFmpeg开发-打开本地摄像头【软解码+OpenGL显示YUV】目录音视频/FFmpeg#QtQt-FFmpeg开发-打开本地摄像头【软解码+OpenGL显示YUV】1、概述2、实现效果3、FFmpeg打开本地摄像头解码流程4、查询可用摄像头5、设置摄像头打开参数6、主要代码6.1解码代码5.2......
  • Qt-FFmpeg开发-视频播放(5)
    音视频/FFmpeg#QtQt-FFmpeg开发-视频播放【软/硬解码+OpenGL显示YUV/NV12】目录音视频/FFmpeg#QtQt-FFmpeg开发-视频播放【软/硬解码+OpenGL显示YUV/NV12】1、概述2、实现效果3、FFmpeg硬解码流程4、优化av_hwframe_transfer_data()性能低问题5、主要代码5.1解码代码5.2......
  • Qt-FFmpeg开发-视频播放(4)
    音视频/FFmpeg#QtQt-FFmpeg开发-视频播放【软解码+OpenGL显示YUV420P图像】目录音视频/FFmpeg#QtQt-FFmpeg开发-视频播放【软解码+OpenGL显示YUV420P图像】1、概述2、实现效果3、FFmpeg软解码流程4、主要代码4.1解码代码4.2OpenGL显示RGB图像代码5、完整源代码更多......
  • ffmpeg 工具
    多个片段合并成一个:ffmpeg-ia.flv\-vf"select='between(t,0,34)+between(t,170,177)+between(t,400,465)+between(t,475,603)',setpts=N/FRAME_RATE/TB"\-af"aselect='between(t,0,34)+between(t,170,177)+betwe......