Gra*_*kat 5 merge rotation mp4parser
我正在开发一个应用程序来使用 mp4parser 合并 n 个视频。要合并的视频是在前置摄像头和后置摄像头中拍摄的。如果我将这些视频合并为单个,则可以很好地合并所有视频,但是通过前置摄像头拍摄的替代视频将合并为倒置。我能做什么。请任何人帮助我。
这是我合并视频的代码:
try {
String f1,f2,f3;
f1 = Environment.getExternalStorageDirectory() + "/DCIM/testvideo1.mp4";// video took via back camera
f2 = Environment.getExternalStorageDirectory() + "/DCIM/testvideo2.mp4";// video took via front camera
f3 = Environment.getExternalStorageDirectory() + "/DCIM/testvideo3.mp4";// video took via front camera
Movie[] inMovies = new Movie[] {
MovieCreator.build(f1),
MovieCreator.build(f2),
MovieCreator.build(f3)
};
List<Track> videoTracks = new LinkedList<Track>();
List<Track> audioTracks = new LinkedList<Track>();
for (Movie m : inMovies) {
for (Track t : m.getTracks()) {
if (t.getHandler().equals("soun")) {
audioTracks.add(t);
}
if (t.getHandler().equals("vide")) {
videoTracks.add(t);
}
}
}
Movie result = new Movie();
if (audioTracks.size() > 0) {
result.addTrack(new AppendTrack(audioTracks
.toArray(new Track[audioTracks.size()])));
}
if (videoTracks.size() > 0) {
result.addTrack(new AppendTrack(videoTracks
.toArray(new Track[videoTracks.size()])));
}
BasicContainer out = (BasicContainer) new DefaultMp4Builder().build(result);
WritableByteChannel fc = new RandomAccessFile(
String.format(Environment.getExternalStorageDirectory()+ "/DCIM/CombinedVideo.mp4"), "rw").getChannel();
out.writeContainer(fc);
fc.close();
} catch (Exception e) {
Log.d("Rvg", "exeption" + e);
Toast.makeText(getApplicationContext(), "" + e, Toast.LENGTH_LONG)
.show();
}
Run Code Online (Sandbox Code Playgroud)
小智 0
解释:
这是由于此处解释的方向问题引起的。简而言之,这意味着由于前置摄像头和后置摄像头录制的视频的旋转元数据不同,当使用 mp4parser 合并视频时,每隔一个视频都会颠倒。
如何解决这个问题:
我设法用两种不同的方式解决这个问题。
1. 重新编码视频- 使用FFmpeg我设法以正确的方向合并视频。
如何使用,以及我在 Android 中使用 FFmpeg 的建议
缺点:
该解决方案的主要问题是它需要将视频重新编码到合并视频中,并且此过程可能需要相当长的时间。
此外,由于重新编码,该方法是有损的
专业人士:
即使视频分辨率、帧速率和比特率不同,此方法也可以工作。
2. 使用 mp4parser/demuxer 方法- 为了使用 mp4parser 或 FFmpeg demuxer 方法以正确的方向合并视频,视频必须提供相同的方向 - 或没有旋转元数据。使用CameraView takeVideoSnapshot()允许录制没有旋转元数据的视频,因此当将其与 mp4parser 合并时,它的方向正确。
缺点:
该解决方案的主要问题是,为了使输出具有正确的方向并且不会失败,输入视频必须具有相同的分辨率、帧速率、比特率以及旋转元数据(为了正确的方向)。
优点:
这种方法不需要重新编码,因此速度非常快。
而且它是无损的。