Поле для экспериментов по выбрасыванию битов из потока: a.rs:
use std::io::{self, Read, Write};
fn main() -> io::Result<()> {
let stdin = io::stdin();
let mut stdout = io::stdout();
for byte in stdin.bytes() {
let byte = [byte? & маска];
stdout.write(&byte)?;
}
Ok(())
}
ffmpeg -hide_banner -y -i /data/sound/records/phone/03\ ТАКА\ П\'ЯНА\ Л.amr -f u8 -ar 8000 /dev/stdout|./a|ffmpeg -y -hide_banner -f u8 -ar 8000 -i /dev/stdin -acodec copy a.wav
или, чтобы смотреть спектр:
ffmpeg -hide_banner -y -i /data/sound/records/phone/03\ ТАКА\ П\'ЯНА\ Л.amr -f u8 -ar 8000 /dev/stdout|./a|ffplay -hide_banner -f u8 -ar 8000 /dev/stdin
Прежде всего, оригинал: https://0x0.st/-diT.amr
От сбрасывания старших битов (0x3f
) начинается типично цифровая каша-булькотня, ничего интересного: https://0x0.st/-dim.wav
Зато с младшими куда веселее. Оставляем от 8-и 4-е старших бита (0xf0
) — вполне качественно ещё, только шумит немножко: https://0x0.st/-dia.wav
2 бита (0xc0
) — тоже слушабельно, вполне уровень радиоточки: https://0x0.st/-diM.wav
Да и с 1-м битом (0x80
) ещё что-то можно разобрать: https://0x0.st/-diu.wav
Итоговый размер файла — 1761678 байт; если упаковать это в 8 раз, получаем 220210 байт — меньше, чем исходный AMR-файл.
Вот и вопрос: на хрена столько лишних данных гонять и пердолиться с вашими анализами фуррей и прочим матаном? Применяется ли подобное сжатие для какой-нибудь цифровой военной радиосвязи, например — низкокачественной, но дубовой и надёжной?
// Ждём петросянов с шуточками про Разорванного Флакона.