サムスンギャラクシーIIでフルHDビデオを録画しましたが、YouTubeにアップロードしたときに、ポートレートレイアウト1080x1920ではなく、1920x1080のように90度回転したことがわかりました。問題の原因を見つけました:
YouTubeは動画のメタデータを読み取り、エンコードする前にExif方向に従って動画を回転させています
これはExifToolレポートです(最後のタグ「Rotation」を参照してください):
ExifTool Version Number : 8.61
File Name : video.mp4
Directory : .
File Size : 217 MB
File Modification Date/Time : 2011:08:11 00:47:23+04:00
File Permissions : rw-rw-rw-
File Type : 3GP
MIME Type : video/3gpp
Major Brand : 3GPP Media (.3GP) Release 4
Minor Version : 0.3.0
Compatible Brands : 3gp4, 3gp6
Movie Data Size : 227471371
Movie Header Version : 0
Create Date : 1900:01:00 00:00:00
Modify Date : 1900:01:00 00:00:00
Time Scale : 1000
Duration : 0:01:46
Preferred Rate : 1
Preferred Volume : 100.00%
Preview Time : 0 s
Preview Duration : 0 s
Poster Time : 0 s
Selection Time : 0 s
Selection Duration : 0 s
Current Time : 0 s
Next Track ID : 3
Track Header Version : 0
Track Create Date : 1900:01:00 00:00:00
Track Modify Date : 1900:01:00 00:00:00
Track ID : 1
Track Duration : 0:01:46
Track Layer : 0
Track Volume : 0.00%
Image Width : 1920
Image Height : 1080
Graphics Mode : srcCopy
Op Color : 0 0 0
Compressor ID : avc1
Source Image Width : 1920
Source Image Height : 1080
X Resolution : 72
Y Resolution : 72
Bit Depth : 24
Video Frame Rate : 30.023
Matrix Structure : 1 0 0 0 1 0 0 0 1
Media Header Version : 0
Media Create Date : 1900:01:00 00:00:00
Media Modify Date : 1900:01:00 00:00:00
Media Time Scale : 16000
Media Duration : 0:01:46
Handler Type : Audio Track
Handler Description : SoundHandler
Balance : 0
Audio Format : mp4a
Audio Channels : 1
Audio Bits Per Sample : 16
Audio Sample Rate : 16000
Play Mode : SEQ_PLAY
Avg Bitrate : 17.1 Mbps
Image Size : 1920x1080
Rotation : 90
Exifデータ全体を削除したり、Rotationプロパティを編集したりするにはどうすればよいですか?
Mp4ファイル(および他の多くのファイル)は MPEG-4 標準を使用します。これは、その中のデータをアトムと呼ばれる小さなボックスに配置します。この ページ で原子のすばらしい説明を見つけることができます。要するに、アトムはツリーのような構造で編成され、atomは他のアトムの親またはデータのコンテナーのいずれかですが、両方ではありません(一部の人々はこのルールに違反します)
特に、探しているatomは「tkhd」(トラックヘッダー)と呼ばれます。アトムのリストを見つけることができます ここ 。
この中にatomあなたはビデオのメタデータを見つけるでしょう。 "tkhd"の構造atomが指定されています here
最後に、必要なメタデータのチャンク(これはアトムではありません)は「マトリックス構造」と呼ばれます。 developer.Apple.com から:
行列のすべての値は、16ビットで分割された32ビットの固定小数点数です。ただし、{u、v、w}列には、2.30で分割された32ビットの固定小数点数が含まれています。
これを次の図に示します。
9バイトのマトリックスは、「tkhd」アトムのバイト48から始まります。 0度の向きの「マトリックス構造」の例は、1 0 0 0 1 0 0 0 1(単位マトリックス)です。
そう!
結局のところ、必要なのはこのマトリックスを変更することです。次のパラグラフは developer.Apple.com から取得されます:
変換マトリックスは、ある座標空間から別の座標空間にポイントをマッピングする方法を定義します。変換マトリックスの内容を変更することにより、変換、回転、スケーリングなど、いくつかの標準的なグラフィック表示操作を実行できます。 2次元変換を実行するために使用される行列は、3行3列の行列によって数学的に記述されます。
つまり、変換行列は、各座標を新しい座標にマッピングする関数を定義します。
画像を回転させるだけでよいので、バイト0、1、3、4、6、7で定義される左端の2 x 3マトリックスを変更するだけです。
以下は、各方向を表すために使用する2 x 3マトリックスです(3x3マトリックスの値0、1、3、4、6、7)。
0°:(x '、y')=(x、y)
1 0
0 1
0 0
90°:(x '、y')=(高さ-y、x)
0 1
-1 0
高さ0
180°:(x '、y')=(幅-x、高さ-y)
-1 0
0 -1
幅高さ
270°:(x '、y')=(y、幅-x)
0 -1
1 0
0幅
それらがない場合、幅と高さはマトリックス構造の直後に取得できます。また、4バイト(16.16)の固定小数点数です。
ビデオメタデータに90°マトリックスが含まれている可能性が高いです
(彼の助けと素晴らしいソフトウェアを提供してくれた Exiftool の作成者であるPhil Harveyに感謝します)
私の場合、exifデータを変更しても問題は解決しませんでした。なぜなら、実際には正しいからです。問題は、ほとんどのプレーヤーがそれを無視することです(つまり、彼らはそれを0と見なします)。
Rotation exifタグを使用したい場合は、MediaRecorder.setOrientationHint()を使用して制御できます。これは、事後に修正するよりもはるかに簡単です。 YouTubeアップローダーがタグを尊重している場合は、それで十分です。
しかし、私が見つけた唯一の解決策は、ビデオ自体を回転させるか、UIヒントを使用して、カメラの自然な0方向でビデオを記録するようにユーザーをガイドすることです。
Androidには、ビデオを回転させるための組み込みメカニズムはありません。