Jak usunąć lub edytować Exif z wideo mp4?

Nagrałem Film Full HD z Samsungiem Galaxy II, kiedy wrzuciłem go na YouTube okazało się, że obrócił się do 90 stopni jak układ portretowy 1080x1920 nie 1920x1080. Znalazłem przyczynę problemu:

YouTube czyta metadane wideo i obraca wideo acording Exif orientacja przed kodowaniem

To jest raport ExifTool (Zobacz ostatni tag " rotacja"): {[0]}

Jak usunąć całe dane Exif lub po prostu edytować właściwość rotacji?

Author: Exey Panteleev, 2011-08-11

2 answers

Pliki Mp4 (i wiele innych) używają standardu MPEG-4, który porządkuje dane wewnątrz niego w małych pudełkach zwanych atomami. Możesz znaleźć świetny opis atomów na tej Stronie. W skrócie, atomy są zorganizowane w strukturę podobną do drzewa, gdzie atom może być rodzicem innych atomów lub kontenerem danych, ale nie oba (chociaż niektórzy ludzie łamią tę regułę) {]}

W szczególności atom, którego szukasz, nazywa się "tkhd" (nagłówek ścieżki). Możesz znaleźć listę Atomy tutaj .

W tym atomie znajdziesz metadane wideo. Struktura atomu" tkhd " jest określona tutaj

Wreszcie fragment metadanych, których potrzebujesz (który nie jest atomem), nazywa się"strukturą macierzy". Od developer.apple.com :

Wszystkie wartości w macierzy są 32-bitowymi liczbami stałopunktowymi podzielonymi jako 16.16, z wyjątkiem kolumny {U, v, W}, która zawiera 32-bitowe liczby punktowe podzielone jako 2.30.

Jest to pokazane na poniższym obrazku:

"Struktura macierzy" macierz transformacji

9-bajtowa macierz zaczyna się w bajcie 48 atomu "tkhd". Przykładem "struktury macierzy" dla orientacji 0° byłoby 1 0 0 0 1 0 0 0 1 (macierz tożsamości)

Więc!

Po tym wszystkim, musisz zmodyfikować tę matrycę. Następny parragraf pochodzi z developer.apple.com :

Macierz transformacji określa sposób odwzorowania punktów z jednej współrzędnej przestrzeń do innej przestrzeni współrzędnych. Modyfikując zawartość macierz transformacji, można wykonać kilka standardowych grafik operacje wyświetlania, w tym tłumaczenie, obracanie i skalowanie. Na macierz używana do realizacji przekształceń dwuwymiarowych jest opisana matematycznie przez macierz 3 na 3.

Oznacza to, że macierz transformacji definiuje funkcję, która odwzorowuje każdą współrzędną w nową.

Ponieważ wystarczy tylko obrócić obraz, wystarczy Modyfikuj lewą większość macierzy 2 x 3, która jest zdefiniowana bajtami 0, 1, 3, 4, 6 i 7.

Oto macierze 2 x 3, których używam do reprezentowania każdej orientacji (wartości 0, 1, 3, 4, 6 i 7 z macierzy 3x3):

0°: (x', y') = (x, y)
1 0
0 1
0 0

90°: (x', y') = (height-y, x)
0 1
-1 0
Wysokość 0

180°: (x', y') = (widht-x, height-y)
-1 0
0 -1
szerokość wysokość

270°: (x', y') = (y, width-x)
0 -1
1 0
0 width

Jeśli ich nie masz, szerokość i wysokość można uzyskać tuż po strukturze macierzy. Są to również stałe liczby punktów 4 bajtów (16.16).

Jest całkiem prawdopodobne, że metadane wideo zawierają matrycę 90°

(podziękowania dla Phila Harveya, twórcyExiftool za jego pomoc i wspaniałe oprogramowanie)

 39
Author: ignacio.munizaga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-24 18:08:13

W moim przypadku zmiana danych exif nie rozwiązała problemu, ponieważ w rzeczywistości jest poprawna. Problem polega na tym, że większość graczy ignoruje go(tj. zakładają, że jest 0).

Jeśli chcesz grać z tagiem Exif Rotation, możesz go kontrolować za pomocą MediaRecorder.setOrientationHint(). Jest to o wiele łatwiejsze niż modyfikowanie go po fakcie. Jeśli uploader YouTube szanuje tag, to wszystko, czego potrzebujesz.

Ale jedynym rozwiązaniem, jakie znalazłem, jest obrócenie samego wideo lub Użyj podpowiedzi interfejsu użytkownika, aby poprowadzić użytkowników do nagrywania wideo w naturalnej orientacji 0 kamery.

Nie ma wbudowanego mechanizmu do obracania filmów w Androidzie.

 0
Author: tennessee sombrero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-10 22:51:38