私はfsmpeg-light、JuicyPixelsとglossを使って、Haskellでビデオを表示しています。私は自動的に再生しているビデオのメタデータを見つけたいと思いますが、まだその方法を見つけていません。haskellでffmpeg-lightを使ってmp4メタデータを見つける方法は?
ビデオの解像度やフレームレートなどのメタデータにアクセスしたいと思います。
私を助けることができますか?
EDIT:
私はあなたのソリューション@CRDrostを試してみましたが、ビデオは現在、2倍、通常の速度で再生されています。私は関数imageReaderTimeが間違ったタイムスタンプを与えていると仮定します。
EDIT 2:
異常な再生速度は、ffmpegの光ライブラリのバグです。私はissueをgithubリポジトリにオープンしました。
私の更新されたコード:
import Graphics.Gloss
import Codec.FFmpeg
import Codec.FFmpeg.Juicy
import Codec.Picture
import Control.Applicative
import Data.Maybe
import Graphics.Gloss.Juicy
import Control.Monad
-- import System.IO.Unsafe (unsafePerformIO)-- for debugging purposes
resolution :: (Int,Int)
resolution = (640, 360)
frameCount :: Int
frameCount = 100
main :: IO()
main = do
initFFmpeg
(getFrame, cleanup) <- imageReaderTime "big_buck_bunny.mp4"
frames <- replicateM frameCount $ nextFrame getFrame
cleanup
animate (InWindow "Nice Window" resolution (10,10)) white (frameAt frames)
nextFrame :: IO (Maybe (Image PixelRGB8, Double)) -> IO (Picture, Float)
nextFrame getFrame = mapSnd realToFrac . mapFst fromImageRGB8 . fromJust <$> getFrame
frameAt :: [(Picture, Float)] -> Float -> Picture
frameAt list time = fst . head . dropWhile ((< time) . snd) $ list
mapFst :: (a -> c) -> (a, b) -> (c, b)
mapFst f (a, b) = (f a, b) -- applies f to first element of a 2-tuple
mapSnd :: (b -> c) -> (a, b) -> (a, c)
mapSnd f (a, b) = (a, f b) -- applies f to the second element of a 2-tuple