FFMpeg конвертувати зображення JPEG у відео


4

Я намагаюся сфотографувати набір зображень, зроблених з інтервалом у 1 секунду, щоб сформувати відео із затримкою. Я подумав, що це буде легко за допомогою ffmpeg, але я стикаюся з криптовалютними помилками.

Усі зображення - yuv420 jpegs, зняті з андроїд-камери. Вони зберігаються як окремі jpegs у папці, всі вони мають однаковий розмір та відформатовані. Вони названі як послідовність 7-значних імен, починаючи з нуля (так "0000000.jpg" до "0001000.jpg", як приклад).

Це мій рядок (імена папок, відредаговані для наочності):

avconv -r 1 -f image2 -i %07d.jpg -vcodec libx264 -crf 18 -preset slower video.mp4

Здається чудово, я бачу безліч дописів від людей, які кажуть, що працює на них.

Однак ffmpeg дає мені це (жирний шрифт вказує на помилку)

ffmpeg версія 0.8.5-6: 0.8.5-1, Copyright (c) 2000-2012 розробники Libav
  побудований 13 січня 2013 12:05:48 з gcc 4.7.2
*** ЦЕ ПРОГРАМА ЗАВЕРШЕНО ***
Ця програма передбачена лише для сумісності і буде видалена в майбутньому випуску. Будь ласка, використовуйте замість avconv.
[mjpeg @ 0x233aea0] перечитав 8
Введення № 0, image2, з '% 07d.jpg':
  Тривалість: 00: 00: 00.04, початок: 0,000000, бітрейт: N / A
    Потік № 0,0: Відео: mjpeg, yuvj420p, 640x480 [PAR 1: 1 DAR 4: 3], 25 tbr, 25 tbn, 25 tbc
Файл "video.mp4" вже існує. Перезаписати? [у / н] у
[буфер @ 0x233b340] ш: 640 год: 480 pixfmt: yuvj420p
[libx264 @ 0x2339fa0], використовуючи SAR = 1/1
[libx264 @ 0x2339fa0] з використанням можливостей процесора: MMX2 SSE2Fast FastShuffle SSEMislign LZCNT
[libx264 @ 0x2339fa0] профіль Головний, рівень 3.1
[libx264 @ 0x2339fa0] 264 - ядро ​​123 r2189 35cf912 - H.264 / MPEG-4 AVC кодек - Copyleft 2003-2012 - http://www.videolan.org/x264.html - параметри: cabac = 1 ref = 8 deblock = 1: 0: 0 проаналізувати = 0x1: 0x131 мені = umh subme = 9 psi = 1 psy_rd = 1,00: 0,00 змішаний_реф = 0 ме_ранж = 16 chroma_me = 1 треліс = 2 8x8dct = 0 cqm = 0 deadzone = 21,11 fast_pskip = 1 chroma_qp_offset = -2 нитки = 1 sliced_threads = 0 nr = 0 decimate = 1 переплетення = 0 bluray_compat = 0 constrained_intra = 0 bframes = 3 b_pyramid = 0 b_adapt = 2 b_bias = 0 direct = 3 weightb = 0 open_gop = 1 weightp = 2 keyint = 250 keyint_min = 25 scenecut = 40 intra_refresh = 0 rc_lookahead = 60 rc = crf mbtree = 1 crf = 18,0 qcomp = 0,60 qpmin = 0 qpmax = 69 qpstep = 4 ip_ratio = 1,25 aq = 1: 1,00
Вихід №0, mp4, до "video.mp4":
  Метадані:
    кодер: Lavf53.21.1
    Потік № 0,0: Відео: libx264, yuvj420p, 640x480 [PAR 1: 1 DAR 4: 3], q = -1--1, 25 tbn, 25 tbc
Потокове відображення:
  Потік № 0,0 -> # 0,0
Натисніть ctrl-c, щоб зупинити кодування
[mjpeg @ 0x233aea0] перечитав 8
кадр = 0 кадрів в секунду = 0 q = 0,0 Lsize = 0kB час = 10000000000.00 бітрейт = 0,0kbit / s    
відео: аудіо 0kB: загальні заголовки 0kB: 0kB муксинг накладних 610,000000%

Рядки імпорту (які відображаються червоним кольором) - це ті, що кажуть " [mjpeg @ 0x233aea0] перечитати 8 ".

