обработка аудио потоков

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

обработка аудио потоков

Непрочитанное сообщение Olej » 08 сен 2013, 00:30

Эта тема будет ответвлением Python - графика.
Т.е. намерение: вынести в отдельное обсуждение вопросов аудиообработки, которое ненароком там затронули (но к основной теме там это не относится).
В принципе, в такой постановке вопроса тему можно было бы назвать, на манер разбивки соседних тем и направления разговора, как-то так: Python - аудио. Но я этого не стал делать специально, т.к. интересует этот вопрос меня шире: не только обработка аудио конкретно из Python, а обработка любыми доступными средствами, в том числе и вызываемыми из Python.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: обработка аудио потоков

Непрочитанное сообщение Olej » 08 сен 2013, 01:28

Olej писал(а):Эта тема будет ответвлением Python - графика.
Там писалось (повторю, чтоб не бегать с темы в тему):
Olej писал(а): - в стандартной библиотеке Python достаточно много модулей мультимедийной обработки (беру документацию по версии 3.2.2) - The Python Standard Library:
22. Multimedia Services
22.1. audioop — Manipulate raw audio data
22.2. aifc — Read and write AIFF and AIFC files
22.3. sunau — Read and write Sun AU files
22.4. wave — Read and write WAV files
22.5. chunk — Read IFF chunked data
22.6. colorsys — Conversions between color systems
22.7. imghdr — Determine the type of an image
22.8. sndhdr — Determine type of sound file
22.9. ossaudiodev — Access to OSS-compatible audio devices
Но (по поверхностному взгляду) - это только зачаточные возможности по аудиообработке. А серьёзная обработка может быть легко сделана:
- либо запуском как дочерних процессов аудиоутилит развитых проектов (ALSA, SoX, Ogg etc.);
- либо прямым использованием DLL библиотек этих же проектов.
Это связано ещё и с тем, что аудиообработка - это часто ресурсоёмкие алгоритмы цифровой обработки сигналов (DSP), а Python уступает в производительности на таких задачах в 40 и более раз (сообщается и о 100 раз). А увязывание Python-кода с исполняющими функциями C/C++, в общем, понятно, и уже хорошо рассмотрено: связка Python + C/C++.
И лучше всего для этого будет начать с:
Olej писал(а): - ... всё это напомнило про большую работу по экспериментированию с аудиообработкой, которую я делал лет 5-6 назад, и которая вылилась в достаточно обстоятельное описание, которое и лежит вот здесь: аудио tools - самое время его достать и реставрировать применительно к текущей задаче;
Т.е. с разборок с public (open) аудио проектами, и что там у них происходит на сегодня, и утилит в их составе:
P.S. Есть ещё куча всяких GUI обработчиков аудио, типа таких: Аудио редакторы в Убунту, но они меня как-раз не интересуют, а интересуют консольные утилиты и их библиотеки. А многие GUI и есть только фронтэнды к таким утилитам и библиотекам.


1. Проект ALSA - Advanced Linux Sound Architecture (ALSA) project homepage

Код: Выделить всё

bash-4.2$ which aplay
/usr/bin/aplay
bash-4.2$ which arecord
/usr/bin/arecord
P.S. Звуковую систему OSS оставим в покое как очень старую (но библиотека Python нею не брезгует).

2. Проект SoX - Sound eXchange
SoX 14.4.1 was released on February 1, 2013.

Код: Выделить всё

bash-4.2$ which sox
/usr/bin/sox
bash-4.2$ which play
/usr/bin/play
3. Проект Ogg - Xiph.org

Код: Выделить всё

bash-4.2$ which ogg123
/usr/bin/ogg123
bash-4.2$ ls /usr/bin/ogg*
/usr/bin/ogg123  /usr/bin/oggdec  /usr/bin/oggenc  /usr/bin/ogginfo
bash-4.2$ ls /usr/bin/vorbis*
/usr/bin/vorbiscomment
Кодеки (проекты): Vorbis, Speex, FLAC и др.
Для того, чтобы были доступны утилиты speexenc, speexdec - должен быть установлен пакет speex-tools (на моём текущем компьютере не установлен):

