Возможность записи несжатого видео в файл FLV

Есть очень большая вероятность, что я иду по этому бессмысленному пути, поэтому я прошу прощения, если это пустая трата времени. Я пытался записать несжатое видео в файл FLV, и я не уверен, возможно ли это.

Согласно Википедии допустимым параметром кодирования видео является 0, что указывает на кодирование видео «RGB»: https://en.wikipedia.org/wiki/Flash_Video#Packets. Однако я не вижу упоминания об этой опции Codec ID в документации Adobe; ни «Спецификация формата видеофайла версии 10», ни «Спецификация формата видеофайла Adobe Flash версии 10.1».

Я исходил из предположения, что идентификатор кодека 0/RGB разрешен. Я жестко закодировал массив беззнаковых символов в C и использовал fwrite для записи следующих метаданных Double/Number в новый двоичный FLV-файл (который, по общему признанию, я предполагаю, что написал правильно):

  • продолжительность: 4 (секунды)
  • ширина: 16 (пикселей)
  • высота: 16 (пикселей)
  • скорость передачи видео: 6 (Кбит/с)
  • частота кадров: 1 (кадр/с)
  • видеокодецид: 0
  • Размер файла: 3323 (байт)

Затем я добавил 4 тега VIDEODATA, по 1 для каждого кадра RGB, который я надеялся записать. Их временные метки: 0, 1000, 2000 и 3000 (миллисекунд). Все четыре из них имеют 769-байтовую полезную нагрузку: первый байт, указывающий, что это ключевой кадр с идентификатором кодека 0, а остальные 768 должны представлять изображение 16x16x3 (RGB). Я написал 255/0xFF для всех значений в надежде увидеть маленький белый экран на 4 секунды.

Когда это не воспроизводилось правильно в VLC Media Player, как я и опасался, я попытался использовать цвета RGBA для каждого кадра. Я также изменил метаданные скорости видеоданных и размера файла на числовые значения 8 (кбит/с) и 4347 (байты) соответственно.

К сожалению, это также не воспроизводилось в VLC Media Player. Мне было интересно, знает ли кто-нибудь наверняка, возможно ли несжатое видео в файле FLV? Если да, то мне было любопытно, в каком формате должны быть видеоданные (RGB, RGBA, несколько тегов VIDEODATA, только один тег VIDEODATA и т. д.)?

Мой код C в основном состоит из одного гигантского массива беззнаковых символов, но если кто-то хочет его увидеть, я могу попробовать его добавить. Любые советы высоко ценится.

Спасибо,

Митчелл А


person Mitchell A    schedule 04.12.2018    source источник
comment
Это решено сейчас или все еще нужно решение для рабочего FLV с кодеком RGB?   -  person VC.One    schedule 27.12.2018
comment
Привет, извините, я забыл вернуться сюда и с тех пор изучал возможность записи несжатых файлов AVI. Я добился определенного успеха при использовании AVI, но лично я предпочитаю формат FLV. Вы случайно не знали, возможна ли запись несжатого RGB-видео в FLV?   -  person Mitchell A    schedule 18.01.2019
comment
Насколько мне известно, типы кодирования видео, перечисленные на странице Википедии, не взяты из официального источника. Я бы не рекомендовал полагаться на них. Почему вы предпочитаете FLV, а не более универсальный контейнер, например, Matroska?   -  person SirDarius    schedule 28.01.2019
comment
Привет, спасибо за совет. Я подозревал, что это может быть так, но хотел услышать второе или два мнения. Мой выбор в пользу FLV (а затем и AVI), скорее всего, не очень хорошо информирован — я видел, что он часто используется, и, похоже, он поддерживается видеопроигрывателями по умолчанию (такими как Windows Media Player). Я рассмотрю формат Matroska; спасибо за предложение! Что касается моего вопроса, я думаю, что на него ответили, поэтому я постараюсь закрыть его.   -  person Mitchell A    schedule 29.01.2019


Ответы (2)


Согласно SirDarius, «типы кодирования видео, перечисленные на странице Википедии, не взяты из официального источника. Я бы не рекомендовал полагаться на них». Это имеет смысл, учитывая, что в документации по формату FLV от самой Adobe не упоминается опция несжатого RGB для кодирования видео.

Я надеялся, что редакторы Википедии и другие люди знают о каком-то недокументированном пасхальном яйце в формате FLV, но теперь я убежден, что это не так.

person Mitchell A    schedule 29.01.2019

"...В документации по формату FLV от самой Adobe не упоминается вариант несжатого
RGB для кодирования видео."

Для RGB (необработанные растровые данные) необходимо использовать кодекScreen 1 (id=3).

Как ни странно, он скрыт в Документация по формату SWF (не документация по формату FLV).
См. главу 14 (стр. 204), которая является разделом "Видео"...

  • Вы хотите, чтобы конкретно страница 208 для кодека Screen Video была объяснена.

  • Проверьте этот пример кода (AS3) кодирования RGB в видео с экрана.

Примените логику, особенно функцию videoData(), которую можно настроить для чтения единиц пикселей (через некоторый вызов типа getPixel) или просто для чтения из Array.

Пример:

for (var x2:int = 0; x2 < xLimit; x2++) 
{
    var px:int = (x1 * blockWidth) + x2;
    var py:int = frameHeight - ((y1 * blockHeight) + y2); // (flv's save image from bottom to top)

    var p:uint = YOUR_INPUT_BITMAP.getPixel(px, py); // sample a pixel's RGB (3-bytes unsigned int) 

    //# IF reading from Pixel's uint value
    block.writeByte( p & 0xff );        // blue 
    block.writeByte( p >> 8 & 0xff );   // green
    block.writeByte( p >> 16 );         // red

    //# ELSE IF reading from Array of R-G-B values(FLV writes in BGR format)
    block.writeByte( myRGB_Array[x+2] );        // blue 
    block.writeByte( myRGB_Array[x+1] );    // green
    block.writeByte( myRGB_Array[x] );  // red

}
person VC.One    schedule 04.02.2019