如何合并任何格式的音频和视频文件

时间:2019-08-08 06:44:34

标签: android audio kotlin

我正在为android开发一个应用程序,其中有一个视频,然后从用户电话中获得音乐列表,我能够同时获取这两个文件,我的问题是现在我想合并用户选择的音频如果视频中有背景音乐这样的视频,则视频中没有声音。请帮助我实现这一目标。我很抱歉代码没有整齐地发布代码,因为这是我第一次编写问题。

我曾经尝试过媒体复用器,但是它似乎不支持mp3格式,而且由于我是从用户电话中获取音频的,因此它可以是任何格式。

这是我的音乐对象类:

class MusicMP3 : Serializable {
var isCheck: Boolean = false
var namemusic: String? = null
var namesong: String? = null
var path: String? = null


constructor(check: Boolean, namemusic: String, namesong: String, path: 
String) {
    this.isCheck = check
    this.namemusic = namemusic
    this.namesong = namesong
    this.path = path
}


}

我正在使用以下代码获取音频:

    musicArray = ArrayList<MusicMP3>()
    val contentResolver = contentResolver
    val songUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
    val songCursor = contentResolver.query(songUri!!, null, null, null, 
    null)
    if (songUri != null && songCursor!!.moveToFirst()) {
        val songTitle = 
     songCursor.getColumnIndex(MediaStore.Audio.Media.TITLE)
        val songArtist = 
     songCursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)
        val songPath = 
     songCursor.getColumnIndex(MediaStore.Audio.Media.DATA)
        do {
            val currentTitle = songCursor.getString(songTitle)
            val currentArtist = songCursor.getString(songArtist)
            val currentPath = songCursor.getString(songPath)
            lsmusic!!.add(MusicMP3(false, currentTitle, currentArtist, 
     currentPath))
        } while (songCursor.moveToNext())
    }

尝试使用以下代码合并:

fun addAudioVideo(pathvideo: String, String: audioPath, output: String) {
    try {
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
          val videoExtractor = MediaExtractor()
          videoExtractor.setDataSource(pathvideo)
          val audioExtractor = MediaExtractor()
          audioExtractor.setDataSource(audioPath)
          Log.d("test", "Video Extractor Track Count " + 
          videoExtractor.trackCount)
          Log.d("test", "Audio Extractor Track Count " + 
          audioExtractor.trackCount)

          val muxer = MediaMuxer(output, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4)

          videoExtractor.selectTrack(0)
          val videoFormat = videoExtractor.getTrackFormat(0)
          val videoTrack = muxer.addTrack(videoFormat)

          audioExtractor.selectTrack(0)
          val audioFormat = audioExtractor.getTrackFormat(0)
          val audioTrack = muxer.addTrack(audioFormat)

          Log.d("test", "Video Format $videoFormat")
          Log.d("test", "Audio Format $audioFormat")

          var sawEOS = false
          var frameCount = 0
          val offset = 100
          val sampleSize = 256 * 1024
          val videoBuf = ByteBuffer.allocate(sampleSize)
          val audioBuf = ByteBuffer.allocate(sampleSize)
          val videoBufferInfo = MediaCodec.BufferInfo()
          val audioBufferInfo = MediaCodec.BufferInfo()

          videoExtractor.seekTo(0, MediaExtractor.SEEK_TO_CLOSEST_SYNC)
          audioExtractor.seekTo(0, MediaExtractor.SEEK_TO_CLOSEST_SYNC)
          muxer.start()
          while (!sawEOS) {
                 videoBufferInfo.offset = offset
                 videoBufferInfo.size = 
                 videoExtractor.readSampleData(videoBuf, offset)

                 if (videoBufferInfo.size < 0 || audioBufferInfo.size <  0) {
                     Log.d("test", "saw input EOS.")
                     sawEOS = true
                     videoBufferInfo.size = 0


                  } else {
                     videoBufferInfo.presentationTimeUs = videoExtractor.sampleTime
                     videoBufferInfo.flags = videoExtractor.sampleFlags
                     //videoBufferInfo.flags = MediaCodec.BUFFER_FLAG_SYNC_FRAME;
                     muxer.writeSampleData(videoTrack, videoBuf, 
             videoBufferInfo)
                     videoExtractor.advance()
                     frameCount++
                     Log.d("test", "Frame (" + frameCount + ") Video 
            PresentationTimeUs:" + videoBufferInfo.presentationTimeUs + " 
            Flags:" + videoBufferInfo.flags + " Size(KB) " + 
            videoBufferInfo.size / 1024)
                     Log.d("test", "Frame (" + frameCount + ") Audio 
             PresentationTimeUs:" + audioBufferInfo.presentationTimeUs + " Flags:" + audioBufferInfo.flags + " Size(KB) " + audioBufferInfo.size / 1024)

                    }
                }
                var frameCount2 = 0
                val frame = frameCount * 2
                while (frameCount2 < frame) {
                    frameCount2++
                    audioBufferInfo.offset = offset
                    audioBufferInfo.size = 
               audioExtractor.readSampleData(audioBuf, offset)
                    audioBufferInfo.presentationTimeUs = 30
                    audioBufferInfo.flags = audioExtractor.sampleFlags
                    muxer.writeSampleData(audioTrack, audioBuf, 
                audioBufferInfo)
                    audioExtractor.advance()

                    Log.d("test", "Frame (" + frameCount + ") Video 
                    PresentationTimeUs:" + videoBufferInfo.presentationTimeUs + 
                    " Flags:" + videoBufferInfo.flags + " Size(KB) " + 
                    videoBufferInfo.size / 1024)
                    Log.d("test", "Frame (" + frameCount + ") Audio 
                    PresentationTimeUs:" + audioBufferInfo.presentationTimeUs + 
                    " Flags:" + audioBufferInfo.flags + " Size(KB) " + 
                    audioBufferInfo.size / 1024)

                }
                muxer.stop()
                muxer.release
     }
  } catch (e: IOException) {
            Log.d("test", "Mixer Error 1 " + e.message)
  } catch (e: Exception) {
            Log.d("test", "Mixer Error 2 " + e.message)
  }
 }

我希望能够成功合并视频和音频。视频将在其中播放,音频将在其中作为背景音乐。

0 个答案:

没有答案