我正在为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)
}
}
我希望能够成功合并视频和音频。视频将在其中播放,音频将在其中作为背景音乐。