packages feed

ffmpeg-light-0.14.0: demo/Transcode.hs

module Main where

import System.Environment (getArgs)
import qualified Codec.FFmpeg as FF
import qualified Codec.FFmpeg.Encode as FF
import Codec.Picture

type Frame = Image PixelRGB8

usage :: String
usage =
  unlines [ "Usage: transcode inputFile outputFile [outputFormat] [outputWidth] [outputHeight]"
          , "  Example: transcode rtmp://localhost/app/one rtmp://localhost/app/two flv 640 480"
          , ""
          , "  Copies the content from inputFile to outputFile using H264."
          , "  Defaults:"
          , "  outputFormat=flv"
          , "  outputWidth=640"
          , "  outputHeight=480"
          ]

main :: IO ()
main = do
  args <- getArgs
  FF.initFFmpeg
  FF.setLogLevel FF.avLogDebug
  case args of
    [from, to] -> copy from to "flv" 640 480
    [from, to, format, w, h] -> copy from to format (read w) (read h)
    _ -> error usage

copy :: FilePath -> FilePath -> String -> Int -> Int -> IO ()
copy from to format w h = do
  let ep = (FF.defaultH264 (fromIntegral w) (fromIntegral h))
            -- { FF.epFormatName = Just format }
            -- TODO: get this working again
  (getFrame, cleanup) <- FF.imageReader (FF.File from)
  putFrame <- FF.imageWriter ep to
  loop getFrame cleanup putFrame (\x -> return x)

loop :: IO (Maybe Frame)
     -> IO cleanup
     -> (Maybe Frame -> IO ())
     -> (Frame -> IO Frame)
     -> IO cleanup
loop getFrame finishReading putFrame editFrame = do
  maybeFrame <- getFrame
  case maybeFrame of
    Nothing -> do
      putFrame Nothing
      finishReading
    Just x -> do
      x' <- editFrame x
      putFrame (Just x')
      loop getFrame finishReading putFrame editFrame