使用Android系统的MediaMuxer写一个音视频合并的方法。

这篇具有很好参考价值的文章主要介绍了使用Android系统的MediaMuxer写一个音视频合并的方法。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用Android系统的MediaMuxer写一个音视频合并的方法。文章来源地址https://www.toymoban.com/news/detail-514784.html

import android.media.MediaExtractor
import android.media.MediaFormat
import android.media.MediaMuxer
import java.io.IOException

fun mergeAudioVideo(audioFile: String, videoFile: String, outputFile: String) {
    // 创建一个MediaExtractor对象,用于从音频文件中提取音频轨道
    val audioExtractor = MediaExtractor()
    try {
        audioExtractor.setDataSource(audioFile)
    } catch (e: IOException) {
        e.printStackTrace()
        return
    }
    // 检查音频文件是否有音频轨道,并获取其格式
    val audioTrackCount = audioExtractor.trackCount
    if (audioTrackCount <= 0) {
        println("No audio track found in $audioFile")
        return
    }
    audioExtractor.selectTrack(0) // 选择第一个音频轨道
    val audioFormat = audioExtractor.getTrackFormat(0)

    // 创建一个MediaExtractor对象,用于从视频文件中提取视频轨道
    val videoExtractor = MediaExtractor()
    try {
        videoExtractor.setDataSource(videoFile)
    } catch (e: IOException) {
        e.printStackTrace()
        return
    }
    // 检查视频文件是否有视频轨道,并获取其格式
    val videoTrackCount = videoExtractor.trackCount
    if (videoTrackCount <= 0) {
        println("No video track found in $videoFile")
        return
    }
    videoExtractor.selectTrack(0) // 选择第一个视频轨道
    val videoFormat = videoExtractor.getTrackFormat(0)

    // 创建一个MediaMuxer对象,用于将音频和视频轨道复用到输出文件中
    val muxer = MediaMuxer(outputFile, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4)
    // 添加音频和视频轨道,并获取它们的索引
    val audioTrackIndex = muxer.addTrack(audioFormat)
    val videoTrackIndex = muxer.addTrack(videoFormat)
    // 开始复用
    muxer.start()

    // 定义一些变量,用于读取和写入音频和视频数据
    val bufferInfo = MediaCodec.BufferInfo() // 用于存储媒体数据的元信息,如时间戳,大小,偏移量等
    val bufferSize = 256 * 1024 // 设置缓冲区的大小,根据需要调整
    val buffer = ByteBuffer.allocate(bufferSize) // 创建一个字节缓冲区,用于存储媒体数据
    var isAudioDone = false // 标记音频是否读取完毕
    var isVideoDone = false // 标记视频是否读取完毕

    // 循环读取和写入音频和视频数据,直到其中一个结束
    while (!isAudioDone || !isVideoDone) {
        // 读取音频数据
        if (!isAudioDone) {
            // 从音频轨道中读取一帧数据到缓冲区中
            val audioSize = audioExtractor.readSampleData(buffer, 0)
            if (audioSize < 0) {
                // 如果读取到了文件末尾,标记音频结束
                isAudioDone = true
            } else {
                // 如果读取到了有效的数据,设置缓冲区信息
                bufferInfo.size = audioSize
                bufferInfo.offset = 0
                bufferInfo.presentationTimeUs = audioExtractor.sampleTime // 获取当前帧的时间戳
                bufferInfo.flags = audioExtractor.sampleFlags // 获取当前帧的标志位,如是否为关键帧等
                // 将缓冲区中的数据写入到输出文件的音频轨道中
                muxer.writeSampleData(audioTrackIndex, buffer, bufferInfo)
                // 移动到下一帧
                audioExtractor.advance()
            }
        }

        // 读取视频数据
        if (!isVideoDone) {
            // 从视频轨道中读取一帧数据到缓冲区中
            val videoSize = videoExtractor.readSampleData(buffer, 0)
            if (videoSize < 0) {
                // 如果读取到了文件末尾,标记视频结束
                isVideoDone = true
            } else {
                // 如果读取到了有效的数据,设置缓冲区信息
                bufferInfo.size = videoSize
                bufferInfo.offset = 0
                bufferInfo.presentationTimeUs = videoExtractor.sampleTime // 获取当前帧的时间戳
                bufferInfo.flags = videoExtractor.sampleFlags // 获取当前帧的标志位,如是否为关键帧等
                // 将缓冲区中的数据写入到输出文件的视频轨道中
                muxer.writeSampleData(videoTrackIndex, buffer, bufferInfo)
                // 移动到下一帧
                videoExtractor.advance()
            }
        }
    }

    // 结束复用并释放资源
    muxer.stop()
    muxer.release()
    audioExtractor.release()
    videoExtractor.release()
}

