other_video_transcoding 0.10.0 → 0.11.0
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 +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.
|