sox-管道输入损坏?

时间:2020-03-27 23:31:17

标签: sox

我试图利用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

结果: enter image description here

...直接使用预转换的文件(转换为FLAC或WAV)直接生成正确的结果: enter image description here

简单管道命令的输出:

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.

1 个答案:

答案 0 :(得分:0)

经过更多的实验,我最终发现它仅与sox频谱图效果有关,因为它无法从输入中减去持续时间,但需要它来计算布局。

显然,该要求没有记录。

但是,要精确指定持续时间,我们必须为其提供输入样本的数量。

我为此使用ffprobejq

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

新结果:

enter image description here