memotong dengan hasil ffmpeg dalam beberapa detik layar hitam, bagaimana cara memperbaikinya?

8

Saya menggunakan perintah ini untuk memotong segmen dari video dari baris perintah

ffmpeg -i %1 -vcodec copy -acodec copy -ss %2 -t %3 %~n1_cut%~x1

dan saya menyebutnya seperti

cut.bat video.mp4 001:23:45:678 10

dan seperti yang diharapkan saya mendapatkan video_cut.mp4 dengan 10 detik dari video asli, masalahnya adalah bahwa beberapa detik dari file yang dihasilkan adalah layar hitam dengan audio, mengapa ini terjadi dan bagaimana cara memperbaikinya?

beberapa pria
sumber
% ~ n1_cut% ~ x1 apa arti bagian perintah ini?
ScipioAfricanus
@ScipioAfricanus %~n1memperluas% 1 ke Nama file, atau jika hanya ada path (tanpa trailing backslash) - folder terakhir di path itu dan %~x1memperluas% 1 ke file eXtension saja - .txt sumber: superuser.com/questions/ 224416 / ...
Shayan

Jawaban:

8

Sebagian besar video menggunakan codec yang melakukan kompresi temporal, sehingga cutpoint yang ditentukan mungkin mengandalkan frame sebelum (dan setelah) cutpoint yang akan diterjemahkan dengan benar. Jadi, ketika Anda menggunakan ffmpeg untuk memotong video dan menggunakan copymode, ffmpeg harus menyertakan semua frame sebelum dan sesudah segmen yang dipangkas yang diperlukan untuk mendekode segmen dengan benar.

Jadi, Anda memiliki dua opsi, gunakan mode salin tetapi tetapkan sakelar yang memungkinkan semua pemain memainkan file-file ini dengan benar

ffmpeg -ss %2 -t %3 -i %1 -vcodec copy -acodec copy -avoid_negative_ts make_zero %~n1_cut%~x1

(ini kemungkinan akan menghasilkan output yang dimulai sebelum cutpoint Anda)

atau menyandikan ulang stream

ffmpeg -ss %2 -t %3 -i %1 %~n1_cut%~x1
Gyan
sumber
Meskipun pengodean ulang lebih lambat, itu akan menghasilkan hasil yang lebih baik, karena dengan solusi lain video mungkin lebih lama dari apa yang ditentukan dalam -topsi.
totymedli
@Gyan Apa yang %harus dilakukan? Saya mencoba mencari ffmpeg.org/ffmpeg.html tetapi saya tidak dapat menemukan penggunaannya.
Shayan
Seperti jawaban Anda menyarankan saya menggunakan keduanya -ssdan -tsebelumnya -idan itu berhasil, sebelumnya, saya hanya meletakkan -sssebelum -idan -tsesudahnya sehingga tidak berhasil.
Shayan
1

https://github.com/mifi/lossless-cut/pull/13

Ketika saya menjalankan ffmpeg dengan argumen dalam urutan ini -i ... -ss ... -t ..., itu menghasilkan file video yang tidak memiliki video selama beberapa detik awal. (Sejauh yang saya mengerti ini karena tidak mencari keyframe?)

Jika saya mengubah urutan ke -ss ... -i ... -t ..., maka video yang dipotong diputar dengan benar.

Saya ffmpeg -version

Gerard Wensink
sumber
Saya mencoba -sssebelumnya -itetapi tidak berfungsi pada file mp4 saya.
Shayan
Bekerja untuk saya, terima kasih. Hanya mengubah urutan parameter. ffmpeg versi 3.2.12-1 ~ deb9u1
shukshin.ivan
Sebenarnya, ini hanya memindahkan durasi kosong ke akhir video
Honghao Zhang