sox - 管道输入坏了?
sox - pipe input broken?
我正在尝试使用 sox 输入命令来允许处理 sox 本身不支持的文件格式,而无需先转换所有输入。
我最后的尝试如下(创建两个不同 AAC 编码之间 diff 的频谱图):
sox -S -m \
-v 1 -t s24 -r 48k -c 2 -L "|ffmpeg -i input_orig.aac -vn -f s24le -" \
-v -1 -t s24 -r 48k -c 2 -L "|ffmpeg -i input_faac.aac -vn -f s24le -" \
-n \
spectrogram -x 1600 -y 480 -o diff.faac.png
然而,结果是频谱图确实只包含前几秒,所以我一定是遗漏了什么。
但是什么?
更新
用单个管道尝试了一个更简单的测试,看它是否有效,但它导致了同样的问题:
ffmpeg -hide_banner -i input_orig.aac -vn -f s24le - | sox -S -t s24 -c 2 -r 48k -L - -n spectrogram -x 480 -y 96 -o orig.pipe.png
结果:
...直接使用预转换文件(FLAC 或 WAV)执行此操作时,会产生正确的结果:
简单管道命令的输出:
Input File : '-' (raw)
Channels : 2
Sample Rate : 48000
Precision : 24-bit
Sample Encoding: 24-bit Signed Integer PCM
In:0.00% 00:00:00.00 [00:00:00.00] Out:0 [ | ] Clip:0 [aac @ 0x5643e7dc9940] Estimating duration from bitrate, this may be inaccurate
Input #0, aac, from 'input_orig.aac':
Duration: 00:01:35.08, bitrate: 136 kb/s
Stream #0:0: Audio: aac (LC), 48000 Hz, stereo, fltp, 136 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (aac (native) -> pcm_s24le (native))
Press [q] to stop, [?] for help
Output #0, s24le, to 'pipe:':
Metadata:
encoder : Lavf58.20.100
Stream #0:0: Audio: pcm_s24le, 48000 Hz, stereo, s32, 2304 kb/s
Metadata:
encoder : Lavc58.35.100 pcm_s24le
In:0.00% 00:01:27.55 [00:00:00.00] Out:4.20M [!=====|=====!] Hd:0.0 Clip:0 size= 28110kB time=00:01:39.94 bitrate=2304.0kbits/s speed= 417x
video:0kB audio:28110kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%
In:0.00% 00:01:39.95 [00:00:00.00] Out:4.80M [!=====|======] Hd:0.0 Clip:0
Done.
经过更多的实验,我终于发现它只与sox频谱图效果有关,因为它不能从输入中扣除持续时间,但计算布局需要它。
显然,没有记录该要求。
但是,要精确指定持续时间,我们必须为其提供输入样本数。
ffprobe -v error -print_format json -select_streams a:0 -show_entries frame=nb_samples input_orig.aac \
| jq --stream 'select(.[0][2] == "nb_samples")[1]' \
| jq --slurp 'add'
(是的,有更简单的方法,但它们不能扩展)
...这为我的输入文件提供了 4797440
个样本。
现在它实际上可以将 -d 4797440s
添加到频谱图效果中:
sox -S -m \
-v 1 -t s24 -r 48k -c 2 -L "|ffmpeg -v error -i input_orig.aac -vn -f s24le -" \
-v -1 -t s24 -r 48k -c 2 -L "|ffmpeg -v error -i input_faac.aac -vn -f s24le -" \
-n \
spectrogram -d 4797440s -x 1600 -y 480 -o diff.faac.png
新结果:
我正在尝试使用 sox 输入命令来允许处理 sox 本身不支持的文件格式,而无需先转换所有输入。
我最后的尝试如下(创建两个不同 AAC 编码之间 diff 的频谱图):
sox -S -m \
-v 1 -t s24 -r 48k -c 2 -L "|ffmpeg -i input_orig.aac -vn -f s24le -" \
-v -1 -t s24 -r 48k -c 2 -L "|ffmpeg -i input_faac.aac -vn -f s24le -" \
-n \
spectrogram -x 1600 -y 480 -o diff.faac.png
然而,结果是频谱图确实只包含前几秒,所以我一定是遗漏了什么。
但是什么?
更新
用单个管道尝试了一个更简单的测试,看它是否有效,但它导致了同样的问题:
ffmpeg -hide_banner -i input_orig.aac -vn -f s24le - | sox -S -t s24 -c 2 -r 48k -L - -n spectrogram -x 480 -y 96 -o orig.pipe.png
结果:
...直接使用预转换文件(FLAC 或 WAV)执行此操作时,会产生正确的结果:
简单管道命令的输出:
Input File : '-' (raw)
Channels : 2
Sample Rate : 48000
Precision : 24-bit
Sample Encoding: 24-bit Signed Integer PCM
In:0.00% 00:00:00.00 [00:00:00.00] Out:0 [ | ] Clip:0 [aac @ 0x5643e7dc9940] Estimating duration from bitrate, this may be inaccurate
Input #0, aac, from 'input_orig.aac':
Duration: 00:01:35.08, bitrate: 136 kb/s
Stream #0:0: Audio: aac (LC), 48000 Hz, stereo, fltp, 136 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (aac (native) -> pcm_s24le (native))
Press [q] to stop, [?] for help
Output #0, s24le, to 'pipe:':
Metadata:
encoder : Lavf58.20.100
Stream #0:0: Audio: pcm_s24le, 48000 Hz, stereo, s32, 2304 kb/s
Metadata:
encoder : Lavc58.35.100 pcm_s24le
In:0.00% 00:01:27.55 [00:00:00.00] Out:4.20M [!=====|=====!] Hd:0.0 Clip:0 size= 28110kB time=00:01:39.94 bitrate=2304.0kbits/s speed= 417x
video:0kB audio:28110kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%
In:0.00% 00:01:39.95 [00:00:00.00] Out:4.80M [!=====|======] Hd:0.0 Clip:0
Done.
经过更多的实验,我终于发现它只与sox频谱图效果有关,因为它不能从输入中扣除持续时间,但计算布局需要它。
显然,没有记录该要求。
但是,要精确指定持续时间,我们必须为其提供输入样本数。
ffprobe -v error -print_format json -select_streams a:0 -show_entries frame=nb_samples input_orig.aac \
| jq --stream 'select(.[0][2] == "nb_samples")[1]' \
| jq --slurp 'add'
(是的,有更简单的方法,但它们不能扩展)
...这为我的输入文件提供了 4797440
个样本。
现在它实际上可以将 -d 4797440s
添加到频谱图效果中:
sox -S -m \
-v 1 -t s24 -r 48k -c 2 -L "|ffmpeg -v error -i input_orig.aac -vn -f s24le -" \
-v -1 -t s24 -r 48k -c 2 -L "|ffmpeg -v error -i input_faac.aac -vn -f s24le -" \
-n \
spectrogram -d 4797440s -x 1600 -y 480 -o diff.faac.png
新结果: