Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何连接/合并mp4,并设置正确的持续时间?_Android_Mp4parser - Fatal编程技术网

Android 如何连接/合并mp4,并设置正确的持续时间?

Android 如何连接/合并mp4,并设置正确的持续时间?,android,mp4parser,Android,Mp4parser,我需要在android上合并几个mp4文件,所以我尝试使用mp4parser合并几个mp4。 private void mergeMp4(File output, String[] files) throws IOException { Movie[] inMovies = new Movie[files.length]; for (int i=0, len = files.length; i<len; ++i) { inMovies[i] = MovieC

我需要在android上合并几个mp4文件,所以我尝试使用mp4parser合并几个mp4。

private void mergeMp4(File output, String[] files) throws IOException {
    Movie[] inMovies = new Movie[files.length];
    for (int i=0, len = files.length; i<len; ++i) {
        inMovies[i] = MovieCreator.build("/tmp/tmp/" + files[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()])));
    }

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

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

// work correct for non-merged mp4 file
private long getDuration(String filename) throws IOException {
    IsoFile isoFile = new IsoFile(filename);
    long lengthInSeconds = isoFile.getMovieBox().getMovieHeaderBox().getDuration() / isoFile.getMovieBox().getMovieHeaderBox().getTimescale();

    return lengthInSeconds * 1000;
} 
如果我尝试使用android MediaPlayer或任何其他播放器播放合并文件:

player = new MediaPlayer();
try {
    player.setDataSource(getFilename());
    player.prepare();
    player.start();
    int duration = player.getDuaration();
    // both print value near 0 (about 20 millis)
    Log.d("TAG", String.valueOf(duration));
    System.out.println(duration);
} catch (IOException e) {
    Log.e(TAG, "prepare() failed", e);
}

它可以合并文件,但所有MediaPlayer,甚至mp4parser方法获取持续时间的作者都会返回持续时间始终约为0(零)秒。

使用isoviewer-1.0-RC-28(旧版本)解决
player = new MediaPlayer();
try {
    player.setDataSource(getFilename());
    player.prepare();
    player.start();
    int duration = player.getDuaration();
    // both print value near 0 (about 20 millis)
    Log.d("TAG", String.valueOf(duration));
    System.out.println(duration);
} catch (IOException e) {
    Log.e(TAG, "prepare() failed", e);
}