ビデオを回転させて、ニーズの一部を調整する必要があります。以下のリストで詳細を説明します。
Vine のようなアプリを作成しています。ビデオ セグメントを録画してから、すべての部分を 1 つのファイルにマージする必要があります。ウェブサイトで提供されている例を使用して、最後のバージョン 1.0-RC-26 の mp4 パーサー ライブラリを使用する Android アプリで問題なくこれを行っています。
ビデオの追加の例は、すべてのビデオの向きが同じであれば問題なく動作しますが、前面カメラからビデオを録画する際にいくつか問題があることを発見したため、迅速な解決策は、ビデオの向きの録画を 270 に設定することでした。このソリューションの悪い部分は、この向きは、マージされたビデオでは間違った向きで表示されます。
これに対する私の考えられる解決策は、ビデオを回転させてさまざまな状況で必要なものを適用することですが、コードで実際に機能する例がありません。インターネットを検索すると、このようなソリューションが見つかりました here . このコードの問題は、最後のバージョンと互換性がないことです (コンパイル エラーが発生します)。ライブラリのロジックを理解しようとしましたが、結果が得られません。たとえばsetMatrix
、 Movie オブジェクトの命令を使用して実験しましたが、うまくいきません。
public static void mergeVideo(int SegmentNumber) throws Exception {
Log.d("PM", "Merge process started");
Movie[] inMovies = new Movie[SegmentNumber] ;
//long[] Matrix = new long[SegmentNumber];
for (int i = 1 ; i <= SegmentNumber; i++){
File file = new File(getCompleteFilePath(i));
if (file.exists()){
FileInputStream fis = new FileInputStream(getCompleteFilePath(i));
//Set rotation I tried to experiment with this instruction but is not working
inMovies [i-1].setMatrix(Matrix.ROTATE_90);
inMovies [i-1] = MovieCreator.build(fis.getChannel());
Log.d("PM", "Video " + i + " merged" );
}
//fis.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);
}
}
}
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);
//out.getMovieBox().getMovieHeaderBox().setMatrix(Matrix.ROTATE_180); //set orientation, default merged video have wrong orientation
// Create a media file name
//
String filename = getCompleteMergedVideoFilePath() ;
FileChannel fc = new RandomAccessFile(String.format(filename), "rw").getChannel();
out.writeContainer(fc);
fc.close();
//don't leave until the file is on his place
File file = new File (filename);
do {
if (! file.exists()){
Log.d("PM", "Result file not ready");
}
} while (! file.exists() );
//
Log.d("PM", "Merge process finished");
}
誰かが最新バージョンの Mp4 パーサーでビデオを回転させましたか? 英語は私の母国語ではないので、文法の誤りがあればお詫びします。