iMovie (tidak lossless, tetapi lebih baik dari sebelumnya)
iMovie v10 (dirilis beberapa saat setelah pertanyaan awalnya diajukan) sekarang lebih baik menangani lebih banyak jenis media, jadi hindari impor ulang penyandian untuk sebagian besar konten H.264 (mp4, m4v, mov, AVHDC, mts, mt2s).
Namun demikian, itu masih akan menyandikan ulang pada ekspor sehingga tidak dapat secara teknis lossless — fitur baru lainnya, bagaimanapun, adalah kemampuan untuk menyesuaikan kualitas ekspor, yang bisa lebih dekat ke lossless. Saya menduga bagian dari jawaban ini dapat berlaku sama untuk perangkat lunak pengeditan video 'yang digerakkan proyek' lainnya (mis. Premiere atau Final Cut) karena saya pikir mereka semua pada umumnya mengkodekan ulang pada keluaran, meskipun biasanya sangat mudah digunakan untuk pemangkasan yang tepat.
Secara pribadi, saya biasanya berpikir re-encode tunggal bukan masalah besar, tetapi mengerti Anda memang meminta solusi lossless, jadi ...
Lossless (tapi jauh lebih rumit!)
Ada batasan teknis tentang seberapa tepatnya Anda dapat memotong video tanpa harus menyandikan ulang setidaknya beberapa bagian darinya, dan pada dasarnya tergantung pada frekuensi i-frame. Jika setiap frame adalah i-frame, Anda dapat memotong di mana saja, tetapi jika mereka hanya setiap beberapa detik, maka Anda hanya dapat memotong tanpa kehilangan pada frame-i tersebut tanpa kehilangan konten atau harus menyandikan ulang (setidaknya bagian dari stream) sehingga bisa mulai dengan i-frame.
ffmpeg
T&J SO ini secara khusus memunculkan pertanyaan tentang bagaimana memotong antara i-frame menggunakan ffmpeg
. Saya tidak tahu ada aplikasi GUI untuk melakukan ini, tetapi pada dasarnya Anda menjalankan sesuatu perintah seperti berikut:
ffmpeg -i input.m4v -vcodec copy -acodec copy -ss 00:01:20.000 -t 00:37:50.000 output.m4v
Dua kali yang ditentukan adalah mulai dan durasi , dan dapat ditentukan sebagai detik atau hh:mm:ss.ss
, dan -acodec copy
dan -vcodec copy
beri tahu ffmpeg untuk tidak menyandikan ulang.
Saya tidak yakin apa yang terjadi jika Anda memotong terlalu dini, tapi saya pikir video pada dasarnya kosong (atau mungkin rusak, tergantung pada pemain) sampai bertemu dengan i-frame. Jadi, Anda mungkin ingin mencari bingkai-i terdekat sebelum potongan Anda. Jawaban ini memecahkan masalah menggunakan ffprobe
dan awk
, meskipun sedikit canggung. Pada dasarnya Anda gunakan ffprobe
untuk memindai bingkai dan menemukan bingkai kunci terdekat ( flags=K
) sebelum titik potong ideal Anda. Output penuh untuk setiap frame video dapat dilihat seperti ini:
ffprobe -select_streams v -show_frames <INPUT>
Jawaban yang ditautkan menyediakan perintah ini untuk menemukan bingkai kunci sebelum waktu tertentu:
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
Dan akhirnya, jika Anda benar-benar perlu memotong antara dua i-frame, Anda dapat membagi video dan bergabung kembali. Berdasarkan info dari jawaban ini , itu harus seperti:
ffmpeg -f concat -i list_of_videos.txt -c copy OUTPUT.mp4
Di mana list_of_videos.txt
file teks sederhana berisi daftar file yang ingin Anda gabungkan.
Ringkasan
iMovie mungkin cukup baik untuk sebagian besar kasus (sejak v10), dan sangat mudah.
ffmpeg dapat melakukannya tanpa rugi (atau sangat mendekati tanpa loss), dengan sedikit mengutak-atik; tingkat kesulitan tergantung pada seberapa pemilih Anda tentang titik awal yang tepat, dan frekuensi i-frame.