ffmpeg bahkan tidak memotong ini dan mp4 lain ke detik terdekat [duplikat]

0

Pertanyaan ini sudah ada jawabannya di sini:

Saya punya file

Lainnya - Analogue Clock-JEJqy1Wlovw.mp4 yang hanya merupakan unduhan dari https://www.youtube.com/watch?v=JEJqy1Wlovw

Panjangnya 2 menit 13 detik.

Saya memiliki beberapa masalah untuk memotongnya menjadi yang kedua.

Saya bisa menggunakan perintah ini

ffmpeg -ss 0 -i infile.mp4 -c copy -t 60 output.mp4

untuk membuat file yang 60 detik, jadi tidak ada masalah sejauh ini.

Itu file tepat 1 menit, tidak ada masalah sejauh ini.

C:\vids\a>dir
blahhclo.mp4   9,590,540 bytes

C:\vids\a>


C:\vids\a>mediainfo blahhclo.mp4
General
Complete name                            : blahhclo.mp4
Format                                   : MPEG-4
Format profile                           : Base Media
Codec ID                                 : isom
File size                                : 9.15 MiB
Duration                                 : 1mn 0s
Overall bit rate                         : 1 278 Kbps
Writing application                      : Lavf58.3.100

Video
ID                                       : 1
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Format profile                           : [email protected]
Format settings, CABAC                   : Yes
Format settings, ReFrames                : 3 frames
Codec ID                                 : avc1
Codec ID/Info                            : Advanced Video Coding
Duration                                 : 1mn 0s
Bit rate                                 : 1 146 Kbps
Width                                    : 1 920 pixels
Height                                   : 1 080 pixels
Display aspect ratio                     : 16:9
Frame rate mode                          : Constant
Frame rate                               : 25.000 fps
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Scan type                                : Progressive
Bits/(Pixel*Frame)                       : 0.022
Stream size                              : 8.21 MiB (90%)

Audio
ID                                       : 2
Format                                   : AAC
Format/Info                              : Advanced Audio Codec
Format profile                           : LC
Codec ID                                 : 40
Duration                                 : 1mn 0s
Bit rate mode                            : Constant
Bit rate                                 : 126 Kbps
Channel count                            : 2 channels
Channel positions                        : Front: L R
Sampling rate                            : 44.1 KHz
Compression mode                         : Lossy
Delay relative to video                  : 40ms
Stream size                              : 920 KiB (10%)



C:\vids\a>

Tapi saya punya masalah ketika saya mencoba untuk memotongnya di waktu berikut, dan apakah saya mencoba untuk memotong 1 menit satu atau seluruh 2 menit 13 detik satu.

Jika saya memotong dengan -ss 0 -t 1, itu menghasilkan file yang 1s 22ms.

Jadi itu tidak terlalu buruk yang cukup dekat dengan satu detik. 1,022 detik cukup baik untuk upaya memotong satu detik.

Jika saya memotong dengan -ss 0 -t 2, itu menghasilkan file 3s 19ms Itu mengerikan! itu artinya satu detik!

Jika saya memotong dengan -ss 0 -t 30 maka tidak masalah 30s 1ms.

Atau video ini misalnya, juga sebuah mp4 https://www.youtube.com/watch?v=pJ3-xf26wDE

C:\blah>ffmpeg -ss 189 -i vid.mp4 -c copy -t 6 someoutput.mp4

C:\blah>mediainfo someoutput.mp4

menghasilkan durasi 8s 383ms

Itu sangat salah, karena itu seharusnya 6 detik! Jadi itu dua detik terlalu lama!

C:\blah>ffmpeg -ss 191 -i vid.mp4 -c copy -t 6 someoutput2.mp4

C:\blah>mediainfo output2.mp4

menunjukkan bahwa ffmpeg menghasilkan durasi 10s 403ms

yang salah besar karena perintah ffmpeg ditentukan 6 detik!

Jadi itu bukan hanya satu detik, yaitu 4 detik!

Itu hampir 50% lebih lama dari yang seharusnya!

barlop
sumber

Jawaban:

0

Jika Anda membutuhkan akurasi bingkai, jangan gunakan -c copy, yang artinya sama dengan -c:a copy -c:v copy -c:s copy. Ini menyalin bitstream, dan jika waktu mulai atau berakhir tidak jatuh pada I-Frame , Anda mendapatkan yang terdekat, yang bisa sangat jauh dari lokasi yang diinginkan. Lihat juga wiki Mencari .

Namun Anda dapat menyandikan ulang video untuk mendapatkan pemotongan yang akurat. Audio dapat disalin, karena pada dasarnya, aliran audio memiliki "hanya bingkai kunci". Misalnya, untuk menyandikan video ke H.264 dan menyalin audio, terapkan perintah:

ffmpeg -ss 191 -i vid.mp4 -c:v libx264 -c:a copy -t 6 someoutput3.mp4 

Itu bekerja; itu menghasilkan file yang 6s 26ms. Jadi itu sangat ke detik terdekat dibandingkan dengan yang dengan salinan bitstream, itu 10,4 detik.

Pengkodean ulang dapat mengurangi kualitas aliran video Anda. Untuk mengubah kualitas video, baca lebih lanjut tentang hal itu dalam panduan pengodean H.264 .

Perintah ini:

ffmpeg -ss 193 -i vid.mp4 -c:v libx264 -c:a copy -t 4 someoutput4.mp4

Menghasilkan file 4s 26ms. Hampir 4s, sebagaimana mestinya, sedangkan jika saya melakukannya dengan menyalin bitstream itu akan lebih dari 5 detik.

barlop
sumber
Anda tidak perlu menyandikan ulang audio, Anda dapat menggunakannya copyuntuk itu.
Gyan
@Mulvya oke. dapatkah Anda menjelaskan mengapa?
barlop
Semua frame audio adalah keyframe, sehingga tidak ada ketidaktepatan dalam mencari. Hanya bingkai kunci video yang jarang.
Gyan
Saya mencoba untuk menyingkat poin dalam jawaban Anda untuk membuatnya lebih jelas.
slhck