Saya mencoba menghapus beberapa bagian video menggunakan FFmpeg.
Misalnya, bayangkan jika Anda merekam acara di televisi dan ingin memotong iklannya. Ini sederhana dengan editor video GUI; Anda cukup menandai awal dan akhir dari setiap klip yang akan dihapus, dan pilih hapus. Saya mencoba melakukan hal yang sama dari command-line dengan FFmpeg.
Saya tahu cara memotong satu segmen ke video baru seperti:
ffmpeg -i input.avi -ss 00:00:20 -t 00:00:05 -map 0 -codec copy output.avi
Ini memotong klip lima detik dan menyimpannya sebagai file video baru, tetapi bagaimana saya bisa melakukan yang sebaliknya dan menyimpan seluruh video tanpa klip yang ditentukan, dan bagaimana saya bisa menentukan beberapa klip untuk dihapus?
Misalnya, jika video saya dapat diwakili oleh ABCDEFG, saya ingin membuat yang baru yang terdiri dari ACDFG.
sumber
Jawaban:
Nah, Anda masih bisa menggunakan
trim
filter untuk itu. Berikut ini contohnya, mari kita asumsikan bahwa Anda ingin memotong segmen 30-40 detik (10 detik) dan 50-80 detik (30 detik):Apa yang saya lakukan di sini? Saya memangkas 30 detik pertama, 40-50 detik dan 80 detik untuk mengakhiri, dan kemudian menggabungkannya ke dalam aliran
out1
denganconcat
filter.Tentang setpts: kita memerlukan ini karena trim tidak mengubah waktu tampilan gambar, dan ketika kita memotong penghitung decoder 10 detik tidak melihat bingkai untuk 10 detik ini.
Jika Anda ingin memiliki audio juga, Anda harus melakukan hal yang sama untuk stream audio. Jadi perintahnya adalah:
sumber
Saya tidak pernah bisa mendapatkan solusi ptQa untuk bekerja, terutama karena saya tidak pernah tahu apa arti kesalahan dari filter atau cara memperbaikinya. Solusi saya tampaknya agak clunkier karena dapat meninggalkan kekacauan, tetapi jika Anda melemparkannya ke dalam skrip, pembersihan dapat dilakukan secara otomatis. Saya juga menyukai pendekatan ini karena jika ada yang salah pada langkah 4, Anda berakhir dengan langkah 1-3 sehingga pemulihan dari kesalahan sedikit lebih efisien.
Strategi dasar menggunakan
-t
dan-ss
untuk mendapatkan video dari setiap segmen yang Anda inginkan, kemudian bergabung bersama semua bagian untuk versi final Anda.Katakanlah Anda memiliki 6 segmen ABCDEF setiap 5 detik dan Anda menginginkan A (0-5 detik), C (10-15 detik) dan E (20-25 detik) Anda akan melakukan ini:
atau
Itu akan membuat file a.tvshow, c.tvshow dan e.tvshow. Yang
-t
mengatakan berapa lama setiap klip, jadi jika c adalah 30 detik, Anda bisa lulus dalam 30 atau 0:00:30. The-ss
pilihan mengatakan seberapa jauh untuk melewati ke sumber video, sehingga selalu relatif terhadap awal file.Kemudian setelah Anda memiliki banyak file video saya membuat file
ace-files.txt
seperti ini:Catat "file" di awal dan nama file yang lolos setelah itu.
Lalu perintahnya:
Itu menggabungkan semua file
abe-files.txt
bersama-sama, menyalin codec audio dan video mereka dan membuat fileace.tvshow
yang seharusnya hanya bagian a, c dan e. Kemudian hanya ingat untuk menghapusace-files.txt
,a.tvshow
,c.tvshow
dane.tvshow
.Penafian : Saya tidak tahu bagaimana efisien dalam hal ini dibandingkan dengan pendekatan lain dalam hal
ffmpeg
tetapi untuk tujuan saya itu bekerja lebih baik. Semoga ini bisa membantu seseorang.sumber
ace-files.txt
dalam contoh Anda) dengan:ffmpeg -f concat -i <(printf "file '%s'\n" $(pwd)/prefix_*.tvshow) -c copy output.tvshow
Saya membuat skrip untuk mempercepat pengeditan rekaman TV. Script meminta Anda untuk awal dan akhir kali segmen yang ingin Anda simpan dan bagi menjadi beberapa file. Ini memberi Anda opsi, Anda dapat:
Video aksi itu: di sini
Biarkan aku tahu apa yang Anda pikirkan.
sumber
safe=0
, yaituffmpeg -f concat -safe 0 -i ...
Lihat ffmpeg.org/ffmpeg-all.html#Options-36Meskipun jawaban yang diberikan oleh ptQa tampaknya berhasil, saya telah mengembangkan solusi lain yang terbukti bekerja dengan baik.
Pada dasarnya, apa yang saya lakukan adalah memotong satu video untuk setiap bagian dari video asli yang ingin saya sertakan pada hasil saya. Kemudian, saya menggabungkannya dengan Concat Demuxer yang dijelaskan di sini .
Solusinya sama dengan yang saya coba dulu dan sajikan masalah sinkronisasi. Apa yang saya tambahkan adalah perintah -avoid_negative_ts 1 saat membuat video yang berbeda. Dengan solusi ini, masalah sinkronisasi menghilang.
sumber
Bagi mereka yang mengalami kesulitan dalam mengikuti pendekatan ptQa, ada cara yang sedikit lebih efisien untuk melakukannya. Daripada menyatukan setiap langkah, lakukan saja semuanya di akhir.
Untuk setiap input, tentukan pasangan A / V:
Tentukan pasangan sebanyak yang Anda butuhkan, kemudian gabungkan semuanya dalam satu pass, di mana n = jumlah input total.
Ini dapat dengan mudah dibangun dalam satu lingkaran.
Perintah lengkap yang menggunakan 2 input mungkin terlihat seperti ini:
sumber