0

我的问题很像这篇文章中描述的问题:Cant append to video in Android,只是无法使用更新的 jar 来解决我的问题(我目前使用的是 isoviewer-1.0-RC-26)。以下是我的代码:

 private Uri concatenateMP4() {
        try {

            FileChannel fc1 = new FileInputStream(myVid1).getChannel();
            FileChannel fc2 = new FileInputStream(myVid2).getChannel();
            FileChannel fc3 = new FileInputStream(myVid3).getChannel();

            try {

                Movie[] inMovies = new Movie[]{
                    MovieCreator.build(fc1),
                    MovieCreator.build(fc2),
                    MovieCreator.build(fc3)
                };

                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()])));
                }

                Container out = new DefaultMp4Builder().build(result);

                String fileNameString = fName+"_"+lName"_"org+System.currentTimeMillis()+".mp4";
                File aFile = new File(vidDir,fileNameString);

                FileChannel fc = new RandomAccessFile(aFile,"rw").getChannel();
                out.writeContainer(fc);
                fc.close();

                combinedVidUri = addVideo(aFile);

                return combinedVidUri;

            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

我在 asyncTask 中运行此代码,这样当 vid 稍微大一点时,它们就不会占用 UI 线程。以下是我得到的错误:

10-01 19:07:01.367  11805-12202/com.myapp.myappProject E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
        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.nio.BufferUnderflowException
        at java.nio.Buffer.checkGetBounds(Buffer.java:177)
        at java.nio.DirectByteBuffer.get(DirectByteBuffer.java:41)
        at java.nio.MappedByteBufferAdapter.get(MappedByteBufferAdapter.java:144)
        at java.nio.ByteBuffer.get(ByteBuffer.java:384)
        at java.nio.channels.Channels$OutputStreamChannel.write(Channels.java:345)
        at com.googlecode.mp4parser.AbstractBox.getBox(AbstractBox.java:163)
        at com.googlecode.mp4parser.authoring.tracks.AppendTrack.<init>(AppendTrack.java:52)
        at com.myapp.myappProject.Submit.concatenateMP4(Submit.java:142)
        at com.myapp.myappProject.Submit.access$000(Submit.java:71)
        at com.myapp.myappProject.Submit$StartUploadChain.doInBackground(Submit.java:245)
        at com.myapp.myappProject.Submit$StartUploadChain.doInBackground(Submit.java:236)
        at android.os.AsyncTask$2.call(AsyncTask.java:287)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
        ... 5 more

我知道我试图连接的视频确实存在,并且我相当确定(通过上述输出和使用 Log 语句)它在向result变量添加新轨道时会中断。我究竟做错了什么?最糟糕的是,我正在 Google Nexus 和三星 Galaxy Tab 上进行测试。联系有效,星系抛出错误。

4

0 回答 0