到了这里,关于使用Android系统的MediaMuxer写一个音视频合并的方法。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

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

    1. 实现效果    效果图中,视频没有铺满 是因为使用了ExoPlayer的RESIZE_MODE_FIT模式, 虽然使用RESIZE_MODE_FILL模式可以填充整个父布局,但是本Demo中使用的视频源本身就不适合全屏,会把视频拉伸,效果不好。 抖音上的视频源应该都有严格的宽高尺寸,才能做到全屏有很好的效

    2023年04月09日
    浏览(41)
  • 精选58道——Android 音视频面试题_安卓音视频面试题(3)

    先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年最新Android移动开发全套学习资

    2024年04月28日
    浏览(57)
  • 5G时代下,Android音视频强势崛起,我们该如何快速入门音视频技术?

    作为Android开发者的我们到底应不应该上音视频这条船? 接下来一起分析下。 大趋势 从未来的大趋势来看,随着5G时代的到来,音视频慢慢变成人们日常生活中的必需品。除了在线教育、音视频会议、即时通讯这些必须使用音视频技术的产品外,其它的产品也需要加入音频、

    2024年04月15日
    浏览(78)
  • Android音视频编码(2)

    Android本身提供了音视频编解码工具,很多时候是不需要第三方工具的,比如 ffmpeg , OpenCV 等,在android中引入第三库比较复杂,在Android音视频编码中介绍了如何引入第三方库libpng来进行进行图片处理,同时引入这些第三方库,是程序结构变得复杂。 本文介绍的音视频编解码利

    2024年01月17日
    浏览(51)
  • Android音视频-MediaCodec

    原文:https://mp.weixin.qq.com/s?__biz=MzU3NTA3MDU1OQ==mid=2247484865idx=1sn=174b8ca702466e83e72c7115d91b06eachksm=fd298df1ca5e04e7b2df9dc9f21e5cfe3e910204c905d8605f648ce6f6404432a83ae52a23a3scene=178cur_album_id=1638784435628064770#rd MediaCodec 支持处理三种数据类型,分别是压缩数据(compressed data)、原始音频数据(raw audio d

    2023年04月08日
    浏览(80)
  • Android之 集成音视频通话

    一,背景 1.1 最近接收一个即时通讯二开项目,即时通讯部分用的XMPP协议,音视频则是集成的国外的开源免费库jitsi-meet-sdk-2.4.0-4.aar,是基于WebRTC的开源框架。但客户想要微信那种页面的排版,后来经研究jitsi是不能修改UI的,UI部分是用混合框架ReactNative写的,这样难度就大了

    2024年02月12日
    浏览(64)
  • Android音视频之协议介绍

    本文对音视频的协议起源做详细介绍,学习之后可以加深对音视频知识的了解。 这里的音视频不仅针对Android平台,其他平台也通用。 一般是指以某种格式封装了音视频数据的文件 常见的音频格式:mp3、wma、avi、rm、rmvb、flv、mpg、mov、mkv等。 常见的视频格式:rmvb、rm、wmv、

    2023年04月19日
    浏览(56)
  • Android 音视频开发 - VideoView

    本篇文章主要介绍下Android 中的VideoView. VideoView是一个用于播放视频的视图组件,可以方便地在应用程序中播放本地或网络上的视频文件。 VideoView可以直接在布局文件中使用,也可以在代码中动态创建。 它封装了MediaPlayer和SurfaceView,提供了简单的接口来控制视频的播放和显示

    2024年04月08日
    浏览(95)
  • Android音视频: 引入FFmpeg

    本文你可以了解到 本文将介绍如何将上一篇文章编译出来的  FFmpeg so  库,引入到  Android  工程中,并验证  so  是否可以正常使用。 一、开启 Android 原生 C/C++ 支持 在过去,通常使用  makefile  的方式在项目中引入  C/C++  代码支持,随着  Android Studio  的普及, makefile  的

    2024年02月02日
    浏览(70)
  • Android音视频开发 - MediaMetadataRetriever 相关

    MediaMetadataRetriever 是android中用于从媒体文件中提取元数据新的类. 可以获取音频,视频和图像文件的各种信息,如时长,标题,封面等. 需要申请 读写权限 . 这里我使用的是本地路径, 需要注意的是如果路径文件不存在,会抛出 IllegalArgumentException,具体的源码如下: 根据keyCode返回keyC

    2024年04月08日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包