Код: Выделить всё

bash-4.2$ yum list speex*
...
Установленные пакеты
speex.i686                                                    1.2-0.14.rc1.fc17                                              installed
Доступные пакеты
speex-devel.i686                                              1.2-0.14.rc1.fc17                                              fedora
speex-tools.i686                                              1.2-0.14.rc1.fc17                                              fedora
P.S. Это (Ogg + Vorbis и др.) куда интереснее (совершеннее), час всякие там .wav, .mp3 и т.п.

4. Проект PulseAudio - freedesktop.org/ www/ Software/ PulseAudio
http://www.freedesktop.org/wiki/Software/PulseAudio/
Заодно разобраться что это у них там за совместимость с Windows - http://ru.wikipedia.org/wiki/PulseAudio :
PulseAudio работает на платформах POSIX, таких как Linux, Solaris и FreeBSD, а также на платформе Microsoft Windows.

Код: Выделить всё

bash-4.2$ which pulseaudio
/usr/bin/pulseaudio
bash-4.2$ which pactl
/usr/bin/pactl
bash-4.2$ which pacmd
/usr/bin/pacmd

Код: Выделить всё

bash-4.2$ paplay --help
...
bash-4.2$ parecord --help
...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: обработка аудио потоков

Непрочитанное сообщение Olej » 08 сен 2013, 19:30

Я добавил (пользуясь административными полномочиями) некоторые типы расширений файлов, которые можно прикреплять к сообщениям - группа аудио файлов... (см. прикрепляемые файлы: расширения и ограничения)

Пользуясь случаем ;-) , теперь проверяем прикрепление звуковых файлов к тексту сообщения ... в порядке хулиганства :lol:
(Теперь можете прикреплять к своим текстам ругательные .wav в мой адрес)

Но это и 2 тестовых файла, из проекта Speex, кажется, которые можно использовать как тестовые данные (мужская и женская речь).

А заодно прикрепляю + когда-то написанную мной программу воспроизведения файлов .wav с темпокоррекцией (используя утилиту sox).
Собрать эту программу не представляет труда:

Код: Выделить всё

bash-4.2$ gcc wav-play.c -o wav-play
После чего можете позапускать ;-)

- вот так фраза будет проговариваться протяжно (на 50% медленнее):

Код: Выделить всё

bash-4.2$ ./wav-play -s 1.5 male.wav 
- а вот так скороговоркой:

Код: Выделить всё

bash-4.2$ ./wav-play -s 0.75 male.wav 
Но! Это не просто изменение скорости прогона - тембр речи при этом остаётся постоянным, голос идентифицируемый.
Как?
А вот так! ;-)
Вложения
male.wav
(93.79 КБ) 349 скачиваний
female.wav
(93.79 КБ) 363 скачивания
wav-play.c
(1.52 КБ) 348 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: обработка аудио потоков

Непрочитанное сообщение Olej » 08 сен 2013, 23:37

Olej писал(а):Но это и 2 тестовых файла, из проекта Speex, кажется, которые можно использовать как тестовые данные (мужская и женская речь).
А теперь о том, как самому наделать любых аудио файлов для экспериментирования со звуком:

1. Запись утилитой из PulseAudio (запись завершаем по ^C), воспроизведение утилитой play из проекта SoX (но play - это просто упрощённый скрипт из SoX, поэтому в более общем виде это можно делать утилитой sox):

Код: Выделить всё

bash-4.2$  parecord -rvvv > pmic.wav
Открытие потока запись со спецификацией сэмплов 's16le 2ch 44100Гц' и схемой каналов 'front-left,front-right'.
Соединение установлено.
Поток успешно создан.
Показатели буфера: maxlength=4194304, fragsize=352800
Использование семплов 's16le 2ch 44100Гц', схемы каналов 'front-left,front-right'.
Соединён с устройством alsa_input.pci-0000_00_1b.0.analog-stereo (1, not ожидание).
^CСигнал получен, выход.: 752106 мкс.

