android与MP4Parser的合并问题
我有一个关于合并两个视频的问题。当我试图合并来自不同横向模式(左/右)的两个视频时,其中一个视频显示颠倒。我使用MP4Parser作为库来管理修剪和合并android与MP4Parser的合并问题,android,video,mp4parser,Android,Video,Mp4parser,我有一个关于合并两个视频的问题。当我试图合并来自不同横向模式(左/右)的两个视频时,其中一个视频显示颠倒。我使用MP4Parser作为库来管理修剪和合并 protected void combineClips() throws IOException { MediaMetadataRetriever m = new MediaMetadataRetriever(); for (int i = 0; i < paths.size(); i++) { m
protected void combineClips() throws IOException {
MediaMetadataRetriever m = new MediaMetadataRetriever();
for (int i = 0; i < paths.size(); i++) {
m.setDataSource(paths.get(i));
if (Build.VERSION.SDK_INT >= 17) {
String s = m.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION);
if (Integer.valueOf(s) == 0) {
isLeftLandscape = true;
}
if (Integer.valueOf(s) == 180) {
isRightLandscape = true;
}
}
}
for (int i = 0; i < paths.size(); i++) {
Movie tm = MovieCreator.build(paths.get(i));
Log.d(TAG, files.size() + "files");
files.add(tm);
}
if (isLeftLandscape && isRightLandscape) {
for (int i = 0; i < paths.size(); i++) {
m.setDataSource(paths.get(i));
if (Build.VERSION.SDK_INT >= 17) {
String s = m.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION);
if (Integer.valueOf(s) == 0)
{
Log.d(TAG, "the rotation is " + s);
rotate(paths.get(i), i);
}}
}
}
List<Track> videoTracks = new ArrayList<Track>();
List<Track> audioTracks = new ArrayList<Track>();
for (Movie movie : files) {
for (Track t : movie.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) {
Log.d(TAG, String.valueOf(audioTracks.size()) + "audi");
result.addTrack(new AppendTrack(audioTracks.toArray(new Track[audioTracks.size()])));
}
if (videoTracks.size() > 0) {
Log.d(TAG, String.valueOf(audioTracks.size()) + "vide");
result.addTrack(new AppendTrack(videoTracks.toArray(new Track[videoTracks.size()])));
}
Container out = new DefaultMp4Builder().build(result);
String folder_main = "VidApp";
File f = new File(Environment.getExternalStorageDirectory(), folder_main);
if (!f.exists()) {
f.mkdirs();
}
FileChannel fc = new RandomAccessFile(String.format(System.getenv("EXTERNAL_STORAGE") + "/VidApp" + "/output.mp4"), "rw").getChannel();
out.writeContainer(fc);
fc.close();
while (!audioTracks.isEmpty()) {
audioTracks.remove(0);
}
while (!videoTracks.isEmpty()) {
videoTracks.remove(0);
}
while (!files.isEmpty()) {
files.remove(0);
}
}
public void rotate(String path, int position) throws IOException {
IsoFile isoFile = new IsoFile(path);
Movie m = new Movie();
List<TrackBox> trackBoxes = isoFile.getMovieBox().getBoxes(
TrackBox.class);
for (TrackBox trackBox : trackBoxes) {
trackBox.getTrackHeaderBox().setMatrix(Matrix.ROTATE_180);
m.addTrack(new Mp4TrackImpl(trackBox));
}
Log.d(TAG, position + " of " + files.size());
files.set(position, m);
}
protectedvoid combineClips()引发IOException{
MediaMetadataRetriever m=新的MediaMetadataRetriever();
对于(int i=0;i=17){
字符串s=m.extractMetadata(MediaMetadataRetriever.METADATA\u KEY\u VIDEO\u ROTATION);
if(整数值=0){
isLeftLandscape=true;
}
if(整数值=180){
isRightLandscape=true;
}
}
}
对于(int i=0;i=17){
字符串s=m.extractMetadata(MediaMetadataRetriever.METADATA\u KEY\u VIDEO\u ROTATION);
if(整数值=0)
{
Log.d(标记“旋转为”+s);
旋转(路径。获取(i),i);
}}
}
}
List videoTracks=new ArrayList();
List audioTracks=新建ArrayList();
用于(电影:文件){
for(曲目t:movie.getTracks()){
if(t.getHandler().equals(“soun”)){
添加(t);
}
if(t.getHandler().equals(“vide”)){
视频跟踪。添加(t);
}
}
}
电影结果=新电影();
如果(audioTracks.size()>0){
Log.d(TAG,String.valueOf(audioTracks.size())+“audi”);
result.addTrack(新的AppendTrack(audioTracks.toArray)(新的曲目[audioTracks.size()));
}
如果(videoTracks.size()>0){
Log.d(TAG,String.valueOf(audioTracks.size())+“vide”);
result.addTrack(新的AppendTrack(videoTracks.toArray)(新的Track[videoTracks.size()));
}
Container out=new DefaultMp4Builder().build(结果);
字符串文件夹\u main=“VidApp”;
文件f=新文件(Environment.getExternalStorageDirectory(),文件夹\u main);
如果(!f.exists()){
f、 mkdirs();
}
FileChannel fc=new RandomAccessFile(String.format(System.getenv(“外部_存储”)+“/VidApp“+”/output.mp4”),“rw”).getChannel();
out.writeContainer(fc);
fc.close();
而(!audioTracks.isEmpty()){
音频曲目。删除(0);
}
而(!videoTracks.isEmpty()){
删除(0);
}
而(!files.isEmpty()){
删除(0);
}
}
公共void rotate(字符串路径,int位置)引发IOException{
IsoFile IsoFile=新的IsoFile(路径);
电影m=新电影();
List trackbox=isoFile.getMovieBox().getbox(
TrackBox.class);
用于(轨迹盒轨迹盒:轨迹盒){
trackBox.getTrackHeaderBox().setMatrix(Matrix.ROTATE_180);
m、 addTrack(新的Mp4TrackImpl(trackBox));
}
Log.d(标记,“+files.size()的位置+”);
文件集(位置,m);
}