使用ffmpeg将mp4视频转为m3u8格式

下载ffmpeg地址

通过网盘分享的文件:ffmpeg-master-latest-win64-gpl.zip

链接: https://pan.baidu.com/s/1Hryli_SAV2vcOfLLRA8vFg 提取码: 3cnr

配置环境变量

配置好环境变量后CMD:ffmpeg -version

进入需要切片的目录

ffmpeg -y -i myvideo.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb sk.ts

如果报错

纠正错误后的命令

ffmpeg -y -i myvideo.mp4 -vcodec copy -acodec copy sk.ts

会生成 sk.ts文件 然后通过这个文件切片成.m3u8

命令

ffmpeg -i sk.ts -c copy -map 0 -f segment -segment_list sk.m3u8 -segment_time 8 sk%04d.ts

-segment_time 8:8 秒一个片段

kotlin 复制代码
  /**
     * 在后台线程将 assets/sk/ 下的 m3u8 和 ts 文件拷贝到缓存目录,
     * 拷贝完成后切换播放 m3u8
     */
    private fun prepareM3u8Assets() {
        lifecycleScope.launch(Dispatchers.IO) {
            try {
                val m3u8Path = copyAssetsM3u8ToCache("sk", "sk.m3u8")
                if (m3u8Path != null) {
                    // 拷贝完成后切换到 m3u8 播放
                    withContext(Dispatchers.Main) {
                        playM3u8(m3u8Path)
                    }
                }
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }
kotlin 复制代码
    /**
     * 将 assets 目录下的 m3u8 及所有 ts 分片拷贝到缓存目录
     * 返回 m3u8 文件的绝对路径
     */
    private fun copyAssetsM3u8ToCache(assetDir: String, m3u8FileName: String): String? {
        val cacheDir = File(requireContext().cacheDir, assetDir)
        val m3u8File = File(cacheDir, m3u8FileName)

        // 如果 m3u8 已存在,直接返回(说明已拷贝过)
        if (m3u8File.exists()) return m3u8File.absolutePath

        cacheDir.mkdirs()

        val assetManager = requireContext().assets
        // 列出 assets/sk/ 下所有文件
        val fileList = assetManager.list(assetDir) ?: return null

        for (fileName in fileList) {
            val targetFile = File(cacheDir, fileName)
            if (targetFile.exists()) continue

            try {
                val input = assetManager.open("$assetDir/$fileName")
                val output = FileOutputStream(targetFile)
                input.copyTo(output)
                input.close()
                output.close()
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }

        return m3u8File.absolutePath
    }
相关推荐
晚风叙码1 小时前
MySQL 数据类型详解:从数值到字符串,一篇讲透
android·mysql·adb
传奇开心果编程1 小时前
【Compose Multiplatform 跨端开发学与练】第3课 布局与组件
android·windows·学习·ui·ios·kotlin·composer
小猴子爱上树2 小时前
跨马翻译:批量图片翻译+视频字幕+智能抠图,跨境电商在线图片翻译工具
大数据·人工智能·python·音视频
传奇开心果编程4 小时前
【Compose Multiplatform 跨端开发学与练】第8课 资源管理与主题
android·windows·学习·ios·kotlin·web·composer
阿明副业观察5 小时前
AI视频创作流程怎么做?完整指南与工具推荐
大数据·人工智能·aigc·音视频·ai写作
aichitang20245 小时前
应用数学与音频信号处理
音视频·信号处理
传奇开心果编程6 小时前
【Compose Multiplatform 跨端开发学与练】第9课 测试与调试
android·学习·macos·ios·kotlin·web·composer
传奇开心果编程6 小时前
【Compose Multiplatform 跨端开发学与练】第4课 导航与路由
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程6 小时前
【Compose Multiplatform 跨端开发学与练】第6课 状态管理与架构
android·学习·ui·ios·架构·kotlin·composer
事圆则缓6 小时前
Android AOSP 定制常见概念:源码目录、系统镜像与刷机流程
android