/
Main.hs
58 lines (54 loc) · 1.48 KB
/
Main.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
module Main
( main,
)
where
import Conduit
import Control.Monad
import Control.Monad.Logger
import Data.MediaBus
import Data.MediaBus.FdkAac.Conduit.Encoder (encodeLinearToAacC)
import Data.MediaBus.FdkAac.Encoder
( Aac,
AacAot (HighEfficiency),
AacEncoderInfo,
aacEncoderConfig,
)
import Data.Proxy (Proxy (Proxy))
import Data.Time (NominalDiffTime)
main :: IO ()
main = do
void (encodeSecondsOfSilence @Mono 10)
void (encodeSecondsOfSilence @Stereo 10)
encodeSecondsOfSilence ::
forall c.
( CanBeSample (Pcm c S16),
KnownChannelLayout c,
Show (Pcm c S16),
CanBeBlank (Pcm c S16)
) =>
NominalDiffTime ->
IO
[ Stream
SrcId32
SeqNum64
(Ticks64 (Hz 16000))
(AacEncoderInfo (Hz 16000) c 'HighEfficiency)
(Frames SeqNum64 (Ticks64 (Hz 16000)) (Audio (Hz 16000) c (Aac 'HighEfficiency)))
]
encodeSecondsOfSilence t =
runStdoutLoggingT $
runResourceT $
runConduit $
replicateM_ 5 (yieldNextFrame (MkFrame () () pcmAudioSeconds))
.| traceShowC 1 "pcm"
.| encodeLinearToAacC encoderConfig
.| setSequenceNumberAndTimestampC
.| traceShowC 1 "aac"
.| aggregateDurationC 2
.| setSequenceNumberAndTimestampC
.| traceShowSink 1 "aac-aggregated"
where
pcmAudioSeconds :: Audio (Hz 16000) c (Raw S16)
pcmAudioSeconds = blankFor t
encoderConfig =
aacEncoderConfig (Proxy :: Proxy (Audio (Hz 16000) c (Aac 'HighEfficiency)))