amagi_transcode 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +48 -0
- data/README.md +140 -0
- data/amagi_transcode.gemspec +26 -0
- data/bin/console +14 -0
- data/bin/mediainfo +0 -0
- data/lib/.DS_Store +0 -0
- data/lib/xmorph/.DS_Store +0 -0
- data/lib/xmorph/base.rb +261 -0
- data/lib/xmorph/customers/cbn/cbn/transcode.rb +51 -0
- data/lib/xmorph/customers/cinedigm/Cinedigm/transcode.rb +107 -0
- data/lib/xmorph/customers/curiosity/curiosity/transcode.rb +36 -0
- data/lib/xmorph/customers/dogtv/dogtv/transcode.rb +44 -0
- data/lib/xmorph/customers/gusto/gusto/transcode.rb +75 -0
- data/lib/xmorph/customers/hkitv/hkitv/transcode.rb +44 -0
- data/lib/xmorph/customers/hungama/Hungama/transcode.rb +36 -0
- data/lib/xmorph/customers/kalpnik/kalpnik/transcode.rb +40 -0
- data/lib/xmorph/customers/lightning/LIG/transcode.rb +36 -0
- data/lib/xmorph/customers/peopletv/peopletv/transcode.rb +36 -0
- data/lib/xmorph/customers/rewind/rewind/transcode.rb +50 -0
- data/lib/xmorph/customers/rooster-teeth/roosterteeth/transcode.rb +36 -0
- data/lib/xmorph/customers/sabatv/sabatv/transcode.rb +37 -0
- data/lib/xmorph/customers/scripps-cp/scpbu/transcode.rb +36 -0
- data/lib/xmorph/customers/shoutfactory/shoutfactory/transcode.rb +68 -0
- data/lib/xmorph/customers/tastemade/tastemade/transcode.rb +36 -0
- data/lib/xmorph/customers/tern-cp/TCP/transcode.rb +36 -0
- data/lib/xmorph/customers/turner-nordic/TurnerNordic/transcode.rb +117 -0
- data/lib/xmorph/customers/tyt/TYT/transcode.rb +52 -0
- data/lib/xmorph/customers/zsports/asn/transcode.rb +50 -0
- data/lib/xmorph/error.rb +3 -0
- data/lib/xmorph/util.rb +43 -0
- data/lib/xmorph/version.rb +3 -0
- data/lib/xmorph.rb +6 -0
- metadata +133 -0
@@ -0,0 +1,117 @@
|
|
1
|
+
class Transcode < XMorph::Base
|
2
|
+
|
3
|
+
PRO_4_3_STEREO = "4_3_STEREO"
|
4
|
+
PRO_4_3_MORE_CH_4 = "4_3_MORE_CH_4"
|
5
|
+
PRO_4_3_MORE_CH_8 = "4_3_MORE_CH_8"
|
6
|
+
PRO_4_3_2_TRACKS = "4_3_2_TRACKS"
|
7
|
+
PRO_4_3_4_TRACKS = "4_3_4_TRACKS"
|
8
|
+
PRO_4_3_6_TRACKS = "4_3_6_TRACKS"
|
9
|
+
PRO_4_3_8_TRACKS = "4_3_8_TRACKS"
|
10
|
+
|
11
|
+
PRO_16_9_STEREO = "16_9_STEREO"
|
12
|
+
PRO_16_9_MORE_CH_4 = "16_9_MORE_CH_4"
|
13
|
+
PRO_16_9_MORE_CH_8 = "16_9_MORE_CH_8"
|
14
|
+
PRO_16_9_2_TRACKS = "16_9_2_TRACKS"
|
15
|
+
PRO_16_9_4_TRACKS = "16_9_4_TRACKS"
|
16
|
+
PRO_16_9_6_TRACKS = "16_9_6_TRACKS"
|
17
|
+
PRO_16_9_8_TRACKS = "16_9_8_TRACKS"
|
18
|
+
|
19
|
+
PRO_1080_STEREO = "1080_STEREO"
|
20
|
+
PRO_1080_MORE_CH_4 = "1080_MORE_CH_4"
|
21
|
+
PRO_1080_MORE_CH_8 = "1080_MORE_CH_8"
|
22
|
+
PRO_1080_2_TRACKS = "1080_2_TRACKS"
|
23
|
+
PRO_1080_4_TRACKS = "1080_4_TRACKS"
|
24
|
+
PRO_1080_6_TRACKS = "1080_6_TRACKS"
|
25
|
+
PRO_1080_8_TRACKS = "1080_8_TRACKS"
|
26
|
+
|
27
|
+
|
28
|
+
def set_profiles
|
29
|
+
self.profiles = {
|
30
|
+
PRO_4_3_STEREO => "ffmpeg -y -i %{IN} -map 0:v -map 0:a -acodec libfdk_aac -profile:a aac_low -ac 2 -ar 48000 -ab 192k -vcodec libx264 -filter:v \"crop=720:576:0:32\" -pix_fmt yuv420p -flags +ilme+ildct -x264opts tff=1 -x264opts nal-hrd=cbr -g 13 -bf 2 -profile:v high -aspect 4:3 -b:v 12M -minrate:v 12M -maxrate:v 12M -muxrate 14M -bufsize:v 25M -pes_payload_size 16 -streamid 0:2064 -streamid 1:2068 -streamid 2:2069 -streamid 3:2070 -streamid 4:2071 -streamid 5:2072 -streamid 6:2073 -streamid 7:2074 -streamid 8:2075 %{OUT} 2>&1",
|
31
|
+
PRO_4_3_MORE_CH_4 => "ffmpeg -y -i %{IN} -map 0:v -filter_complex \"[0]pan=stereo|c0=c0|c1=c1[a];[0]pan=stereo|c0=c2|c1=c3[b]\" -map \"[a]\" -map \"[b]\" -acodec libfdk_aac -profile:a aac_low -ac 2 -ar 48000 -ab 192k -vcodec libx264 -filter:v \"crop=720:576:0:32\" -pix_fmt yuv420p -flags +ilme+ildct -x264opts tff=1 -x264opts nal-hrd=cbr -g 13 -aspect 4:3 -bf 2 -profile:v high -b:v 12M -minrate:v 12M -maxrate:v 12M -muxrate 14M -bufsize:v 25M -pes_payload_size 16 -streamid 0:2064 -streamid 1:2068 -streamid 2:2069 %{OUT} 2>&1",
|
32
|
+
PRO_4_3_MORE_CH_8 => "ffmpeg -y -i %{IN} -map 0:v -filter_complex \"[0]pan=stereo|c0=c0|c1=c1[a];[0]pan=stereo|c0=c2|c1=c3[b];[0]pan=stereo|c0=c4|c1=c5[c];[0]pan=stereo|c0=c6|c1=c7[d]\" -map \"[a]\" -map \"[b]\" -map \"[c]\" -map \"[d]\" -acodec libfdk_aac -profile:a aac_low -ac 2 -ar 48000 -ab 192k -vcodec libx264 -filter:v \"crop=720:576:0:32\" -pix_fmt yuv420p -flags +ilme+ildct -x264opts tff=1 -x264opts nal-hrd=cbr -g 13 -aspect 4:3 -bf 2 -profile:v high -b:v 12M -minrate:v 12M -maxrate:v 12M -muxrate 14M -bufsize:v 25M -pes_payload_size 16 -streamid 0:2064 -streamid 1:2068 -streamid 2:2069 -streamid 3:2070 -streamid 4:2071 -streamid 5:2072 -streamid 6:2073 -streamid 7:2074 -streamid 8:2075 %{OUT} 2>&1",
|
33
|
+
PRO_4_3_2_TRACKS => "ffmpeg -y -i %{IN} -map 0:v -filter_complex \"[0:a:0][0:a:1] amerge=inputs=2[audio1]\" -map [audio1] -acodec libfdk_aac -profile:a aac_low -ac 2 -ar 48000 -ab 192k -vcodec libx264 -filter:v \"crop=720:576:0:32\" -pix_fmt yuv420p -flags +ilme+ildct -x264opts tff=1 -x264opts nal-hrd=cbr -aspect 4:3 -g 13 -bf 2 -profile:v high -b:v 12M -minrate:v 12M -maxrate:v 12M -muxrate 14M -bufsize:v 25M -pes_payload_size 16 -streamid 0:2064 -streamid 1:2068 -streamid 2:2069 -streamid 3:2070 -streamid 4:2071 %{OUT} 2>&1",
|
34
|
+
PRO_4_3_4_TRACKS => "ffmpeg -y -i %{IN} -map 0:v -filter_complex \"[0:a:0][0:a:1] amerge=inputs=2[audio1]\" -map [audio1] -filter_complex \"[0:a:2][0:a:3] amerge=inputs=2[audio2]\" -map [audio2] -acodec libfdk_aac -profile:a aac_low -ac 2 -ar 48000 -ab 192k -vcodec libx264 -aspect 4:3 -filter:v \"crop=720:576:0:32\" -pix_fmt yuv420p -flags +ilme+ildct -x264opts tff=1 -x264opts nal-hrd=cbr -g 13 -bf 2 -profile:v high -b:v 12M -minrate:v 12M -maxrate:v 12M -muxrate 14M -bufsize:v 25M -pes_payload_size 16 -streamid 0:2064 -streamid 1:2068 -streamid 2:2069 -streamid 3:2070 -streamid 4:2071 %{OUT} 2>&1",
|
35
|
+
PRO_4_3_6_TRACKS => "ffmpeg -y -i %{IN} -map 0:v -filter_complex \"[0:a:0][0:a:1] amerge=inputs=2[audio1]\" -map [audio1] -filter_complex \"[0:a:2][0:a:3] amerge=inputs=2[audio2]\" -map [audio2] -filter_complex \"[0:a:4][0:a:5] amerge=inputs=2[audio3]\" -map [audio3] -acodec libfdk_aac -profile:a aac_low -ac 2 -ar 48000 -ab 192k -vcodec libx264 -filter:v \"crop=720:576:0:32\" -pix_fmt yuv420p -flags +ilme+ildct -x264opts tff=1 -x264opts nal-hrd=cbr -g 13 -aspect 4:3 -bf 2 -profile:v high -b:v 12M -minrate:v 12M -maxrate:v 12M -muxrate 14M -bufsize:v 25M -pes_payload_size 16 -streamid 0:2064 -streamid 1:2068 -streamid 2:2069 -streamid 3:2070 -streamid 4:2071 %{OUT} 2>&1",
|
36
|
+
PRO_4_3_8_TRACKS => "ffmpeg -y -i %{IN} -map 0:v -filter_complex \"[0:a:0][0:a:1] amerge=inputs=2[audio1]\" -map [audio1] -filter_complex \"[0:a:2][0:a:3] amerge=inputs=2[audio2]\" -map [audio2] -filter_complex \"[0:a:4][0:a:5] amerge=inputs=2[audio3]\" -map [audio3] -filter_complex \"[0:a:6][0:a:7] amerge=inputs=2[audio4]\" -map [audio4] -acodec libfdk_aac -profile:a aac_low -ac 2 -ar 48000 -ab 192k -vcodec libx264 -filter:v \"crop=720:576:0:32\" -pix_fmt yuv420p -flags +ilme+ildct -x264opts tff=1 -x264opts nal-hrd=cbr -g 13 -aspect 4:3 -bf 2 -profile:v high -b:v 12M -minrate:v 12M -maxrate:v 12M -muxrate 14M -bufsize:v 25M -pes_payload_size 16 -streamid 0:2064 -streamid 1:2068 -streamid 2:2069 -streamid 3:2070 -streamid 4:2071 %{OUT} 2>&1",
|
37
|
+
|
38
|
+
PRO_16_9_STEREO => "ffmpeg -y -i %{IN} -map 0:v -map 0:a -acodec libfdk_aac -profile:a aac_low -ac 2 -ar 48000 -ab 192k -vcodec libx264 -filter:v \"crop=720:576:0:32\" -pix_fmt yuv420p -flags +ilme+ildct -x264opts tff=1 -x264opts nal-hrd=cbr -g 13 -bf 2 -profile:v high -aspect 16:9 -b:v 12M -minrate:v 12M -maxrate:v 12M -muxrate 14M -bufsize:v 25M -pes_payload_size 16 -streamid 0:2064 -streamid 1:2068 -streamid 2:2069 -streamid 3:2070 -streamid 4:2071 -streamid 5:2072 -streamid 6:2073 -streamid 7:2074 -streamid 8:2075 %{OUT} 2>&1",
|
39
|
+
PRO_16_9_MORE_CH_4 => "ffmpeg -y -i %{IN} -map 0:v -filter_complex \"[0]pan=stereo|c0=c0|c1=c1[a];[0]pan=stereo|c0=c2|c1=c3[b]\" -map \"[a]\" -map \"[b]\" -acodec libfdk_aac -profile:a aac_low -ac 2 -ar 48000 -ab 192k -vcodec libx264 -filter:v \"crop=720:576:0:32\" -pix_fmt yuv420p -flags +ilme+ildct -x264opts tff=1 -x264opts nal-hrd=cbr -g 13 -aspect 16:9 -bf 2 -profile:v high -b:v 12M -minrate:v 12M -maxrate:v 12M -muxrate 14M -bufsize:v 25M -pes_payload_size 16 -streamid 0:2064 -streamid 1:2068 -streamid 2:2069 %{OUT} 2>&1",
|
40
|
+
PRO_16_9_MORE_CH_8 => "ffmpeg -y -i %{IN} -map 0:v -filter_complex \"[0]pan=stereo|c0=c0|c1=c1[a];[0]pan=stereo|c0=c2|c1=c3[b];[0]pan=stereo|c0=c4|c1=c5[c];[0]pan=stereo|c0=c6|c1=c7[d]\" -map \"[a]\" -map \"[b]\" -map \"[c]\" -map \"[d]\" -acodec libfdk_aac -profile:a aac_low -ac 2 -ar 48000 -ab 192k -vcodec libx264 -filter:v \"crop=720:576:0:32\" -pix_fmt yuv420p -flags +ilme+ildct -x264opts tff=1 -x264opts nal-hrd=cbr -g 13 -aspect 16:9 -bf 2 -profile:v high -b:v 12M -minrate:v 12M -maxrate:v 12M -muxrate 14M -bufsize:v 25M -pes_payload_size 16 -streamid 0:2064 -streamid 1:2068 -streamid 2:2069 -streamid 3:2070 -streamid 4:2071 -streamid 5:2072 -streamid 6:2073 -streamid 7:2074 -streamid 8:2075 %{OUT} 2>&1",
|
41
|
+
PRO_16_9_2_TRACKS => "ffmpeg -y -i %{IN} -map 0:v -filter_complex \"[0:a:0][0:a:1] amerge=inputs=2[audio1]\" -map [audio1] -acodec libfdk_aac -profile:a aac_low -ac 2 -ar 48000 -ab 192k -vcodec libx264 -filter:v \"crop=720:576:0:32\" -pix_fmt yuv420p -flags +ilme+ildct -x264opts tff=1 -x264opts nal-hrd=cbr -g 13 -aspect 16:9 -bf 2 -profile:v high -b:v 12M -minrate:v 12M -maxrate:v 12M -muxrate 14M -bufsize:v 25M -pes_payload_size 16 -streamid 0:2064 -streamid 1:2068 -streamid 2:2069 -streamid 3:2070 -streamid 4:2071 %{OUT} 2>&1",
|
42
|
+
PRO_16_9_4_TRACKS => "ffmpeg -y -i %{IN} -map 0:v -filter_complex \"[0:a:0][0:a:1] amerge=inputs=2[audio1]\" -map [audio1] -filter_complex \"[0:a:2][0:a:3] amerge=inputs=2[audio2]\" -map [audio2] -acodec libfdk_aac -profile:a aac_low -ac 2 -ar 48000 -ab 192k -vcodec libx264 -filter:v \"crop=720:576:0:32\" -pix_fmt yuv420p -flags +ilme+ildct -x264opts tff=1 -x264opts nal-hrd=cbr -g 13 -aspect 16:9 -bf 2 -profile:v high -b:v 12M -minrate:v 12M -maxrate:v 12M -muxrate 14M -bufsize:v 25M -pes_payload_size 16 -streamid 0:2064 -streamid 1:2068 -streamid 2:2069 -streamid 3:2070 -streamid 4:2071 %{OUT} 2>&1",
|
43
|
+
PRO_16_9_6_TRACKS => "ffmpeg -y -i %{IN} -map 0:v -filter_complex \"[0:a:0][0:a:1] amerge=inputs=2[audio1]\" -map [audio1] -filter_complex \"[0:a:2][0:a:3] amerge=inputs=2[audio2]\" -map [audio2] -filter_complex \"[0:a:4][0:a:5] amerge=inputs=2[audio3]\" -map [audio3] -acodec libfdk_aac -profile:a aac_low -ac 2 -ar 48000 -ab 192k -vcodec libx264 -filter:v \"crop=720:576:0:32\" -pix_fmt yuv420p -flags +ilme+ildct -x264opts tff=1 -x264opts nal-hrd=cbr -g 13 -aspect 16:9 -bf 2 -profile:v high -b:v 12M -minrate:v 12M -maxrate:v 12M -muxrate 14M -bufsize:v 25M -pes_payload_size 16 -streamid 0:2064 -streamid 1:2068 -streamid 2:2069 -streamid 3:2070 -streamid 4:2071 %{OUT} 2>&1",
|
44
|
+
PRO_16_9_8_TRACKS => "ffmpeg -y -i %{IN} -map 0:v -filter_complex \"[0:a:0][0:a:1] amerge=inputs=2[audio1]\" -map [audio1] -filter_complex \"[0:a:2][0:a:3] amerge=inputs=2[audio2]\" -map [audio2] -filter_complex \"[0:a:4][0:a:5] amerge=inputs=2[audio3]\" -map [audio3] -filter_complex \"[0:a:6][0:a:7] amerge=inputs=2[audio4]\" -map [audio4] -acodec libfdk_aac -profile:a aac_low -ac 2 -ar 48000 -ab 192k -vcodec libx264 -filter:v \"crop=720:576:0:32\" -pix_fmt yuv420p -flags +ilme+ildct -x264opts tff=1 -x264opts nal-hrd=cbr -g 13 -aspect 16:9 -bf 2 -profile:v high -b:v 12M -minrate:v 12M -maxrate:v 12M -muxrate 14M -bufsize:v 25M -pes_payload_size 16 -streamid 0:2064 -streamid 1:2068 -streamid 2:2069 -streamid 3:2070 -streamid 4:2071 %{OUT} 2>&1",
|
45
|
+
|
46
|
+
PRO_1080_STEREO => "ffmpeg -y -i %{IN} -map 0:v -map 0:a -acodec libfdk_aac -profile:a aac_low -ac 2 -ar 48000 -ab 192k -vcodec libx264 -pix_fmt yuv420p -flags +ilme+ildct -x264opts tff=1 -x264opts nal-hrd=cbr -g 13 -aspect 16:9 -bf 2 -profile:v high -b:v 12M -minrate:v 12M -maxrate:v 12M -muxrate 14M -bufsize:v 25M -pes_payload_size 16 -streamid 0:2064 -streamid 1:2068 -streamid 2:2069 -streamid 3:2070 -streamid 4:2071 %{OUT} 2>&1",
|
47
|
+
PRO_1080_MORE_CH_4 => "ffmpeg -y -i %{IN} -map 0:v -filter_complex \"[0]pan=stereo|c0=c0|c1=c1[a];[0]pan=stereo|c0=c2|c1=c3[b]\" -map \"[a]\" -map \"[b]\" -acodec libfdk_aac -profile:a aac_low -ac 2 -ar 48000 -ab 192k -vcodec libx264 -pix_fmt yuv420p -flags +ilme+ildct -x264opts tff=1 -x264opts nal-hrd=cbr -g 13 -aspect 16:9 -bf 2 -profile:v high -b:v 12M -minrate:v 12M -maxrate:v 12M -muxrate 14M -bufsize:v 25M -pes_payload_size 16 -streamid 0:2064 -streamid 1:2068 -streamid 2:2069 %{OUT} 2>&1",
|
48
|
+
PRO_1080_MORE_CH_8 => "ffmpeg -y -i %{IN} -map 0:v -filter_complex \"[0]pan=stereo|c0=c0|c1=c1[a];[0]pan=stereo|c0=c2|c1=c3[b];[0]pan=stereo|c0=c4|c1=c5[c];[0]pan=stereo|c0=c6|c1=c7[d]\" -map \"[a]\" -map \"[b]\" -map \"[c]\" -map \"[d]\" -acodec libfdk_aac -profile:a aac_low -ac 2 -ar 48000 -ab 192k -vcodec libx264 -pix_fmt yuv420p -flags +ilme+ildct -x264opts tff=1 -x264opts nal-hrd=cbr -g 13 -aspect 16:9 -bf 2 -profile:v high -b:v 12M -minrate:v 12M -maxrate:v 12M -muxrate 14M -bufsize:v 25M -pes_payload_size 16 -streamid 0:2064 -streamid 1:2068 -streamid 2:2069 -streamid 3:2070 -streamid 4:2071 -streamid 5:2072 -streamid 6:2073 -streamid 7:2074 -streamid 8:2075 %{OUT} 2>&1",
|
49
|
+
PRO_1080_2_TRACKS => "ffmpeg -y -i %{IN} -map 0:v -filter_complex \"[0:a:0][0:a:1] amerge=inputs=2[audio1]\" -map [audio1] -acodec libfdk_aac -profile:a aac_low -ac 2 -ar 48000 -ab 192k -vcodec libx264 -pix_fmt yuv420p -flags +ilme+ildct -x264opts tff=1 -x264opts nal-hrd=cbr -g 13 -aspect 16:9 -bf 2 -profile:v high -b:v 12M -minrate:v 12M -maxrate:v 12M -muxrate 14M -bufsize:v 25M -pes_payload_size 16 -streamid 0:2064 -streamid 1:2068 -streamid 2:2069 -streamid 3:2070 -streamid 4:2071 %{OUT} 2>&1",
|
50
|
+
PRO_1080_4_TRACKS => "ffmpeg -y -i %{IN} -map 0:v -filter_complex \"[0:a:0][0:a:1] amerge=inputs=2[audio1]\" -map [audio1] -filter_complex \"[0:a:2][0:a:3] amerge=inputs=2[audio2]\" -map [audio2] -acodec libfdk_aac -profile:a aac_low -ac 2 -ar 48000 -ab 192k -vcodec libx264 -pix_fmt yuv420p -flags +ilme+ildct -x264opts tff=1 -x264opts nal-hrd=cbr -g 13 -aspect 16:9 -bf 2 -profile:v high -b:v 12M -minrate:v 12M -maxrate:v 12M -muxrate 14M -bufsize:v 25M -pes_payload_size 16 -streamid 0:2064 -streamid 1:2068 -streamid 2:2069 -streamid 3:2070 -streamid 4:2071 %{OUT} 2>&1",
|
51
|
+
PRO_1080_6_TRACKS => "ffmpeg -y -i %{IN} -map 0:v -filter_complex \"[0:a:0][0:a:1] amerge=inputs=2[audio1]\" -map [audio1] -filter_complex \"[0:a:2][0:a:3] amerge=inputs=2[audio2]\" -map [audio2] -filter_complex \"[0:a:4][0:a:5] amerge=inputs=2[audio3]\" -map [audio3] -acodec libfdk_aac -profile:a aac_low -ac 2 -ar 48000 -ab 192k -vcodec libx264 -pix_fmt yuv420p -flags +ilme+ildct -x264opts tff=1 -x264opts nal-hrd=cbr -g 13 -aspect 16:9 -bf 2 -profile:v high -b:v 12M -minrate:v 12M -maxrate:v 12M -muxrate 14M -bufsize:v 25M -pes_payload_size 16 -streamid 0:2064 -streamid 1:2068 -streamid 2:2069 -streamid 3:2070 -streamid 4:2071 %{OUT} 2>&1",
|
52
|
+
PRO_1080_8_TRACKS => "ffmpeg -y -i %{IN} -map 0:v -filter_complex \"[0:a:0][0:a:1] amerge=inputs=2[audio1]\" -map [audio1] -filter_complex \"[0:a:2][0:a:3] amerge=inputs=2[audio2]\" -map [audio2] -filter_complex \"[0:a:4][0:a:5] amerge=inputs=2[audio3]\" -map [audio3] -filter_complex \"[0:a:6][0:a:7] amerge=inputs=2[audio4]\" -map [audio4] -acodec libfdk_aac -profile:a aac_low -ac 2 -ar 48000 -ab 192k -vcodec libx264 -pix_fmt yuv420p -flags +ilme+ildct -x264opts tff=1 -x264opts nal-hrd=cbr -g 13 -aspect 16:9 -bf 2 -profile:v high -b:v 12M -minrate:v 12M -maxrate:v 12M -muxrate 14M -bufsize:v 25M -pes_payload_size 16 -streamid 0:2064 -streamid 1:2068 -streamid 2:2069 -streamid 3:2070 -streamid 4:2071 %{OUT} 2>&1",
|
53
|
+
}
|
54
|
+
end
|
55
|
+
|
56
|
+
def video_checks
|
57
|
+
{
|
58
|
+
ALLOWED_ASPECT_RATIO => ["16:9", "4:3"],
|
59
|
+
ALLOWED_HEIGHT => [576, 608, 1080],
|
60
|
+
ALLOWED_WIDTH => [720, 1920],
|
61
|
+
ALLOWED_FRAME_RATE => IGNORE,
|
62
|
+
ALLOWED_VIDEO_BIT_RATE => IGNORE, #Mbps
|
63
|
+
ALLOWED_SCAN_TYPE => IGNORE, #all downcased
|
64
|
+
}
|
65
|
+
end
|
66
|
+
|
67
|
+
def audio_checks
|
68
|
+
{
|
69
|
+
PRESENCE_OF_AUDIO_TRACK => VALIDATE,
|
70
|
+
ALLOWED_NUMBER_OF_AUDIO_TRACKS => [1, 2, 3, 4, 5, 8],
|
71
|
+
ALLOWED_AUDIO_CODECS => ["aac", "pcm", "dolby e"],
|
72
|
+
ALLOWED_AUDIO_BIT_RATE => IGNORE,
|
73
|
+
ALLOWED_NUMBER_OF_AUDIO_CHANNELS => [1, 2, 4, 6, 8],
|
74
|
+
}
|
75
|
+
end
|
76
|
+
|
77
|
+
#profiles are classified based on aspect ratio, height and number of audio channels
|
78
|
+
#1. height is 1080 and audio tracks could be (1 track with stereo), (2, 4, 6, 8 tracks and all mono), (1 track with 4, 8 channels)
|
79
|
+
#2. line 1 applies with aspect ration as 4:3 and 16:9
|
80
|
+
def set_profile_name
|
81
|
+
self.profile_name = nil
|
82
|
+
mediainfo = self.mediainfo_output
|
83
|
+
video_info = mediainfo["Video"]
|
84
|
+
aspect_ratio = video_info["Display_aspect_ratio"]
|
85
|
+
height = (video_info["Original_height"] || video_info["Height"]).split("pixels")[0].gsub(/ /,"")
|
86
|
+
|
87
|
+
height = aspect_ratio.gsub(":","_") if height != "1080"
|
88
|
+
|
89
|
+
stereo = false
|
90
|
+
audio_tracks = mediainfo["Audio"]
|
91
|
+
audio_tracks.each do |audio|
|
92
|
+
stereo = true if audio["Channel_s_"] =~ /2/
|
93
|
+
end
|
94
|
+
more_than_two_chans = audio_tracks.size == 1 && (audio_tracks[0]["Channel_s__Original"]||audio_tracks[0]["Channel_s_"]).match(/(4|8)/)
|
95
|
+
ret = stereo ? height + "_stereo" : height + "_" + audio_tracks.size.to_s + "_tracks"
|
96
|
+
profile_name = more_than_two_chans ? height + "_more_ch_" + (audio_tracks[0]["Channel_s__Original"]||audio_tracks[0]["Channel_s_"]).match(/(4|8)/).to_s : ret
|
97
|
+
|
98
|
+
self.profile_name = self.class.const_get(("pro_" + profile_name).upcase) rescue nil
|
99
|
+
unless self.profiles.keys.include? self.profile_name
|
100
|
+
errors = []
|
101
|
+
channels = []
|
102
|
+
audio_tracks.each {|info| channels << (info["Channel_s__Original"] || info["Channel_s_"]).split("channels")[0].strip}
|
103
|
+
if audio_tracks.size == 1 and !((channels-["2","4","8"]).empty?)
|
104
|
+
errors << "Number of channels allowed if there's only 1 audio track is 2,4,8. But media has #{channels.join} channels"
|
105
|
+
end
|
106
|
+
if audio_tracks.size != 1 and !([2,4,6,8].include? audio_tracks.size) and !stereo
|
107
|
+
#todo think of better error msg
|
108
|
+
errors << "If the number of audio tracks is odd. One of the track must be stereo"
|
109
|
+
end
|
110
|
+
self.error = errors.join(" ; ") unless errors.empty?
|
111
|
+
return false
|
112
|
+
end
|
113
|
+
XMorph::Base.logger.debug("XMorph#set_profile_name#TurnerNordic: using profile #{self.profile_name}") unless self.profile_name.nil?
|
114
|
+
return true
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
class Transcode < XMorph::Base
|
2
|
+
CINEDIGM_CONTENT = "cinedigm_content"
|
3
|
+
DEFAULT = "default"
|
4
|
+
def set_profiles
|
5
|
+
self.profiles = {
|
6
|
+
CINEDIGM_CONTENT => "ffmpeg -y -i %{IN} -map 0:v:0 -map 0:a:0 -acodec libfdk_aac -profile:a aac_low -ac 2 -ar 48000 -ab 192k -vcodec libx264 -vf 'fps=fps=29.97,scale=1920:1080' -pix_fmt yuv420p -g 13 -bf 2 -profile:v high -vb 30000k -minrate:v 30000k -maxrate:v 30000k -bufsize:v 60000k -muxrate 31000k -x264opts nal-hrd=cbr -pes_payload_size 16 -streamid 0:2064 -streamid 1:2068 %{OUT} 2>&1",
|
7
|
+
DEFAULT => "ffmpeg -y -i %{IN} -vcodec copy -vbsf h264_mp4toannexb -acodec copy -map 0:v -streamid 0:2064 -map 0:a -streamid 1:2068 -metadata:s:a:0 language=ENG %{OUT} 2>&1",
|
8
|
+
}
|
9
|
+
end
|
10
|
+
|
11
|
+
def video_checks
|
12
|
+
{
|
13
|
+
ALLOWED_ASPECT_RATIO => ["16:9"],
|
14
|
+
ALLOWED_HEIGHT => [1080],
|
15
|
+
ALLOWED_WIDTH => [1920],
|
16
|
+
ALLOWED_FRAME_RATE => IGNORE,
|
17
|
+
ALLOWED_VIDEO_BIT_RATE => IGNORE, #Mbps
|
18
|
+
ALLOWED_SCAN_TYPE => IGNORE, #all downcased
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
def audio_checks
|
23
|
+
{
|
24
|
+
PRESENCE_OF_AUDIO_TRACK => VALIDATE,
|
25
|
+
ALLOWED_NUMBER_OF_AUDIO_TRACKS => [1],
|
26
|
+
ALLOWED_AUDIO_CODECS => ["aac", "mpeg audio"],
|
27
|
+
ALLOWED_AUDIO_BIT_RATE => IGNORE,
|
28
|
+
ALLOWED_NUMBER_OF_AUDIO_CHANNELS => [2],
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
#profiles are classified based on fps and bit rate.
|
33
|
+
def set_profile_name
|
34
|
+
self.profile_name = nil
|
35
|
+
self.error = nil
|
36
|
+
mediainfo = self.mediainfo_output
|
37
|
+
video_info = mediainfo["Video"]
|
38
|
+
fps = video_info["Frame_rate"]
|
39
|
+
bit_rate = video_info["Bit_rate"] || video_info["Nominal_bit_rate"]
|
40
|
+
|
41
|
+
fps = video_info["Frame_rate"].match("29.97")
|
42
|
+
bit_rate = bit_rate.split(" ")[0].to_f
|
43
|
+
if !fps || bit_rate < 30;
|
44
|
+
self.profile_name = CINEDIGM_CONTENT
|
45
|
+
else
|
46
|
+
self.profile_name = DEFAULT
|
47
|
+
end
|
48
|
+
XMorph::Base.logger.debug("XMorph#set_profile_name#tyt: using profile #{self.profile_name}") unless self.profile_name.nil?
|
49
|
+
return true
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
class Transcode < XMorph::Base
|
2
|
+
MONO = "mono"
|
3
|
+
STEREO = "stereo"
|
4
|
+
def set_profiles
|
5
|
+
self.profiles = {
|
6
|
+
MONO => "ffmpeg -y -i %{IN} -map 0:v -filter_complex \"[0:a:0]aformat=sample_fmts=fltp:sample_rates=48000:channel_layouts=mono[a1]; [0:a:1]aformat=sample_fmts=fltp:sample_rates=48000:channel_layouts=mono[a2]; [a1][a2]amerge[aout0]\" -map \"[aout0]\" -acodec libfdk_aac -vf \"fps=fps=25,scale=1920:1080\" -vcodec libx264 -pix_fmt yuv420p -x264opts nal-hrd=cbr -g 13 -aspect 16:9 -bf 2 -flags +ilme+ildct -top 1 -profile:v high -b:v 12M -minrate:v 12M -maxrate:v 12M -muxrate 14M -bufsize:v 25M -pes_payload_size 16 -streamid 0:2064 -streamid 1:2068 -vsync 1 -async 1 -ac 2 %{OUT} 2>&1",
|
7
|
+
STEREO => "ffmpeg -y -i %{IN} -map 0:v -map 0:a -acodec libfdk_aac -vf \"fps=fps=25,scale=1920:1080\" -vcodec libx264 -pix_fmt yuv420p -x264opts nal-hrd=cbr -g 13 -aspect 16:9 -bf 2 -flags +ilme+ildct -top 1 -profile:v high -b:v 12M -minrate:v 12M -maxrate:v 12M -muxrate 14M -bufsize:v 25M -pes_payload_size 16 -streamid 0:2064 -streamid 1:2068 -vsync 1 -async 1 -ac 2 %{OUT} 2>&1",
|
8
|
+
}
|
9
|
+
end
|
10
|
+
|
11
|
+
def video_checks
|
12
|
+
{
|
13
|
+
ALLOWED_ASPECT_RATIO => ["16:9"],
|
14
|
+
ALLOWED_HEIGHT => [720, 1080],
|
15
|
+
ALLOWED_WIDTH => [1280, 1920],
|
16
|
+
ALLOWED_FRAME_RATE => IGNORE,
|
17
|
+
ALLOWED_VIDEO_BIT_RATE => IGNORE, #Mbps
|
18
|
+
ALLOWED_SCAN_TYPE => IGNORE, #all downcased
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
def audio_checks
|
23
|
+
{
|
24
|
+
PRESENCE_OF_AUDIO_TRACK => VALIDATE,
|
25
|
+
ALLOWED_NUMBER_OF_AUDIO_TRACKS => [1, 2, 4, 6, 8, 16],
|
26
|
+
ALLOWED_AUDIO_CODECS => ["aac", "pcm", ".mp2"],
|
27
|
+
ALLOWED_AUDIO_BIT_RATE => IGNORE,
|
28
|
+
ALLOWED_NUMBER_OF_AUDIO_CHANNELS => [1, 2, 4],
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
#profiles are classified based on number channels in audio tracks.
|
33
|
+
def set_profile_name
|
34
|
+
self.profile_name = nil
|
35
|
+
mediainfo = self.mediainfo_output
|
36
|
+
mono = "true"
|
37
|
+
audio_tracks = mediainfo["Audio"]
|
38
|
+
audio_tracks.each_with_index do |audio, index|
|
39
|
+
if audio["Channel_s_"] =~ /2/
|
40
|
+
mono = "false"
|
41
|
+
elsif audio["Channel_s_"] =~ /1/
|
42
|
+
mono = "true"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
self.profile_name = (mono == "true")? MONO : STEREO
|
46
|
+
XMorph::Base.logger.debug("XMorph#set_profile_name#TYT: using profile #{self.profile_name}") unless self.profile_name.nil?
|
47
|
+
return true
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
data/lib/xmorph/error.rb
ADDED
data/lib/xmorph/util.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
module XMorph
|
2
|
+
require 'active_support'
|
3
|
+
class Util
|
4
|
+
def self.mediainfo_xml_to_hash(response)
|
5
|
+
meta = {
|
6
|
+
"Audio" => []
|
7
|
+
}
|
8
|
+
begin
|
9
|
+
response_json = Hash.from_xml(response)
|
10
|
+
response_json["Mediainfo"]["File"]["track"].each do |track|
|
11
|
+
type = track['type']
|
12
|
+
track = track.except("type")
|
13
|
+
track['Encoding_settings'] = Rack::Utils.parse_nested_query(track['Encoding_settings'].split("/").map {|pair| pair.strip }.join("&")) unless track['Encoding_settings'].nil?
|
14
|
+
(type == "Audio") ? meta["Audio"] << track : meta[type] = track
|
15
|
+
if type == "Video"
|
16
|
+
if track["Display_aspect_ratio"].present?
|
17
|
+
track["Display_aspect_ratio"] = track["Display_aspect_ratio"] if track["Display_aspect_ratio"].include? (":")
|
18
|
+
end
|
19
|
+
if track["Original_display_aspect_ratio"].present?
|
20
|
+
track["Display_aspect_ratio"] = track["Original_display_aspect_ratio"] if track["Original_display_aspect_ratio"].include? (":")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
meta['audio_tracks'] = meta['Audio'].count.to_s
|
25
|
+
rescue => ex
|
26
|
+
puts ex
|
27
|
+
return false, {"error" => "Failed to load mediainfo"}
|
28
|
+
end
|
29
|
+
return true, meta
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.run_cmd_with_response(cmd)
|
33
|
+
raw_response = `#{cmd}`
|
34
|
+
successful = true
|
35
|
+
exit_status = $?.exitstatus
|
36
|
+
if exit_status != 0
|
37
|
+
successful = false
|
38
|
+
end
|
39
|
+
return successful, raw_response
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
data/lib/xmorph.rb
ADDED
metadata
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: amagi_transcode
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.14
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- tejaswini
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2024-07-21 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.8.0
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.8.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.13'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.13'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '10.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '10.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: activesupport
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: Morphs things from one kind to another. Transcodes, in local speak, for
|
70
|
+
example.
|
71
|
+
email:
|
72
|
+
- tejaswini@amagi.com
|
73
|
+
executables: []
|
74
|
+
extensions: []
|
75
|
+
extra_rdoc_files: []
|
76
|
+
files:
|
77
|
+
- Gemfile
|
78
|
+
- Gemfile.lock
|
79
|
+
- README.md
|
80
|
+
- amagi_transcode.gemspec
|
81
|
+
- bin/console
|
82
|
+
- bin/mediainfo
|
83
|
+
- lib/.DS_Store
|
84
|
+
- lib/xmorph.rb
|
85
|
+
- lib/xmorph/.DS_Store
|
86
|
+
- lib/xmorph/base.rb
|
87
|
+
- lib/xmorph/customers/cbn/cbn/transcode.rb
|
88
|
+
- lib/xmorph/customers/cinedigm/Cinedigm/transcode.rb
|
89
|
+
- lib/xmorph/customers/curiosity/curiosity/transcode.rb
|
90
|
+
- lib/xmorph/customers/dogtv/dogtv/transcode.rb
|
91
|
+
- lib/xmorph/customers/gusto/gusto/transcode.rb
|
92
|
+
- lib/xmorph/customers/hkitv/hkitv/transcode.rb
|
93
|
+
- lib/xmorph/customers/hungama/Hungama/transcode.rb
|
94
|
+
- lib/xmorph/customers/kalpnik/kalpnik/transcode.rb
|
95
|
+
- lib/xmorph/customers/lightning/LIG/transcode.rb
|
96
|
+
- lib/xmorph/customers/peopletv/peopletv/transcode.rb
|
97
|
+
- lib/xmorph/customers/rewind/rewind/transcode.rb
|
98
|
+
- lib/xmorph/customers/rooster-teeth/roosterteeth/transcode.rb
|
99
|
+
- lib/xmorph/customers/sabatv/sabatv/transcode.rb
|
100
|
+
- lib/xmorph/customers/scripps-cp/scpbu/transcode.rb
|
101
|
+
- lib/xmorph/customers/shoutfactory/shoutfactory/transcode.rb
|
102
|
+
- lib/xmorph/customers/tastemade/tastemade/transcode.rb
|
103
|
+
- lib/xmorph/customers/tern-cp/TCP/transcode.rb
|
104
|
+
- lib/xmorph/customers/turner-nordic/TurnerNordic/transcode.rb
|
105
|
+
- lib/xmorph/customers/tyt/TYT/transcode.rb
|
106
|
+
- lib/xmorph/customers/zsports/asn/transcode.rb
|
107
|
+
- lib/xmorph/error.rb
|
108
|
+
- lib/xmorph/util.rb
|
109
|
+
- lib/xmorph/version.rb
|
110
|
+
homepage: https://github.com/amagimedia/xmorph
|
111
|
+
licenses:
|
112
|
+
- MIT
|
113
|
+
metadata: {}
|
114
|
+
post_install_message:
|
115
|
+
rdoc_options: []
|
116
|
+
require_paths:
|
117
|
+
- lib
|
118
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '0'
|
123
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '0'
|
128
|
+
requirements: []
|
129
|
+
rubygems_version: 3.4.10
|
130
|
+
signing_key:
|
131
|
+
specification_version: 4
|
132
|
+
summary: Morphs things from one kind to another.
|
133
|
+
test_files: []
|