Как программно извлечь изображение предварительного просмотра - как первый кадр - из файла FLV в Java? - PullRequest
1 голос
/ 07 декабря 2009

Обновлен:

Поскольку мой первоначальный запрос кажется почти невозможным, каково следующее простейшее решение? Вызвать приложение swftools? Сделать JNI-вызов в библиотеку ffmpeg?

Оригинал:

Это относится к ", как программно извлекать флеш-кадры ", но я am ограничен только библиотеками Java (и никаких вызовов JNI в C, пожалуйста). Это также подразумевает отсутствие вызовов консольных приложений, таких как swftools . Я ищу решение для чистой Java (или, по крайней мере, JVM).

Ответы [ 3 ]

3 голосов
/ 09 декабря 2009

Это возможно ... , если вы можете принять конечный результат, представляющий собой FLV-файл в один кадр (а не правильное изображение, такое как PNG или JPEG.) Что такое однокадровое видео, на самом деле? Это изображение! Это вполне может дать вам функциональность, которую вы ищете, хотя это может показаться немного странным.

Что вам нужно сделать, это проанализировать FLV-файл. На самом деле это очень простой формат. Для начала ознакомьтесь с некоторыми основными условиями сжатия видео . Во-вторых, прочтите спецификацию FLV File Format на сайте Adobe.

Примерно, пример FLV-файла будет выглядеть так:

'FLV' header
Meta data 
Frame 0 - Audio
Frame 1 - Video I-Frame (all information to create a full image) 
Frame 2 - Video P-Frame (just differential from last frame)
Frame 3 - Video P-Frame (just differential from last frame)
Frame 1 - Video I-Frame (all information to create a full image) 
Frame 2 - Video P-Frame (just differential from last frame)
Frame 3 - Video P-Frame (just differential from last frame)
Frame 0 - Audio
Frame 5 
...
Frame n
EOF

Итак, вы будете искать нужный вам I-кадр видео в качестве картинки. Это вместе с базовым заголовком FLV-файла - все, что вам нужно. Наш вывод (будь то сокет или файл) будет просто:

'FLV' header
Frame 0 - Video I-Frame (all information to create a full image) 

Все это можно сделать на Java без каких-либо специальных инструментов. Я сделал это сам. Реально.

Обратите внимание, что этот подход применяется только к файлам FLV, а не к F4V (или другим форматам файлов на основе MP4.)

3 голосов
/ 12 декабря 2009

Или, если вы хотите сделать это напрямую из Java, вы можете использовать этот код . Он использует Xuggler , библиотеку с открытым исходным кодом для кодирования и декодирования видео из Java. Xuggler использует JNI за кулисами для FFmpeg, но при его использовании он совершенно невидим для вас. Хмель, который помогает.

Искусство

1 голос
/ 08 декабря 2009

Обратите внимание, что воспроизведение в SWF контролируется ActionScript и декларативными преобразованиями, поэтому для правильного просмотра этого «первого кадра» во всех случаях вам необходимо эмулировать весь проигрыватель. Я бы сказал - назовите внешние инструменты. В чем проблема с ними в любом случае? Это что-то, предписанное религией?

...