Поворот mp4 відео без перекодування


76

Я шукаю спосіб обертати відео, зняті на моєму Nexus 4, на моїй системі Debian Wheezy. Відео знімаються в портретному режимі, і я хотів би повернути їх у альбомний режим. Переважно обертання здійснюється за допомогою командного рядка.

Я знайшов кілька попередніх запитань, які натякають на хороше рішення, але, здається, мені не вдається змусити його працювати.

Для початку було таке питання: обертання відео за допомогою FFmpeg

Але це вказує на те, що ffmpeg застарів і що я повинен використовувати avconv. Я знайшов це запитання, де детально описував шлях подальшого руху. /ubuntu/269429/how-can-i-rotate-video-by-180-degrees-with-avconv

Це змусило мене скористатися наступною командою:

avconv -i original.mp4 -vf "transpose=1" -codec:v libx264 -preset slow -crf 25 -codec:a copy flipped.mp4

Однак це доволі повільно (останнє випробування зайняло у мене більше 6 годин на менш ніж 3 хвилини відео) і не призводить до відтворення фільму. Я також отримую помилку в журналі виводу, яка стверджує Mb Rate> обмеження рівня.

Чи є тут проблема із перекодуванням? Чи слід спочатку перекодувати відео зі свого телефону в інше, більш «працездатне» кодування, перш ніж застосовувати обертання? Або я втрачаю ще один важливий момент?


5
ffmpegвід FFmpeg не застаріла. Фальшивий, підроблений " ffmpeg" від Libav (вилка FFmpeg) - це те, що застаріло. Ви не можете обертати без повторного кодування, якщо: 1) введено MJPEG, або 2) обернено під час відтворення.
llogan

@LordNeckbeard Як я можу сказати різницю? Я використовував менеджер пакунків для встановлення ffmpeg, тому я здогадуюсь, що я правильно ввімкнув?
stedes


Відповіді:


113

Якщо ви просто хочете змінити метадані таким чином, щоб програвачі мультимедіа, які вважають прапором відтворення файлу оберненим, спробуйте щось на зразок:

ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=90 output.mp4

як знайдено деінде на stackoverflow .


Я спробував це, але ніякого успіху. Я використовую mplayer на Lubuntu. Отже, як прочитати метадані, щоб перевірити, чи були вони змінені?
Sigur

3
@Sigur спробуйте ffprobe -v quiet output.mp4 -show_streams|grep rot. На відео, де обертання було успішно застосовано, я бачу такий результат:TAG:rotate=90 rotation=-90
kwc

2
Чи є пояснення параметрів? Напр. Я знайшов одну відповідь, де :0після -metadataцього немає - що це робить? Для чого -c copy? ..
Денніс98,

9
Гаразд, щойно знову зіткнувся з цим запитанням, але маю набагато більше досвіду з FFmpeg. :s:v:0Після того, як -metadataце потік специфікатор, який просто говорить FFmpeg в якій потік він повинен додати метадані. :sпросто означає потоки вхідного файлу, :vвибирає відеопотоки, а число є індексом потоку, що базується на нулі - отже, це буде лише вибір першого відеопотоку. Оскільки у вас зазвичай немає більше одного відеопотоку, це :s:vмає призвести до того ж. У -cпараметр вказує кодек для використання з copyдля простого копіювання потоків, без перекодування.
Dennis98

2
Не всі гравці підтримають це
Хамід Реза

51

Поворот = 0 вирішив мою проблему. Я почав записувати відео в портретному режимі, зрозумів свою помилку і негайно перевів телефон у альбомне, щоб продовжити запис. Мій iphone позначив відео як портрет для всього відео.

ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=0 output.mp4

Виправлено.


8
Ви можете пояснити більше цього параметра, будь ласка?
Зулу

34

FFmpegта подібні програми змінюють метадані навіть за умови -map_metadataвибору. exiftoolможе читати матрицю обертання та прапор обертання, а з версії 10.89 також пише її, як описано нижче.

Щоб отримати справжнє обертання без втрат (включаючи метадані), я не міг знайти рішення, тому я взяв шістнадцятковий редактор (наприклад, HxD ) та проаналізував обернені відеофайли.

Справжнє обертання MP4 без втрат:

  • відкрийте mp4 за допомогою шістнадцяткового редактора та виконайте пошук, videщоб знайти метадані відео доріжки
  • кілька рядків вище (для моїх файлів переважно 9, іноді 12) ви повинні побачити trak...\tkhd
  • між ними повинен бути @знак (HEX 40)
  • у двох рядках перед нею зберігається матриця обертання
  • відсутність обертання:

    00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    40
    
  • 180 °:

    FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    40
    
  • 90 ° cw:

    00 00 00 00 00 01 00 00 00 00 00 00 FF FF 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    40 
    
  • 90 ° ccw:

    00 00 00 00 FF FF 00 00 00 00 00 00 00 01 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    40
    

Змініть файл, як вам потрібно, і його слід обертати в програвачах, які підтримують прапорець обертання (більшість поточних гравців).

Якщо ваше відео містить стереозвук, це, очевидно, не перемикається, тому, якщо ви хочете, щоб звук відповідав обертанню відео (180 °), вам потрібно переключити лівий та правий канали.


5
Я не можу зрозуміти, як це не отримало жодного голосу. Інші відповіді дають зрозумілу брехню, що ви не можете обертати відео без втрат, якщо це не MJPEG. Це спрацювало для мене, це було без втрат, не перекодувало (миттєво), і я маю впевненість, що ніщо інше у файлі не змінюється, і мені не доведеться клопотати із завантаженням випадкових виконуваних двійкових файлів з мережі. Це було навіть швидше, ніж налаштування командного рядка з прийнятої відповіді. Майте підтримку і подяку! :)
deLock

1
Дякую. Я думаю, це проблема пошуку кращого рішення старого питання з декількома відповідями тут, на SX. Насправді є кілька подібних тем, на які я намагався відповісти / допомогти з цією інформацією, але був заблокований іншими більш складними користувачами. Однак більше обговорень щодо мета SX.
aXeL-HH

1
Просто спробував. Гарний. Це зайняло лише кілька секунд, чудово працювало і на 100% реверсується до вихідного файлу. Дякую!
Spire

1
@ user3469861 Код інтегрований у exiftool v10.89, можливо, ви просто захочете використати це: u88.n24.queensu.ca/exiftool/forum/index.php/…
aXeL-HH

1
Я також переробив цей метод на самостійний інструмент .
AndreKR

2

Є кілька речей, які ви торкнулися у своєму питанні:

  1. Майже немає шансів, що ви зможете обертатись без перекодування. Виняток із цього правила (кодек MJPEG) уже вказувався, але навряд чи ви ним користуєтесь, тому це виходить за рамки цього питання. Я згадаю, що причиною такої можливості є те, що JPEG можна перетворити за допомогою метаданих. Таким чином, якщо ви зможете знайти контейнер, який має обертання метаданих, ви зможете обертатись, але жоден поки що не існує (або досить широко розповсюджений).
  2. Якщо на обертання та перекодування відеозапису за 3 хвилини пішло три години, проблема може полягати у величезній роздільній здатності. І я маю на увазі величезний ! Чи можете ви, будь ласка, надати результати, avprobe original.mp4щоб це можна було встановити.
  3. Дебати проти Libav проти FFmpeg дуже контрпродуктивні (ви можете бачити це за розміром розміщеного тут футболу). В основному те, що сталося, - це розкол проекту, коли деякі розробники рухаються в один бік, а деякі в інший, той факт, що проект FFmpeg зумів зберегти назву, - це лише випадковість, і немає сенсу називати один проект оригінальним, а інший виделкою. Відмінності між проектами здебільшого полягають у стилі розробки та у філософії. Якби ви охарактеризували FFmpeg як більше відкритого коду, а Libav як більше вільного програмного забезпечення, ви б не помилились. Раціональні люди сподіваються, що врешті-решт розробники схаменуться і, можливо, не об’єднають проекти, а співпрацюватимуть у більшій мірі. Коли спочатку вийшов Ubuntu, у кожному чаті Debian GNU / Linux з'являлися величезні повідомлення на кшталт "

3
JPEG також можна обертати без втрат без зміни метаданих
Уолтер Тросс

@WalterTross Як я розумію, процес, який можна зробити, лише якщо роздільна здатність ділиться на розмір блоку, якщо ні, то лише змінивши EXIF, ви можете зробити це по-справжньому без втрат. Будь ласка, виправте мене, якщо я помиляюся.
v010dya

2

Ця відповідь - це просто підсумок коментарів, наданих LordNeckbeard.

Обертання без кодування

Поворот без перекодування неможливий, якщо:

  • Ваше введення - MJPEG
  • ви обертаєтесь під час відтворення

Поверніть за допомогою кодування, використовуючи правильний ffmpeg

Щоб правильно зрозуміти кроки, необхідні для цього, слід почати з прочитання або, принаймні, вивчення цього питання:

Які відмінності та подібності між ffmpeg, libav та avconv?

Короткий зміст: avconv - це форк ffmpeg, супровідник debian вибрав avconv, вам потрібно скомпілювати правильний ffmpeg з джерела.

Наступним кроком буде компіляція правильного ffmpeg з джерела, як тут докладно описано:

Посібник із компіляції ffmpeg для Debian

Останній крок - використання команд, знайдених в інших повідомленнях:

Як перевернути відео на 180 ° (вертикально / догори дном) за допомогою FFmpeg? або обертання відео за допомогою FFmpeg

Короткий зміст: ffmpeg -vfilters "rotate = 90" -i input.mp4 output.mp4

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.