ffmpeg навіть не скорочує цей та інші mp4 до найближчої секунди [дублікат]


0

У мене є файл

Інше - Аналоговий годинник-JEJqy1Wlovw.mp4, який є лише завантаженням з https://www.youtube.com/watch?v=JEJqy1Wlovw

Це 2 хвилини 13 секунд.

У мене були деякі проблеми, вирішуючи це до другого.

Мені вдалося скористатися цією командою

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

щоб створити файл, який займав 60 секунд, тому поки що жодних проблем.

Це файл рівно за 1 хвилину, жодної проблеми поки немає.

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                           : High@L4.0
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>

Але в мене є проблема, коли я намагаюся вирізати її в наступний час, і це чи намагаюся я скоротити 1 хвилину або цілу 2 хв 13 сек.

Якщо я скорочую з -ss 0 -t 1, він створює файл розміром 1s 22ms.

Тож це не дуже погано, що досить близько однієї секунди. 1,022 секунди цілком непогані для спроби скоротити одну секунду.

Якщо я скорочу з -ss 0 -t 2, він створює файл, який становить 3s 19ms. Це жахливо! це означало бути однією секундою!

Якщо я виріжу з -ss 0 -t 30, то це добре, це робить 30s 1ms.

Або це відео, наприклад, також 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

виробляє тривалість 8s 383ms

Це так неправильно, хоча 'це повинно бути 6 секунд! Отже, це дві секунди занадто довго!

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

C:\blah>mediainfo output2.mp4

показує, що ffmpeg давав тривалість 10с 403мс

що божевільно неправильно ', оскільки команда ffmpeg вказала 6 секунд!

Так що це не одна секунда, тобто 4 секунди!

Це майже на 50% довше, ніж має бути!

Відповіді:


0

Якщо вам потрібна точність кадру, не використовуйте -c copy, що означає те саме, що -c:a copy -c:v copy -c:s copy. Він копіює бітовий потік, і якщо вказаний час початку або закінчення не потрапляє на I-кадр , ви отримуєте найближчий, який може бути досить далеко від потрібного місця. Дивіться також Вікі про пошуки .

Однак ви можете перекодувати відео для точного вирізання. Звук можна скопіювати, так як в основному аудіопотік має "лише ключові кадри". Наприклад, для кодування відео до H.264 та копіювання звуку застосуйте команду:

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

Це працює; він створює файл розміром 6s 26ms. Так що це дуже до найближчої секунди, на відміну від тієї, яка має бітову копію, це було 10,4 секунди.

Повторне кодування може знизити якість вашого потоку відео. Щоб змінити якість відео, прочитайте детальніше про нього у посібнику з кодування H.264 .

Ця команда:

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

Створює файл 4s 26ms. Близько 4-х, як це має бути, тоді як якби я це робив за допомогою бітового копіювання, це було б трохи більше 5 секунд.


Вам не потрібно перекодувати звук, ви можете використовувати copyдля цього.
Gyan

@Mulvya гаразд. ви можете пояснити, чому?
барлоп

Усі аудіокадри є ключовими кадрами, тому немає точності в пошуку. Лише ключові кадри відео можуть бути рідкими.
Gyan

Я намагався ущільнити пункти у вашій відповіді, щоб зробити їх більш зрозумілими.
slhck
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.