bash-4.2$ ./wav-play pmic.wav
sox FAIL formats: can't open input file `pmic.wav': WAVE: RIFF header not found

Запись произведена в сыром формате (.raw), без заголовка - просто последовательность цифровых отсчётов звука.
Любое преобразование формата файла (.raw в .wav, или наоборот) можете позже сделать утилитой sox.

Тогда сделаем так:

Код: Выделить всё

bash-4.2$ cp pmic.wav pmic.raw

bash-4.2$ play -r44100 -s -2 -c2 pmic.raw

pmic.raw:

 File Size: 361k      Bit Rate: 1.41M
  Encoding: Signed PCM
  Channels: 2 @ 16-bit
Samplerate: 44100Hz
Replaygain: off
  Duration: 00:00:02.05

In:100%  00:00:02.05 [00:00:00.00] Out:90.3k [      |      ]        Clip:0
Done.

Вот теперь всё замечательно звучит.

2. То же, но пользуемся утилитами ALSA (другая звуковая подсистема):

Код: Выделить всё

bash-4.2$ arecord -v -c2 -fS16_LE amic.raw
Recording WAVE 'amic.raw' : Signed 16 bit Little Endian, Rate 8000 Hz, Stereo
ALSA <-> PulseAudio PCM I/O Plugin
Its setup is:
  stream       : CAPTURE
  access       : RW_INTERLEAVED
  format       : S16_LE
  subformat    : STD
  channels     : 2
  rate         : 8000
  exact rate   : 8000 (8000/1)
  msbits       : 16
  buffer_size  : 4000
  period_size  : 1000
  period_time  : 125000
  tstamp_mode  : NONE
  period_step  : 1
  avail_min    : 1000
  period_event : 0
  start_threshold  : 1
  stop_threshold   : 4000
  silence_threshold: 0
  silence_size : 0
  boundary     : 2097152000
^CAborted by signal Прерывание...

bash-4.2$ play -r8000 -s -2 -c2 amic.raw

amic.raw:

 File Size: 128k      Bit Rate: 256k
  Encoding: Signed PCM
  Channels: 2 @ 16-bit
Samplerate: 8000Hz
Replaygain: off
  Duration: 00:00:04.00

In:100%  00:00:04.00 [00:00:00.00] Out:32.0k [      |      ]        Clip:0
Done.
3. Запись с помощью ALSA сразу в формат .wav (все параметры, которые задавались опциями команд, будут вписаны в RIFF-заголовок .wav файла):

Код: Выделить всё

bash-4.2$ arecord -v -c2 -fS16_LE -twav awmic.wav
Recording WAVE 'awmic.wav' : Signed 16 bit Little Endian, Rate 8000 Hz, Stereo
ALSA <-> PulseAudio PCM I/O Plugin
Its setup is:
  stream       : CAPTURE
  access       : RW_INTERLEAVED
  format       : S16_LE
  subformat    : STD
  channels     : 2
  rate         : 8000
  exact rate   : 8000 (8000/1)
  msbits       : 16
  buffer_size  : 4000
  period_size  : 1000
  period_time  : 125000
  tstamp_mode  : NONE
  period_step  : 1
  avail_min    : 1000
  period_event : 0
  start_threshold  : 1
  stop_threshold   : 4000
  silence_threshold: 0
  silence_size : 0
  boundary     : 2097152000
^CAborted by signal Прерывание...

bash-4.2$ play awmic.wav

awmic.wav:

 File Size: 168k      Bit Rate: 256k
  Encoding: Signed PCM
  Channels: 2 @ 16-bit
Samplerate: 8000Hz
Replaygain: off
  Duration: 00:00:05.25

In:100%  00:00:05.25 [00:00:00.00] Out:42.0k [      |      ]        Clip:0
Done.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: обработка аудио потоков

Непрочитанное сообщение Olej » 08 сен 2013, 23:51

Olej писал(а):Эта тема будет ответвлением Python - графика.
Любопытно вот что:

