2

jcodec で生成した MP4 ファイルがあります。

次に、Android の MediaCodec で生成した AAC ファイルを用意します。

それらを 1 つのファイルにまとめて多重化したいのですが、Android API をあまり高く制限したくないので、MP4Parserを選択しています。


これが私の現在のコードです:

H264TrackImpl h264Track = new H264TrackImpl(new FileDataSourceImpl("input.mp4"));
AACTrackImpl aacTrack = new AACTrackImpl(new FileDataSourceImpl("input.aac"));

Movie movie = new Movie();
movie.addTrack(h264Track);
movie.addTrack(aacTrack);

Container mp4file = new DefaultMp4Builder().build(movie);

FileOutputStream fileOutputStream = new FileOutputStream(new File("output.mp4"));
FileChannel fc = fileOutputStream.getChannel();
mp4file.writeContainer(fc);
fileOutputStream.close();

コードは次の行でクラッシュします。

H264TrackImpl h264Track = new H264TrackImpl(new FileDataSourceImpl("input.mp4"));

これをスタック トレースとして使用します。

09-01 18:46:40.611: E/AndroidRuntime(14115): FATAL EXCEPTION: GLThread 1260
09-01 18:46:40.611: E/AndroidRuntime(14115): Process: package.app, PID: 14115
09-01 18:46:40.611: E/AndroidRuntime(14115): java.lang.RuntimeException: Sequence parameter set extension is not yet handled. Needs TLC.
09-01 18:46:40.611: E/AndroidRuntime(14115):    at com.googlecode.mp4parser.authoring.tracks.H264TrackImpl.readSamples(H264TrackImpl.java:362)
09-01 18:46:40.611: E/AndroidRuntime(14115):    at com.googlecode.mp4parser.authoring.tracks.H264TrackImpl.parse(H264TrackImpl.java:108)
09-01 18:46:40.611: E/AndroidRuntime(14115):    at com.googlecode.mp4parser.authoring.tracks.H264TrackImpl.<init>(H264TrackImpl.java:90)
09-01 18:46:40.611: E/AndroidRuntime(14115):    at com.googlecode.mp4parser.authoring.tracks.H264TrackImpl.<init>(H264TrackImpl.java:96)
09-01 18:46:40.611: E/AndroidRuntime(14115):    at com.googlecode.mp4parser.authoring.tracks.H264TrackImpl.<init>(H264TrackImpl.java:100)
09-01 18:46:40.611: E/AndroidRuntime(14115):    at ...

(クラッシュはこの関数のこの行で発生します。)


それで、それが何を意味するのか本当にわかりませんか?jcodec は、MP4Parser と互換性のない MP4 ファイル (すべてのビデオ プレーヤーで動作します) を出力しますか?

これを修正するには、何を調べる必要がありますか?

アドバイスをいただければ幸いです。


編集

間違った方法で行っていましたが、これはうまくいきました

Movie movie = MovieCreator.build(_videoFile.getAbsolutePath());

AACTrackImpl aacTrack = new AACTrackImpl(new FileDataSourceImpl(_aacFile));
CroppedTrack aacCroppedTrack = new CroppedTrack(aacTrack, 1, aacTrack.getSamples().size());
movie.addTrack(aacCroppedTrack);

Container mp4file = new DefaultMp4Builder().build(movie);

FileOutputStream fileOutputStream = new FileOutputStream(_outputFile);
FileChannel fc = fileOutputStream.getChannel();
mp4file.writeContainer(fc);
fileOutputStream.close();
4

1 に答える 1

1

これは私のために働いています....

        DataSource videoFile = new FileDataSourceImpl(filePath);

        Movie sor = MovieCreator.build(videoFile);

        List<Track> videoTracks = sor.getTracks();
        Track h264Track = null;

        for (Track t : videoTracks
             ) {
            if(t.getHandler().contains("vid"))
            {
                h264Track = t;
于 2015-12-08T16:45:51.853 に答える