Alih-alih menggunakan -ss
dan -to
mencari parameter, yang tampaknya tidak terlalu akurat, dapatkah saya memotong video untuk nomor bingkai tertentu? Sebagai contoh;
ffmpeg -i video.webm -startingframe 80 -endingframe 560 output.webm
[Bingkai ke-80 dan bingkai ke-560 disertakan. Jadi, totalnya membuat (560 - 80 +1) bingkai]
Setelah jawaban dan sedikit pencarian, saya sudah mencoba beberapa perintah. Tetapi sejauh ini saya tidak dapat menemukan cara yang dapat diterima.
Jika seseorang ingin memotong streaming video antara frame 250 dan 750, ini adalah cara untuk pergi. Ini akan memberikan 501 frame sebagai output:
Catatan: movie.mp4 memiliki 25 fps, dan audio sample rate 48k
ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm
Seperti yang diharapkan, outputnya panjang 20 detik, tepatnya.
Menggunakan metode yang sama untuk audio:
ffmpeg -i movie.mp4 -vn -af "aselect=between(n\,480\,1440),setpts=PTS-STARTPTS" a_stream.webm
Tanpa diduga, akurasi yang satu ini sangat buruk. Seharusnya memberi saya 960001 (960k +1) sampel yang sama dengan audio 20 detik. Tetapi sebaliknya, hasilnya adalah 20,505 detik dan memiliki 984240 sampel. Juga, jika saya meningkatkan durasinya, kesalahan juga meningkat.
Kemudian saya mencoba menggunakan parameter -ss -to untuk memotong aliran audio:
ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm
Cara klasik lama bekerja lebih baik. Output adalah 20,003 detik dan memiliki 960144 sampel. Plus, meningkatkan durasi tidak meningkatkan kesalahan, kesalahannya konstan, selalu ada 144 sampel surplus dengan file input itu.
Ringkasnya:
select
filter bekerja dengan baik sebagian besar waktu tetapi pilih tidak. -ss
Parameter klasik berfungsi lebih baik untuk audio tetapi tidak akurat sampel. Selain itu, tidak mungkin untuk menggunakan -vf select
dan -ss
parameter secara bersama-sama, karena -ss
akan memengaruhi streaming audio dan video sementara kami menginginkannya hanya memengaruhi audio.
Jadi, untuk memotong file media dengan tepat saya harus melakukan 3 langkah ini:
ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm
ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm
ffmpeg -i v_stream.webm -i a_stream.webm -c:v copy -c:a copy movie-between_10th_and 20th_seconds.webm
Ini memberikan hasil yang paling akurat. Video berdurasi 20.000 detik dan Audio dengan frame-akurat 20,003 detik dan memiliki 960144 sampel. Tidak persis cocok dengan aliran video, tetapi tidak masalah. Hanya ada 144 sampel surplus. Kelemahan terbesar adalah, setiap kali saya ingin memotong file, saya harus mengirim 3 perintah untuk pekerjaan sederhana dan itu membuat dua file yang tidak perlu: a_stream.webm dan v_stream.webm. Dan select
filter tidak berfungsi pada beberapa file input yang saya coba. Berhasil melakukan pekerjaan (?) Tetapi tidak pernah menghentikan proses penyandian, jadi saya harus menutup command prompt setiap waktu.
select
dan aselect
memfilter untuk streaming video dan audio. Select
frame-akurat untuk video, tetapi aselect
tidak akurat sampel. Sebenarnya itu jauh dari akurat. Ini memberikan hasil yang jauh lebih buruk daripada menggunakan -ss
-to
paramaters sederhana . Karena itu, untuk saat ini, saya menggunakan kombinasi select
filter dan -ss
-to
parameter untuk mendapatkan pemotongan paling akurat. Tapi itu adalah cara kumuh untuk melakukannya. Silakan lihat posting pertama saya, saya telah menambahkan beberapa commandlines dan hasilnya