- Файл .wav, который я только-что при вас ;-) записал, совершенно нормально воспроизводится утилитой sox, или её клоном play, или программой wav-play, которая показана выше:

Код: Выделить всё

bash-4.2$ ./wav-play awmic.wav 
- Но он плохо воспроизводится (быстрее и с искажением тембра) тестовой программой на Python, которая использует pygames, с чего и началась тема:

Код: Выделить всё

bash-4.2$ ./test-wav.py awmic.wav
- Это, конечно, связано с несоответствием параметров (частота квантования, 1/2 байта на отсчёт, число каналов - моно/стерео и т.д.). Но всё это должно быть записано в RIFF-заголовке .wav, и должно отрабатываться считывающей программой. А pygames этого не делает. Это показатель а). ограниченности его возможностей и б). то, что универсальные пакеты "широкого применения" всегда ущербны по сравнению с профессиональными средствами.

- А запись .wav 32-битными отсчётами для Python вообще заканчивается "core dumped" :-o :

Код: Выделить всё

bash-4.2$ arecord -c1 -twav -fS32_LE -r4000 aw8mic.wav
Recording WAVE 'aw8mic.wav' : Signed 32 bit Little Endian, Rate 4000 Hz, Mono
^CAborted by signal Прерывание...

bash-4.2$ ./test-wav.py aw8mic.wav 
*** glibc detected *** /usr/bin/python: double free or corruption (!prev): 0x0856d260 ***
======= Backtrace: =========
/lib/libc.so.6[0x42026069]
/lib/libc.so.6(fclose+0x14c)[0x4201480c]
/lib/libSDL-1.2.so.0(+0x474bc0fb)[0xb73cf0fb]
/lib/libSDL_mixer-1.2.so.0(Mix_LoadWAV_RW+0x276)[0xb7249646]
/usr/lib/python2.7/site-packages/pygame/mixer.so(+0x258d)[0xb72cb58d]
/lib/libpython2.7.so.1.0[0x47474cef]
...
/usr/bin/python[0x80485a1]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:03 244954     /usr/bin/python2.7
08049000-0804a000 r--p 00000000 08:03 244954     /usr/bin/python2.7
...
43e3b000-43e3c000 r-xp 00000000 08:03 211842     /usr/lib/libX11-xcb.so.1.0.0
Аварийный останов (core dumped)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: обработка аудио потоков

Непрочитанное сообщение Olej » 09 сен 2013, 14:33

Olej писал(а): Вот теперь всё замечательно звучит.
P.S. При экспериментах со звуком обращайте внимание на то, что:
- некоторые игрушки захватывают глухо звуковое устройство, так что sox, play и все другие команды не смогут воспроизводить звук...
- особенно это характерно для многих WEB, браузерных игрушек, которых развелось во множестве...
- и это независимо от того, запущена ли такая гадость на другом рабочем столе, в другом браузере и т.д.
- проверяйте доступность звукового устройства перед началом экспериментов, элементарным play ... чтоб не потерять много часов бездарно ;-)

P.S. Похоже, это связано с бездарностью изготовителей таких игр. Но какое это для нас имеет значение? :-?

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: обработка аудио потоков

Непрочитанное сообщение Olej » 09 сен 2013, 16:34

Olej писал(а): - Это, конечно, связано с несоответствием параметров (частота квантования, 1/2 байта на отсчёт, число каналов - моно/стерео и т.д.). Но всё это должно быть записано в RIFF-заголовке .wav, и должно отрабатываться считывающей программой. А pygames этого не делает. Это показатель а). ограниченности его возможностей и б). то, что универсальные пакеты "широкого применения" всегда ущербны по сравнению с профессиональными средствами.
Оно, конечно, одно дело проиграть "бла-бла-бла под сурдинку" ;-) , сопровождая какой-то бойкий игровой сюжет (кто там разберётся с темпом воспроизведения? ;-) ), и совсем другое - а). вытащить поток из файла, которые бывают тысячи форматов, с разными параметрами записи + б). декодировать, если нужно, декомпрессировать поток + в). направить на устройство воспроизведения.

