other_video_transcoding 0.10.0 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/bin/ask-ffmpeg-log +1 -1
- data/bin/other-transcode +118 -4
- data/other_video_transcoding-0.10.0.gem +0 -0
- data/other_video_transcoding.gemspec +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a38e8e2bf7937b708b2b024767f266beee682bc92f7377f4e8062dee7babd09
|
4
|
+
data.tar.gz: e3fd2a8a57f2fad558b9a30fcb2fae633b8b7120d9e802f3d08a65de1053b1ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d8dd9d8cb3788ec1d17379d167e75dbe506dca39b64a7e18f162021387d9329e0bb874b6a9bf298d866d27e5a47e151e43881708c3efc22730ee0fbc5004addc
|
7
|
+
data.tar.gz: db27d572846d979263b8c5b7286f011849b7b8c6669e18a740bed29db3b1fbf5c0d924a420e2f531f26f4ae97d85f484161adc5a5b006f5b4914415d31cc512c
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,14 @@
|
|
2
2
|
|
3
3
|
This single document contains all of the notes created for each [release](https://github.com/donmelton/other_video_transcoding/releases).
|
4
4
|
|
5
|
+
## [0.11.0](https://github.com/donmelton/other_video_transcoding/releases/tag/0.11.0)
|
6
|
+
|
7
|
+
Saturday, July 16, 2022
|
8
|
+
|
9
|
+
* Modify `other-transcode` to copy 10-bit high-dynamic-range (HDR10) metadata, extracting content light level and mastering display metadata from a HDR10 video frame input and tagging a 10-bit video stream output in Matroska (MKV) format with that information. This will also copy static HDR10 metadata from Dolby Vision and HDR10+ video streams but it will _not_ copy additional dynamic metadata from those formats.
|
10
|
+
* Add a `--overlay-params` option to `other-transcode` to override the `overlay` filter configuration applied when burning subtitles. This is useful when cropping to move a subtitle within the output boundary.
|
11
|
+
* Add a `--fdk-vbr` option to `other-transcode` to set the numeric variable bitrate (VBR) mode for the Fraunhofer `libfdk_aac` audio encoder, disabling constant bitrate (CBR) ratecontrol. VBR mode `1` selects the lowest quality and `5` the highest. Please note that the `libfdk_aac` encoder is not normally included with `ffmpeg` due to licensing restrictions and the `--fdk-vbr` option has no effect if that encoder is not available. Via [ #127](https://github.com/donmelton/other_video_transcoding/issues/127).
|
12
|
+
|
5
13
|
## [0.10.0](https://github.com/donmelton/other_video_transcoding/releases/tag/0.10.0)
|
6
14
|
|
7
15
|
Thursday, January 27, 2022
|
data/bin/ask-ffmpeg-log
CHANGED
data/bin/other-transcode
CHANGED
@@ -18,7 +18,7 @@ module Transcoding
|
|
18
18
|
class Command
|
19
19
|
def about
|
20
20
|
<<-HERE
|
21
|
-
other-transcode 0.
|
21
|
+
other-transcode 0.11.0
|
22
22
|
Copyright (c) 2019-2022 Don Melton
|
23
23
|
HERE
|
24
24
|
end
|
@@ -137,6 +137,8 @@ Video options:
|
|
137
137
|
|
138
138
|
def usage10
|
139
139
|
<<-HERE
|
140
|
+
--overlay-params KEY=VALUE[:KEY=VALUE]...
|
141
|
+
override subtitle overlay filter configuration
|
140
142
|
--yadif-params KEY=VALUE[:KEY=VALUE]...
|
141
143
|
override yadif deinterlace filter configuration
|
142
144
|
--rc-maxrate FACTOR, --rc-bufsize FACTOR|BITRATE
|
@@ -294,6 +296,14 @@ Audio options:
|
|
294
296
|
def usage19
|
295
297
|
<<-HERE
|
296
298
|
|
299
|
+
Fraunhofer FDK AAC audio encoder options:
|
300
|
+
--fdk-vbr MODE set numeric variable bitrate (VBR) mode, from 1 to 5
|
301
|
+
HERE
|
302
|
+
end
|
303
|
+
|
304
|
+
def usage20
|
305
|
+
<<-HERE
|
306
|
+
|
297
307
|
Subtitle options:
|
298
308
|
--add-subtitle TRACK[=forced]|auto|all|LANGUAGE|STRING
|
299
309
|
add single subtitle track by number
|
@@ -351,6 +361,7 @@ Requires `ffprobe`, `ffmpeg` and `mkvpropedit`.
|
|
351
361
|
@rate = nil
|
352
362
|
@detelecine = false
|
353
363
|
@enable_filters = true
|
364
|
+
@overlay_params = nil
|
354
365
|
@yadif_params = nil
|
355
366
|
@maxrate = nil
|
356
367
|
@bufsize = nil
|
@@ -392,6 +403,7 @@ Requires `ffprobe`, `ffmpeg` and `mkvpropedit`.
|
|
392
403
|
@keep_ac3_surround = true
|
393
404
|
@keep_ac3_stereo = false
|
394
405
|
@pass_dts = false
|
406
|
+
@fdk_vbr_mode = nil
|
395
407
|
@subtitle_selections = []
|
396
408
|
@auto_add_subtitle = false
|
397
409
|
@burn_subtitle_track = 0
|
@@ -408,14 +420,14 @@ Requires `ffprobe`, `ffmpeg` and `mkvpropedit`.
|
|
408
420
|
puts usage1 + usage2 + usage3 + usage4 + usage5 + usage6 +
|
409
421
|
usage7 + usage8 + usage9 + usage10 + usage11 + usage12 +
|
410
422
|
usage13 + usage14 + usage15 + usage16 + usage17 +
|
411
|
-
usage18 + usage19
|
423
|
+
usage18 + usage19 + usage20
|
412
424
|
when 'more'
|
413
425
|
puts usage1 + usage2 + usage3 + usage4 + usage6 + usage7 +
|
414
426
|
usage8 + usage9 + usage11 + usage13 + usage15 + usage16 +
|
415
|
-
usage17 + usage18 +
|
427
|
+
usage17 + usage18 + usage20
|
416
428
|
else
|
417
429
|
puts usage1 + usage3 + usage6 + usage8 + usage11 + usage13 +
|
418
|
-
usage15 + usage17 +
|
430
|
+
usage15 + usage17 + usage20
|
419
431
|
end
|
420
432
|
|
421
433
|
exit
|
@@ -656,6 +668,14 @@ Requires `ffprobe`, `ffmpeg` and `mkvpropedit`.
|
|
656
668
|
@enable_filters = false
|
657
669
|
end
|
658
670
|
|
671
|
+
opts.on '--overlay-params ARG' do |arg|
|
672
|
+
arg.split ':' do |param|
|
673
|
+
fail UsageError, "invalid argument: #{arg}" unless param =~ /^[\w\-]+=[\w\-\.,\(\)]+$/
|
674
|
+
end
|
675
|
+
|
676
|
+
@overlay_params = arg
|
677
|
+
end
|
678
|
+
|
659
679
|
opts.on '--yadif-params ARG' do |arg|
|
660
680
|
arg.split ':' do |param|
|
661
681
|
fail UsageError, "invalid argument: #{arg}" unless param =~ /^[\w\-]+=[\w\-\.,\(\)]+$/
|
@@ -945,6 +965,10 @@ Requires `ffprobe`, `ffmpeg` and `mkvpropedit`.
|
|
945
965
|
@surround_encoder ||= 'ac3'
|
946
966
|
end
|
947
967
|
|
968
|
+
opts.on '--fdk-vbr ARG', Integer do |arg|
|
969
|
+
@fdk_vbr_mode = [[arg, 1].max, 5].min.to_s
|
970
|
+
end
|
971
|
+
|
948
972
|
opts.on '--add-subtitle ARG' do |arg|
|
949
973
|
if arg =~ /^([0-9]+)(?:=(forced))?$|^(auto)$|^([a-z]{3})$|^(.*)$/
|
950
974
|
@subtitle_selections += [{
|
@@ -1258,6 +1282,11 @@ Requires `ffprobe`, `ffmpeg` and `mkvpropedit`.
|
|
1258
1282
|
Kernel.warn 'Done.'
|
1259
1283
|
else
|
1260
1284
|
add_track_statistics_tags output_path
|
1285
|
+
ten_bit = (@ten_bit ? (@eight_bit_vc1 ? (video['codec_name'] != 'vc1') : true) : false)
|
1286
|
+
|
1287
|
+
if (video.fetch('pix_fmt', 'yuv420p') == 'yuv420p10le') and ten_bit
|
1288
|
+
add_hdr_info path, output_path
|
1289
|
+
end
|
1261
1290
|
end
|
1262
1291
|
|
1263
1292
|
Kernel.warn "\nElapsed time: #{seconds_to_time(Time.now.tv_sec - seconds)}\n\n"
|
@@ -1621,6 +1650,7 @@ Requires `ffprobe`, `ffmpeg` and `mkvpropedit`.
|
|
1621
1650
|
overlay_filter = nil
|
1622
1651
|
else
|
1623
1652
|
overlay_filter = "[0:#{burn_subtitle['index']}]overlay"
|
1653
|
+
overlay_filter += "=#{@overlay_params}" unless @overlay_params.nil?
|
1624
1654
|
end
|
1625
1655
|
|
1626
1656
|
deinterlace = @deinterlace
|
@@ -2128,8 +2158,17 @@ Requires `ffprobe`, `ffmpeg` and `mkvpropedit`.
|
|
2128
2158
|
next if configurations[input_index] == configuration
|
2129
2159
|
|
2130
2160
|
configurations[input_index] = configuration
|
2161
|
+
|
2162
|
+
if encoder == 'libfdk_aac' and not @fdk_vbr_mode.nil?
|
2163
|
+
bitrate = nil
|
2164
|
+
fdk_vbr_mode = @fdk_vbr_mode
|
2165
|
+
else
|
2166
|
+
fdk_vbr_mode = nil
|
2167
|
+
end
|
2168
|
+
|
2131
2169
|
text = "#{sprintf("%2d", input_index)} = #{encoder}"
|
2132
2170
|
text += " / #{bitrate} Kbps" unless bitrate.nil?
|
2171
|
+
text += " / VBR mode #{fdk_vbr_mode}" unless fdk_vbr_mode.nil?
|
2133
2172
|
text += ' / stereo' unless channels.nil? or channels > 2
|
2134
2173
|
text += " / #{titles[input_index]}" if titles.has_key?(input_index)
|
2135
2174
|
Kernel.warn text
|
@@ -2140,6 +2179,7 @@ Requires `ffprobe`, `ffmpeg` and `mkvpropedit`.
|
|
2140
2179
|
"-c:a:#{index}", encoder,
|
2141
2180
|
*(encoder == 'aac_at' ? ["-aac_at_mode:a:#{index}", 'cvbr'] : []),
|
2142
2181
|
*(bitrate.nil? ? [] : ["-b:a:#{index}", "#{bitrate}k"]),
|
2182
|
+
*(fdk_vbr_mode.nil? ? [] : ["-vbr:a:#{index}", fdk_vbr_mode]),
|
2143
2183
|
*(channels.nil? ? [] : ["-ac:a:#{index}", "#{channels}"]),
|
2144
2184
|
*((encoder != 'copy' and track[:stream]['sample_rate'] != '48000') ? ["-ar:a:#{index}", '48000'] : []),
|
2145
2185
|
*(copy_track_name ? [] : ["-metadata:s:a:#{index}", 'title=']),
|
@@ -2284,6 +2324,80 @@ Requires `ffprobe`, `ffmpeg` and `mkvpropedit`.
|
|
2284
2324
|
|
2285
2325
|
fail "adding track statistics tags failed: #{output_path}" unless $CHILD_STATUS.exitstatus == 0
|
2286
2326
|
end
|
2327
|
+
|
2328
|
+
def add_hdr_info(path, output_path)
|
2329
|
+
hdr_info = ''
|
2330
|
+
|
2331
|
+
IO.popen([
|
2332
|
+
'ffprobe',
|
2333
|
+
'-loglevel', 'quiet',
|
2334
|
+
'-select_streams', 'v:0',
|
2335
|
+
'-show_frames',
|
2336
|
+
'-read_intervals', '%+#1',
|
2337
|
+
'-show_entries', 'frame=side_data_list',
|
2338
|
+
'-print_format', 'json',
|
2339
|
+
path
|
2340
|
+
]) do |io|
|
2341
|
+
hdr_info = io.read
|
2342
|
+
end
|
2343
|
+
|
2344
|
+
fail "scanning media failed: #{path}" unless $CHILD_STATUS.exitstatus == 0
|
2345
|
+
|
2346
|
+
begin
|
2347
|
+
hdr_info = JSON.parse(hdr_info)
|
2348
|
+
rescue JSON::JSONError
|
2349
|
+
fail "media information not found: #{path}"
|
2350
|
+
end
|
2351
|
+
|
2352
|
+
md = nil
|
2353
|
+
cll = nil
|
2354
|
+
|
2355
|
+
hdr_info['frames'].each do |frame|
|
2356
|
+
frame.fetch('side_data_list', []).each do |side_data|
|
2357
|
+
if side_data['side_data_type'] == 'Mastering display metadata'
|
2358
|
+
md = side_data if md.nil?
|
2359
|
+
elsif side_data['side_data_type'] == 'Content light level metadata'
|
2360
|
+
cll = side_data if cll.nil?
|
2361
|
+
end
|
2362
|
+
end
|
2363
|
+
end
|
2364
|
+
|
2365
|
+
return if md.nil? or cll.nil?
|
2366
|
+
|
2367
|
+
Kernel.warn 'Adding HDR information...'
|
2368
|
+
|
2369
|
+
begin
|
2370
|
+
IO.popen([
|
2371
|
+
'mkvpropedit',
|
2372
|
+
output_path,
|
2373
|
+
'--edit', 'track:v1',
|
2374
|
+
'--set', "max-content-light=#{cll['max_content']}",
|
2375
|
+
'--set', "max-frame-light=#{cll['max_average']}",
|
2376
|
+
'--set', "chromaticity-coordinates-red-x=#{eval md['red_x'] + '.0'}",
|
2377
|
+
'--set', "chromaticity-coordinates-red-y=#{eval md['red_y'] + '.0'}",
|
2378
|
+
'--set', "chromaticity-coordinates-green-x=#{eval md['green_x'] + '.0'}",
|
2379
|
+
'--set', "chromaticity-coordinates-green-y=#{eval md['green_y'] + '.0'}",
|
2380
|
+
'--set', "chromaticity-coordinates-blue-x=#{eval md['blue_x'] + '.0'}",
|
2381
|
+
'--set', "chromaticity-coordinates-blue-y=#{eval md['blue_y'] + '.0'}",
|
2382
|
+
'--set', "white-coordinates-x=#{eval md['white_point_x'] + '.0'}",
|
2383
|
+
'--set', "white-coordinates-y=#{eval md['white_point_y'] + '.0'}",
|
2384
|
+
'--set', "max-luminance=#{eval md['max_luminance'] + '.0'}",
|
2385
|
+
'--set', "min-luminance=#{eval md['min_luminance'] + '.0'}"
|
2386
|
+
], 'rb') do |io|
|
2387
|
+
Signal.trap 'INT' do
|
2388
|
+
Process.kill 'INT', io.pid
|
2389
|
+
end
|
2390
|
+
|
2391
|
+
io.each_char do |char|
|
2392
|
+
STDERR.print char
|
2393
|
+
end
|
2394
|
+
end
|
2395
|
+
rescue SystemCallError => e
|
2396
|
+
raise "adding HDR information failed: #{e}"
|
2397
|
+
end
|
2398
|
+
|
2399
|
+
fail "adding HDR information failed: #{output_path}" unless $CHILD_STATUS.exitstatus == 0
|
2400
|
+
end
|
2287
2401
|
end
|
2288
2402
|
end
|
2289
2403
|
|
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: other_video_transcoding
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Don Melton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-07-16 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: " Other Video Transcoding is a package of tools to transcode videos.\n"
|
14
14
|
email: don@blivet.com
|
@@ -27,6 +27,7 @@ files:
|
|
27
27
|
- bin/other-transcode
|
28
28
|
- other_video_transcoding-0.1.0.gem
|
29
29
|
- other_video_transcoding-0.1.1.gem
|
30
|
+
- other_video_transcoding-0.10.0.gem
|
30
31
|
- other_video_transcoding-0.2.0.gem
|
31
32
|
- other_video_transcoding-0.3.0.gem
|
32
33
|
- other_video_transcoding-0.3.1.gem
|
@@ -57,7 +58,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
57
58
|
- !ruby/object:Gem::Version
|
58
59
|
version: '0'
|
59
60
|
requirements: []
|
60
|
-
rubygems_version: 3.
|
61
|
+
rubygems_version: 3.3.7
|
61
62
|
signing_key:
|
62
63
|
specification_version: 4
|
63
64
|
summary: Other tools to transcode videos.
|