Android 更改视频';将声带复制到相同长度的音频文件

Android 更改视频';将声带复制到相同长度的音频文件,android,audio,video,mediarecorder,android-mediarecorder,Android,Audio,Video,Mediarecorder,Android Mediarecorder,我有两个变量,uriaudiouri和urivideouri,分别指向音频文件(用户拥有的任何格式)和视频文件(mp4)的位置。视频和音频的长度相同 我想创建一个与视频文件具有相同视频/帧的视频文件,但将音频文件用作配乐。我最终使用了该库。API 16和API 18分别引入了MediaExtractor和MediaMuxer类,因此它们对于我的项目来说太新了 此方法的警告是,在编写时,音频源必须是aac或mp3文件,视频文件必须是mp4文件 使用Android Studio和Gradle,您可以

我有两个变量,
uriaudiouri
urivideouri
,分别指向音频文件(用户拥有的任何格式)和视频文件(mp4)的位置。视频和音频的长度相同

我想创建一个与视频文件具有相同视频/帧的视频文件,但将音频文件用作配乐。

我最终使用了该库。API 16和API 18分别引入了
MediaExtractor
MediaMuxer
类,因此它们对于我的项目来说太新了

此方法的警告是,在编写时,音频源必须是aac或mp3文件,视频文件必须是mp4文件

使用Android Studio和Gradle,您可以像这样安装和使用它:

打开
Gradle脚本->build.Gradle(模块:app)
并添加到
依赖项
块的末尾

compile 'com.googlecode.mp4parser:isoparser:1.0.+'
单击进行此更改后出现的黄色横幅中的“立即同步”按钮

现在在Java文件中编写:

try
{
    H264TrackImpl h264Track = new H264TrackImpl(new FileDataSourceImpl(videoFile);
    MP3TrackImpl mp3Track = new MP3TrackImpl(new FileDataSourceImpl(audioFile);
    Movie movie = new Movie();
    movie.addTrack(h264Track);
    movie.addTrack(mp3Track);
    Container mp4file = new DefaultMp4Builder().build(movie);
    FileChannel fileChannel = new FileOutputStream(new File(outputFile)).getChannel();
    mp4file.writeContainer(fileChannel);
    fileChannel.close();
}
catch (Exception e)
{
    Toast.makeText(this, "An error occurred: " + e.getMessage(), Toast.LENGTH_SHORT).show();
}
使用Alt+Enter工具导入所有类。对于我来说,
Movie
类有多种选择,因此请确保选择以
com.googlecode.mp4parser
开头的一种


由您处理异常并定义自解释字符串
outputFile
audioFile
videoFile

您是否尝试过使用该类提取视频曲目,然后使用该类将其与音频曲目混合?@Michael MediaMuxer类是在API 18中添加的,我的应用程序是针对API 10+的。我想你应该看看第三方解决方案,比如ffmpeg。@Michael我是用
mp4parser
开发的,我正忙着写答案。