sox - труба не работает? - PullRequest
       57

sox - труба не работает?

0 голосов
/ 28 марта 2020

Я пытаюсь использовать команды ввода sox, чтобы разрешить обработку форматов файлов, которые сама sox не поддерживает, без необходимости сначала преобразовывать все входные данные.

Моя последняя попытка следующая (создать спектрограмму diff между двумя разными кодировками AA C):

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

... при этом непосредственно с использованием предварительно преобразованного файла (в FLA C или WAV), выдает правильный результат: enter image description here

Вывод для простой команды pipe:

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 голосов
/ 28 марта 2020

После еще нескольких экспериментов я, наконец, обнаружил, что это связано только с эффектом спектрограммы Сокс, потому что он не может вычесть длительность из входных данных, но это необходимо для расчета макета.

Очевидно, что требование не задокументировано.

Однако, чтобы точно указать продолжительность, мы должны предоставить ей количество выборок входных данных.

Я использую ffprobe и jq для этого:

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

...