Меня пока интересовали бы возможности делать это средствами стандартной библиотеки Python (а не какими-то сторонними пакетами).
Но в составе стандартной библиотеки Python (версия 3.4, beta - куда уж более):
22. Multimedia Services
22.1. audioop — Manipulate raw audio data
22.2. aifc — Read and write AIFF and AIFC files
22.3. sunau — Read and write Sun AU files
22.4. wave — Read and write WAV files
22.5. chunk — Read IFF chunked data
22.6. colorsys — Conversions between color systems
22.7. imghdr — Determine the type of an image
22.8. sndhdr — Determine type of sound file
22.9. ossaudiodev — Access to OSS-compatible audio devices
Очень негусто! Звуковая система OSS, которая а). очень старая уже не развивается и б). которая существует только в Linux.

А поиск (поверхностный!) показал, что народ ничего искать не хочет ;-) , и использует либо Pygames, либо тяжеловесные сторонние проекты, либо в Windows какие-то специфические приблуды DLL ...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: обработка аудио потоков

Непрочитанное сообщение Olej » 09 сен 2013, 18:40

Olej писал(а): Меня пока интересовали бы возможности делать это средствами стандартной библиотеки Python (а не какими-то сторонними пакетами).
Но в составе стандартной библиотеки Python (версия 3.4, beta - куда уж более):
22. Multimedia Services
22.1. audioop — Manipulate raw audio data
22.2. aifc — Read and write AIFF and AIFC files
22.3. sunau — Read and write Sun AU files
22.4. wave — Read and write WAV files
22.5. chunk — Read IFF chunked data
22.6. colorsys — Conversions between color systems
22.7. imghdr — Determine the type of an image
22.8. sndhdr — Determine type of sound file
22.9. ossaudiodev — Access to OSS-compatible audio devices
Очень негусто! Звуковая система OSS, которая а). очень старая уже не развивается и б). которая существует только в Linux.
Но и с OSS (которая практически нигде в Linux не стоит уже) можно наглядно посмотреть как происходит чтение .wav, декодирование и воспроизведение.
Для этого нам поможет такая утилита padsp из PulseAudio (и если OSS - слишком старая, то PulseAudio - слишком новая ;-) ). Команда padsp эмулирует в PulseAudio присутствие OSS. И если мы просто запустим программу, использующую OSS, то получим ошибку:

Код: Выделить всё

bash-4.2$ python ./ossw.py ../male.wav
параметры записи: (1, 2, 8000, 48000, 'NONE', 'not compressed')
Traceback (most recent call last):
  File "./ossw.py", line 18, in <module>
    adev = ossaudiodev.open( 'w' )         # открыть OSS аудио устройство
IOError: [Errno 2] No such file or directory: '/dev/dsp'
Но вот с padsp всё будет нормально, и мы прослушаем .wav файл:

Код: Выделить всё

bash-4.2$ padsp python ./ossw.py ../male.wav
параметры записи: (1, 2, 8000, 48000, 'NONE', 'not compressed')
считано 20000
проиграно 20000
считано 20000
проиграно 20000
считано 20000
проиграно 20000
считано 20000
проиграно 20000
считано 16000
проиграно 16000
считано 0
последняя считанная позиция 48000
P.S. В принципе, убедиться что и как делает padsp можно направив сырой (.raw) аудио поток как-то так:

Код: Выделить всё

bash-4.2$ sudo padsp cp male.raw /dev/dsp
При этом будет воспроизводиться звук, но уровень его будет зашкаливающе большой ... один скрип. Или, может, параметры потока не те... - но сам факт, что звук воспроизводится.

А программа вот такая:

Код: Выделить всё

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import sys
import wave
import sndhdr
import ossaudiodev

if len( sys.argv ) != 2:
    print( "правильный запуск: {} <файл.wav>".format( sys.argv[ 0 ] ) )
    sys.exit( 1 )
if not sndhdr.whathdr( sys.argv[ 1 ] ):
    print( "файл не содержит RIFF заголовка (не .wav формат)" )
    sys.exit( 2 )

