2016-07-28 94 views
2

我使用MP4Parser來組合兩個MP4視頻剪輯,但我在MovieCreator.build();中收到異常。使用mp4Parser組合兩個MP4視頻

public class MergeVideo extends AsyncTask<String, Integer, String> { 

    @Override 
    protected void onPreExecute() { 
     progressDialog.show(); 
     // do initialization of required objects objects here 
    }; 

    @Override 
    protected String doInBackground(String... params) { 
     try { 
      Movie[] inMovies = new Movie[path.size()]; 
      Log.d("MoviePaths",path.size()+""); 
      for (int i = 0; i <path.size(); i++) { 
       Log.d("FilePath",path.get(i)+""); 
       inMovies[i] = MovieCreator.build(path.get(i)); 
      } 

      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); 

      @SuppressWarnings("resource") 
      FileChannel fc = new RandomAccessFile(String.format(Environment.getExternalStorageDirectory() + "/wishbyvideo.mp4"), "rw").getChannel(); 
      out.writeContainer(fc); 
      fc.close(); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     String mFileName = Environment.getExternalStorageDirectory() 
       .getAbsolutePath(); 
     mFileName += "/wishbyvideo.mp4"; 

     return mFileName; 
    } 

    @Override 
    protected void onPostExecute(String value) { 
     super.onPostExecute(value); 
     Log.d("File Name Final",value+""); 
     progressDialog.dismiss(); 

    } 
} 

運行該代碼時,我收到的例外是:

E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2 
java.lang.RuntimeException: An error occured while executing doInBackground() 
    at android.os.AsyncTask$3.done(AsyncTask.java:299) 
    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
    at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
    at java.lang.Thread.run(Thread.java:856) 

Caused by: java.lang.NullPointerException 
    at com.googlecode.mp4parser.authoring.container.mp4.MovieCreator.build(MovieCreator.java:51) 
    at com.googlecode.mp4parser.authoring.container.mp4.MovieCreator.build(MovieCreator.java:38) 
    at com.sourab.videorecorder.FFmpegRecorderActivity$MergeVideo.doInBackground(FFmpegRecorderActivity.java:1007) 
    at com.sourab.videorecorder.FFmpegRecorderActivity$MergeVideo.doInBackground(FFmpegRecorderActivity.java:992) 
    at android.os.AsyncTask$2.call(AsyncTask.java:287) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:137)  
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)  
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)  
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)  
    at java.lang.Thread.run(Thread.java:856)  

我已經在網上搜索,看着不同的鏈接提示不同的解決方案,但他們都不來解決我的問題。任何幫助是極大的讚賞。先謝謝你。

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 17 
    buildToolsVersion "22.0.1" 

    defaultConfig { 
     applicationId "com.sourab.videorecorder" 
     minSdkVersion 14 
     targetSdkVersion 17 
    } 

    buildTypes { 
     release { 
      minifyEnabled true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
     } 
    } 
} 

dependencies { 
    compile 'com.android.support:support-v4:18.0.0' 
    compile group: 'org.bytedeco', name: 'javacv', version: '1.1' 
    compile 'com.googlecode.mp4parser:isoparser:1.0.5.4' 
    compile group: 'org.bytedeco', name: 'javacv', version: '1.1' 
    compile group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '3.0.0-1.1', classifier: 'android-arm' 
    compile group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '3.0.0-1.1', classifier: 'android-x86' 
    compile group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: '2.8.1-1.1', classifier: 'android-arm' 
    compile group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: '2.8.1-1.1', classifier: 'android-x86' 
} 
+0

你使用的jar文件這個混帳回購協議?你可以發佈你的build.gradle嗎? – Nisarg

+0

compile'c​​om.googlecode.mp4parser:isoparser:1.0.5.4' – Alpha

+0

並構建gradle? – Nisarg

回答

1

這樣做,並確保視頻和音頻軌道有一些價值。它爲我工作。

  final Container container = new DefaultMp4Builder().build(finalMovie); 



     FileChannel fc = new RandomAccessFile(String.format(Environment.getExternalStorageDirectory().getAbsolutePath()+"/output.mp4"), "rw").getChannel(); 
     container.writeContainer(fc); 
     fc.close(); 

依賴關係:

dependencies { 
compile fileTree(dir: 'libs', include: ['*.jar']) 
testCompile 'junit:junit:4.12' 
compile 'com.android.support:appcompat-v7:24.1.1' 
compile 'com.googlecode.mp4parser:isoparser:1.1.18' 

}

可以克隆的工作示例

https://[email protected]/sandeep-agrawal/video-merger.git