Почему при мультиплексировании файла mp4 пропускается один из кадров, которые я ему предоставляю?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Почему при мультиплексировании файла mp4 пропускается один из кадров, которые я ему предоставляю?

Сообщение Anonymous »

Справочная информация
Раньше я создал и даже поделился примером создания файла MP4 из серии растровых изображений, здесь, на основе на здесь, а также я опубликовал код на Github, здесь.
Кажется, он отлично работает с одним изображением. , как таковой:

Код: Выделить всё

@WorkerThread
private fun testImage() {
Log.d("AppLog", "testImage")
val startTime = System.currentTimeMillis()
Log.d("AppLog", "start")
val videoFile = File(ContextCompat.getExternalFilesDirs(this, null)[0], "image.mp4")
if (videoFile.exists())
videoFile.delete()
videoFile.parentFile!!.mkdirs()
val timeLapseEncoder = TimeLapseEncoder()
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.test)
val width = bitmap.width
val height = bitmap.height
timeLapseEncoder.prepareForEncoding(videoFile.absolutePath, width, height)
val frameDurationInMs = 1000
timeLapseEncoder.encodeFrame(bitmap, frameDurationInMs)
timeLapseEncoder.finishEncoding()
val endTime = System.currentTimeMillis()
Log.d("AppLog", "it took ${endTime - startTime} ms to convert a single image ($width x $height) to mp4")
}
Проблема
Когда я пытаюсь работать с несколькими кадрами или даже с двумя кадрами, я вижу, что иногда некоторые кадры пропускаются, что приводит к видео также короче.
Например, в этом сценарии должно быть 2 кадра, каждый из которых занимает 5 секунд, но на выходе получается 5 секунд вместо 10 секунд, и он игнорирует весь второй кадр:

Код: Выделить всё

@WorkerThread
private fun testImages() {
Log.d("AppLog", "testImages")
val startTime = System.currentTimeMillis()
Log.d("AppLog", "start")
val videoFile = File(ContextCompat.getExternalFilesDirs(this, null)[0], "images.mp4")
if (videoFile.exists())
videoFile.delete()
videoFile.parentFile!!.mkdirs()
//        Log.d("AppLog", "success creating parent?${videoFile.parentFile.exists()}")
val timeLapseEncoder = TimeLapseEncoder()
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.frame1)
val width = bitmap.width
val height = bitmap.height
timeLapseEncoder.prepareForEncoding(videoFile.absolutePath, width, height)
val delay = 5000
timeLapseEncoder.encodeFrame(bitmap, delay)
val   bitmap2 = BitmapFactory.decodeResource(resources, R.drawable.frame2)
timeLapseEncoder.encodeFrame(bitmap2, delay)
timeLapseEncoder.finishEncoding()
val endTime = System.currentTimeMillis()
Log.d("AppLog", "it took ${endTime - startTime} ms to convert a single image ($width x $height) to ${videoFile.absolutePath} ${videoFile.exists()} ${videoFile.length()}")
}
Что я пробовал
Я пытался просмотреть код и выполнить отладку, но вроде все в порядке...Странно, что если я изменю продолжительность, а также добавлю больше кадров, все будет в порядке, например:
При первом запуске будет создано 12-секундное видео. 6 секунд — это одно изображение, а остальные 6 секунд — другое изображение.
Я также пытался добиться эквивалентности тому, что я сделал изначально, только в большем количестве кадров:

Код: Выделить всё

for (i in 0 until 500)
timeLapseEncoder.encodeFrame(bitmap, 10)
val bitmap2 = BitmapFactory.decodeResource(resources, R.drawable.frame2)
for (i in 0 until 500)
timeLapseEncoder.encodeFrame(bitmap2, 10)
Это вообще не создавало 5 секунд для каждого изображения...
Я думал, что, возможно, это какая-то проблема с fps, но он установлен в коде уже нормально, до 30, что вполне разумно и, вероятно, превышает минимум, разрешенный для формата MP4.
Вопросы
  • Что не так с тем, как я это использовал? Почему он пропускает кадры, в результате чего видео становится короче, чем я ожидал?
  • Возможно, есть ли лучший способ создания файлов MP4? из изображений, где вы задаете продолжительность каждого кадра подряд? Решение, которое не требует большой библиотеки и не имеет проблемной лицензии?


Подробнее здесь: https://stackoverflow.com/questions/785 ... vide-to-it
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Ошибка планирования воздушного потока: один день пропускается для обработки файла.
    Anonymous » » в форуме Python
    0 Ответы
    25 Просмотры
    Последнее сообщение Anonymous
  • OpenCV: FFMPEG: тег не поддерживается с идентификатором кодека 12 и форматом «mp4/MP4».
    Гость » » в форуме C++
    0 Ответы
    68 Просмотры
    Последнее сообщение Гость
  • OpenCV2 / Python: FFMPEG: тег не поддерживается с помощью ID 12 и формата MP4 / MP4
    Anonymous » » в форуме Python
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous
  • OpenCV2 / Python: FFMPEG: тег не поддерживается с помощью ID 12 и формата MP4 / MP4
    Anonymous » » в форуме Python
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Как получить количество кадров (mp4) в JAVA?
    Anonymous » » в форуме JAVA
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Android»