[英]Android : java.lang.NullPointerException / Merging Videos
我目前正在制作一個可以合並視頻的Android應用。 這是這樣做的java類:
public class MergeVideos extends AsyncTask<String, Integer, String> {
// The working path where the video files are located
private String workingPath;
// The files name to merge
private ArrayList<String> videosToMerge;
public MergeVideos(String workingPath, ArrayList<String> videosToMerge) {
this.workingPath=workingPath;
this.videosToMerge=videosToMerge;
}
@Override
protected void onPreExecute() {
}
@Override
protected String doInBackground(String... params) {
int count=videosToMerge.size();
try {
Movie[] inMovies = new Movie[count];
for (int i = 0; i < count; i++) {
File file = new File(workingPath, videosToMerge.get(i));
if (file.exists()) {
FileInputStream fis = new FileInputStream(file);
FileChannel fc = fis.getChannel();
inMovies[i] = MovieCreator.build((DataSource) fc);
fis.close();
fc.close();
}
}
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);
}
if (t.getHandler().equals("")) {
}
}
}
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()])));
}
IsoFile out = (IsoFile) new DefaultMp4Builder().build(result);
long timestamp = new Date().getTime();
String timestampS = "" + timestamp;
File storagePath = new File(Environment.getExternalStorageDirectory() + "/VideosMerged");
storagePath.mkdirs();
File myMovie = new File(storagePath, String.format("output-%s.mp4", timestampS));
FileOutputStream fos = new FileOutputStream(myMovie);
FileChannel fco = fos.getChannel();
fco.position(0);
out.getBox(fco);
fco.close();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
String mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
mFileName += "/output.mp4";
return mFileName;
}
@Override
protected void onPostExecute (String value) {
super.onPostExecute(value);
}
我從Github獲得了這段代碼
這是我在主類中的用法:在onCreate中:
videosList=new ArrayList<String>();
videosList.add("sample_mpeg4.mp4");
videosList.add("big_buck_bunny.mp4");
this.workPath = Environment.getExternalStorageDirectory()+"/com.marakana.android.videocapturedemo";
然后,當我單擊一個按鈕時,它應該合並:
mergeVideos= new MergeVideos(workPath, videosList).execute();
但是,啟動應用程序時,出現以下錯誤:
02-04 10:59:34.952 32644-32644 / com.marakana.android.videocapturedemo E / MediaPlayer:應該已經設置了字幕控制器02-04 10:59:34.962 32644-961 / com.marakana.android.videocapturedemo E / AndroidRuntime致命異常:AsyncTask#2進程:com.marakana.android.videocapturedemo,PID:32644 java.lang.RuntimeException:在android.os.AsyncTask $ 3.done(AsyncTask.java:300執行doInBackground()時發生錯誤)的java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)的java.util.concurrent.FutureTask.setException(FutureTask.java:222)的java.util.concurrent.FutureTask.run(FutureTask.java: 242)在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:231)在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)在java.util.concurrent.ThreadPoolExecutor $ Worker.run( java.lang.Thread.run(Thread.java:841)處的ThreadPoolExecutor.java:587)原因:com.marakana.android.videocapturedemo.MergeVid處的java.lang.NullPointerException com.marakana.android.videocapturedemo.MergeVideos.doInBackground(MergeVideos.java:30)的eos.doInBackground(MergeVideos.java:java)在android.os.AsyncTask $ 2.call(AsyncTask.java:288)在java.util。 android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:231)處的java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)處並發.FutureTask.run(FutureTask.java:237)。 util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:587)在java.lang.Thread.run(Thread.java:841)
我試圖在MergeVideos中看一下lignes 30和69,它們是:
public class MergeVideos extends AsyncTask<String, Integer, String> {
和
for (Movie m : inMovies) {
但我看不出有什么問題。 我是Android的初學者,因此非常感謝您的幫助!
謝謝
嘗試像這樣添加到您的mMovies數組
inMovies.add( MovieCreator.build((DataSource) fc))
代替這個:
inMovies[i] = MovieCreator.build((DataSource) fc);
還要添加一個try and catch或檢查mMovies是否為空
if (mMovies.length==0)
//don't proceed with the offending code
for (Movie m : inMovies) {
它引發異常,因為它試圖遍歷一個空數組,該數組不為null,它為空,因此需要檢查長度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.