Це змушує мене думати, що, можливо, він намагається читати зображення як рух jpegs замість простих файлів jpeg, і якимось чином не вдається. Я намагався з / без "-f image2", з тим же результатом. І я також намагався використовувати avconv, з тим же результатом.

Я мушу зазначити, що зображення є дійсними, і якщо я конвертую їх усі в * .png (дорогий і трудомісткий процес), вся справа працює. Але я вважаю за краще просто мати можливість використовувати jpegs без проміжного перетворення. Зрештою, саме для цього є ffmpeg, перекодування.

Хтось має хороший спосіб перетворити * .jpg у відео за допомогою ffmpeg?


Перш за все дякую за розміщення повного результату. Насправді ви не використовуєте FFmpeg - ви використовуєте "покалічену" та застарілу версію, викликану ffmpegвід Libav (вилка FFmpeg), що постачається з Ubuntu. Замість цього скористайтеся нещодавньою статичною збіркою зі сторінки завантажень або складіть її самостійно , а потім спробуйте ще раз. Можливо, це була б помилка, яку довго виправляли. Зауважте, що MJPEG чудово підходить як декодер.
slhck

До речі: Помилка "перечитування" пов'язана з тим, що декодер MJPEG знаходив занадто багато бітів після зчитування блоку зображення за блоком. Можливо також, що зображення неправильно відформатовані. Чи можете ви спробувати повторно зберегти файли JPG, наприклад, з ImageMagick convert <input> <output>?
slhck

Дякую за пораду про libav vs ffmpeg! Я запускав дозвільний сервер із того самого поля і завжди мав дивні проблеми з належним перекодуванням деяких файлів. Після очищення avconv / libav / ffmpeg та перевстановлення офіційної версії все, що вже немає. Однак помилка все ж залишається. Чи можливо, що зображення форматовані неправильно, якщо вони добре відображаються за допомогою браузерів / редакторів зображень? Я встановлюю Imagemagick, коли ми говоримо, щоб протестувати далі
Knetic

Зважаючи на те, що у мене ніколи не виникало таких проблем, я можу лише уявити, що саме образи є винуватцями. Якщо ви хочете, ви можете надіслати нам посилання на одне чи два зображення для тестування (без змін, тобто завантажених в архів)?
slhck

Це було все! Після того, як змайструвати jpegs та отримати належну ffmpeg, кадри перекодуються у відео так, як вони мають бути. Я думаю, ви, мабуть, мали рацію щодо того, що зображення дивно кодуються, тому що в правій нижній частині кожного зображення є невелика сіра смуга, яка, на мою думку, повинна бути залишена від некоректного кодування. Якщо вам подобається, ви можете опублікувати те, що ви сказали на відповідь, і я прийму це.
Кнетик

Відповіді:


6

[mjpeg @ 0x233aea0] overread 8- це помилка, яку видають під час ffmpegспроби зчитування зображення JPEG (або кадру з потоку MJPEG) по блоку, але все ще є біти, що залишилися.

У цьому випадку, навіть якщо ваші зображення можуть відображатися чудово в інших глядачів, FFmpeg не може (або не буде) впоратися. Щоб виправити це, вам потрібно знову зберегти зображення, як у форматі PNG, як ви намагалися раніше, так і у форматі JPEG. Ви можете зробити такий тип пакетного перетворення за допомогою ImageMagick , наприклад:

for f in *.JPG; do mogrify "$f"; done

Це дозволить повторно зберегти файли JPEG під тим самим іменем. Зауважте, що ви втратите якість в цьому процесі, тому це не ідеально, і я б хотів із PNG, як проміжними продуктами, оскільки вони без втрат.

До речі: завжди корисно використовувати останню версію FFmpeg, яку можна завантажити як статичну збірку (просто завантажити, витягнути, використати) або скласти самостійно . Пакети, які постачаються з Ubuntu, завжди застаріли, і - залежно від версії Ubuntu - навіть не "справжній" FFmpeg, а вилка Libav (що чудово використовувати, але слід знати різницю ).

Не забувайте, що під час використання %07d.jpgсинтаксису зображення повинні мати послідовні імена ffmpegбез пропущених чисел. Для отримання додаткових варіантів див. Також документацію на image2мюксері.


1
Я вважаю, що ви також можете використовувати mogrify -format jpg *.JPGв якості альтернативи циклу for (але вони завжди корисні), а для інших, які можуть бути не знайомі mogrify(також див. -pathВаріант), ви заміните оригінальні файли на відміну від convert.
llogan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.