3

オーディオ (aac 形式) とビデオ (mp4 形式) をマージする必要があります。これには mp4parser ライブラリを使用します。

public static boolean mergeMP4withAAC(String videoFilePath, String audioFilePath, String outFilePath) {
    try {
        /* Load a MP4 file as movie */
        Movie movieVideo = MovieCreator.build(videoFilePath);

        /* Fetch needed audio track and video track from MP4 file */
        Track audioTrack = new AACTrackImpl(new FileDataSourceImpl(audioFilePath));
        Track videoTrack = movieVideo.getTracks().get(0);

        double t1 = 1.0 * videoTrack.getDuration() / videoTrack.getTrackMetaData().getTimescale();
        double t2 = 1.0 * audioTrack.getDuration() / audioTrack.getTrackMetaData().getTimescale();
        Log.d(TAG, t1 + " " + t2);

        double factor = (t1 * audioTrack.getTrackMetaData().getTimescale()) / audioTrack.getDuration();
        Log.d(TAG, "factor = " + factor);

        /* Construct a movie */
        Movie movie = new Movie();
        if (factor < 1.0) {
            long trackSize = audioTrack.getSamples().size();
            long sampleNeeded = (long) (trackSize * factor);

            Log.d(TAG, (trackSize - sampleNeeded - 1) + " " + trackSize);

            movie.addTrack(videoTrack);
            movie.addTrack(new CroppedTrack(audioTrack, trackSize - sampleNeeded - 1, trackSize));
        } else {
            Log.d(TAG, "mergeMP4withAAC 1");
            long trackSize = videoTrack.getSamples().size();
            long sampleNeeded = (long) (trackSize / factor);
            movie.addTrack(new CroppedTrack(videoTrack, trackSize - sampleNeeded - 1, trackSize));
            Log.d(TAG, "mergeMP4withAAC 2");
            movie.addTrack(audioTrack);
            Log.d(TAG, "mergeMP4withAAC 3");
        }

        /* Build it */
        Container mp4file = new DefaultMp4Builder().build(movie);
        Log.d(TAG, "mergeMP4withAAC 4");
        /* Write resulted MP4 to file */
        FileChannel fc = new FileOutputStream(new File(outFilePath)).getChannel();
        Log.d(TAG, "mergeMP4withAAC 5 " + mp4file.getBoxes().size());
        mp4file.writeContainer(fc); // the problem I guess may be here
        Log.d(TAG, "mergeMP4withAAC 6");
        fc.close();
        Log.d(TAG, "mergeMP4withAAC 7");
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }

    return true;
}

しかし、ビデオ ファイルが 5 ~ 6 分を超えると、一部のデバイスが動作しなくなります (つまり、UI がフリーズし、ユーザーは何もできませんが、Android はメッセージを表示しません。アプリを再開する唯一の方法は、デバイスを再起動します)。

コードスニペットでわかるように、すべての行をログに記録しましたが、結果ファイルをディスクに書き込む行に問題があることがわかりました。

また、さまざまなデバイスでテストしました。Moto G (第 1 世代)、Moto G (第 2 世代) (Android 5.0.2)、Nexus 5 (Android 5.1.1) は 5 ~ 6 分を超えてファイルをマージできませんが、Nexus 7 (Android 5.1.1) はファイルをマージできます。 10分以上。

それで、誰かがこれについて私に説明したり、アドバイスや例を教えてくれませんか. どうもありがとう。

4

0 に答える 0