簡體   English   中英

Android:java.lang.NullPointerException /合並視頻

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM