iMovie (не без втрат, але краще, ніж раніше)
iMovie v10 (випущений через деякий час після того, як питання було задано спочатку) тепер краще обробляє більше типів мультимедіа, тому уникає перекодування імпорту для більшості H.264 (mp4, m4v, mov, AVHDC, mts, mt2s) вмісту.
Однак він все одно буде перекодований при експорті, тому технічно не може бути без втрат - однак, іншою новою особливістю є можливість налаштування якості експорту, яка може бути наближена до втрат. Я підозрюю, що ця частина відповіді може застосовуватися однаково до іншого програмного забезпечення для редагування відео (напр. Прем'єра або Фінальний виріз), тому що я думаю, що вони взагалі перекодуються на виході, хоча зазвичай дуже прості у використанні для точного обрізання.
Особисто я думаю, що одне перекодування не є великою проблемою, але розумію, ви спеціально просили рішення без втрат, тому ...
Без втрат (але складніше!)
Існують технічні обмеження щодо того, наскільки точно ви можете вирізати відео, не потребуючи повторного кодування хоч якоїсь його частини, і це в основному залежить від частоти i-кадру. Якщо кожен кадр є i-кадром, ви можете вирізати будь-де, але якщо вони є лише кожні кілька секунд, ви можете зрізати лише ті i-кадри без втрати вмісту або повторного кодування (принаймні, частина потік), тому він може починатися з i-кадру.
ffmpeg
Ця відповідь на запитання і запитання конкретно ставить питання про те, як перерізати між i-фреймами за допомогою ffmpeg
. Я не знаю жодного додатку GUI для цього, але в основному ви запускаєте команду щось на зразок наступного:
ffmpeg -i input.m4v -vcodec copy -acodec copy -ss 00:01:20.000 -t 00:37:50.000 output.m4v
Зазначені два рази - початок і тривалість , і їх можна вказати як секунди, або hh:mm:ss.ss
, -acodec copy
і -vcodec copy
скажіть ffmpeg не перекодувати повторно.
Я не точно впевнений, що станеться, якщо ви вирізаєте занадто рано, але я думаю, що відео по суті порожнє (або, можливо, пошкоджене, залежно від гравця), поки воно не зустріне i-кадр. Тож ви, мабуть, захочете знайти найближчий i-кадр перед вирізанням. Ця відповідь вирішує цю проблему з допомогою ffprobe
і awk
, хоча і трохи ніяково. По суті, ви використовуєте ffprobe
для сканування кадрів і пошуку найближчого ключового кадру ( flags=K
) перед ідеальною точкою вирізу. Повний вихід для кожного кадру відео можна побачити так:
ffprobe -select_streams v -show_frames <INPUT>
Зв'язана відповідь подає цю команду, щоб знайти ключовий кадр до певного часу:
ffprobe -select_streams v -show_frames -v quiet INPUT.mp4 |
awk -F= '
/pict_type=/ { if (index($2, "I")) { i=1; } else { i=0; } }
/pkt_pts_time/ { if (i && ($2 >= 150)) print $2; }
' | head -n 1
І нарешті, якщо вам дійсно потрібно вирізати десь між двома i-кадрами, ви можете розділити відео та повторно приєднатись. Виходячи з інформації з цієї відповіді , це має бути щось на зразок:
ffmpeg -f concat -i list_of_videos.txt -c copy OUTPUT.mp4
Де list_of_videos.txt
простий текстовий файл із переліком файлів, які потрібно об'єднати.
Підсумок
iMovie, ймовірно, досить хороший для більшості випадків (починаючи з v10), і дуже легко.
ffmpeg може зробити це без втрат (або дуже близько до втрат), трохи поводячись; Рівень складності залежить від того, наскільки ви прискіпливі до точної стартової точки та частоти i-кадрів.