fw = wave.open( sys.argv[ 1 ], 'r' )
print( 'параметры записи: {}'.format( fw.getparams() ) )
adev = ossaudiodev.open( 'w' )         # открыть OSS аудио устройство
adev.channels( fw.getnchannels() )     # настроить число каналов, 1/2 - mono-stereo
adev.speed( fw.getframerate() )        # настроить частоту квантования
adev.setfmt( ossaudiodev.AFMT_S16_LE ) # настроить формат, правильно: fw.getsampwidth()
flen = fw.getnframes()                 # полное число отсчётов в завписи
# getcomptype()   -- returns compression type ('NONE' for linear samples)
# getcompname()   -- returns human-readable version of compression type ('not compressed' linear samples)

bufsize = 10000
while True:
    stream = fw.readframes( bufsize )  # читывание из файла
    print( 'считано {}'.format( len( stream ) ) )
    if len( stream ) == 0: break
    print( 'проиграно {}'.format( adev.write( stream ) ) )

print( 'последняя считанная позиция {}'.format( fw.tell() ) )
Вложения
ossw.py
(1.51 КБ) 347 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: обработка аудио потоков

Непрочитанное сообщение Olej » 10 сен 2013, 01:21

Olej писал(а):
Olej писал(а): Меня пока интересовали бы возможности делать это средствами стандартной библиотеки Python (а не какими-то сторонними пакетами).
Но в составе стандартной библиотеки Python (версия 3.4, beta - куда уж более):
22. Multimedia Services
22.1. audioop — Manipulate raw audio data
22.2. aifc — Read and write AIFF and AIFC files
22.3. sunau — Read and write Sun AU files
22.4. wave — Read and write WAV files
22.5. chunk — Read IFF chunked data
22.6. colorsys — Conversions between color systems
22.7. imghdr — Determine the type of an image
22.8. sndhdr — Determine type of sound file
22.9. ossaudiodev — Access to OSS-compatible audio devices
Очень негусто! Звуковая система OSS, которая а). очень старая уже не развивается и б). которая существует только в Linux.
Но и с OSS (которая практически нигде в Linux не стоит уже) можно наглядно посмотреть как происходит чтение .wav, декодирование и воспроизведение.
Обыскался примеров использования звуковой системы ALSA и звукового сервера PulseAudio (который интересен из соображений совместимости с Windows).
На удивление ничегошеньки не нашёл связанного с Python.
Но на самих сайтах проектов ALSA и PulseAudio нашёл примеры записи и воспроизведения звука (в формате .raw последовательности сэмплов). Примеры, как обычно, не собирающиеся, но слегка повозившись довёл их до ума (до работы). Теперь отталкиваясь от этих кодов можно без большого труда написать интерфейсные модули Python для работы с аудио системами, совместимые по форме вызовов с ossaudiodev ... скажем alsaaudiodev и pulseaudiodev ;-) (см. связка Python + C/C++ - весь инструментарий описан и под рукой). Таким путём можно прийти к независимости аудио возможностей от устройств и, в принципе, переносимости между операционными системами - http://linuxdoc.ru/918-pulseaudio-4.0.html:
5-06-2013
Представлен звуковой сервер PulseAudio 4.0, который выступает в роли посредника между приложениями и различными низкоуровневыми звуковыми подсистемами, абстрагируя работу с оборудованием. Код PulseAudio распространяется в рамках лицензии LGPL 2.1+. Поддерживается работа в Linux, Solaris, FreeBSD, DragonFlyBSD, NetBSD, Mac OS X и Windows.
Не знаю, стану ли я это делать ... и когда ... Но может кого заинтересует такое занятие - выкладываю всё своё файловое дерево работы с аудио, там же есть 2 каталога
alsa и pulse, где работающие теперь уже примеры C-кодов и файлы .hist - журнал выполняемых команд, где всё понятно что и как.
Вложения
audio.tgz
(2.63 МБ) 363 скачивания

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 10 гостей