Содержание

Carl

Audio Channel Manipulation

Пример G.711 в mka

По описанию тут https://lists.libav.org/pipermail/libav-user/2009-September/003809.html

Файл 32.mp3 взят отсюда http://www.kozco.com/tech/soundtests.html

Преобразование:

$ ffmpeg -i 32.mp3 -acodec pcm_alaw -ac 1 -ar 8000 -ab 40000 32.mka
ffmpeg version 3.2.5-1~bpo8+1 Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 4.9.2 (Debian 4.9.2-10)
  configuration: --prefix=/usr --extra-version='1~bpo8+1' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --disable-libebur128 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
  libavutil      55. 34.101 / 55. 34.101
  libavcodec     57. 64.101 / 57. 64.101
  libavformat    57. 56.101 / 57. 56.101
  libavdevice    57.  1.100 / 57.  1.100
  libavfilter     6. 65.100 /  6. 65.100
  libavresample   3.  1.  0 /  3.  1.  0
  libswscale      4.  2.100 /  4.  2.100
  libswresample   2.  3.100 /  2.  3.100
  libpostproc    54.  1.100 / 54.  1.100
Input #0, mp3, from '32.mp3':
  Duration: 00:00:32.05, start: 0.025057, bitrate: 128 kb/s
    Stream #0:0: Audio: mp3, 44100 Hz, mono, s16p, 128 kb/s
    Metadata:
      encoder         : LAME3.98r
Output #0, matroska, to '32.mka':
  Metadata:
    encoder         : Lavf57.56.101
    Stream #0:0: Audio: pcm_alaw ([6][0][0][0] / 0x0006), 8000 Hz, mono, s16, 64 kb/s
    Metadata:
      encoder         : Lavc57.64.101 pcm_alaw
Stream mapping:
  Stream #0:0 -> #0:0 (mp3 (native) -> pcm_alaw (native))
Press [q] to stop, [?] for help
size=     259kB time=00:00:32.00 bitrate=  66.4kbits/s speed= 790x    
video:0kB audio:250kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 3.681250%

Выдача MediaInfo:

General
Unique ID                                : 17719613707446459289158434415458592130 (0xD54AC6826989681F1A8D31D845F2582)
Complete name                            : C:\zorin\Fedor\CaRL\my-tests\32.mka
Format                                   : Matroska
Format version                           : Version 4 / Version 2
File size                                : 259 KiB
Duration                                 : 32 s 0 ms
Overall bit rate                         : 66.4 kb/s
Writing application                      : Lavf57.56.101
Writing library                          : Lavf57.56.101
ErrorDetectionType                       : Per level 1

Audio
ID                                       : 1
Format                                   : ADPCM
Format profile                           : A-Law
Codec ID                                 : A_MS/ACM / 6
Codec ID/Hint                            : CCITT
Duration                                 : 32 s 0 ms
Bit rate                                 : 64.0 kb/s
Channel(s)                               : 1 channel
Sampling rate                            : 8 000 Hz
Bit depth                                : 8 bits / 8 bits
Stream size                              : 250 KiB (96%)
Writing library                          : Lavc57.64.101 pcm_alaw
Default                                  : Yes
Forced                                   : No

Воспроизведение нескольких аудио-дорожек

Представление кодеков

в matroska

Описание структуры WAVEFORMATEX

typedef struct {
  WORD  wFormatTag;
  WORD  nChannels;
  DWORD nSamplesPerSec;
  DWORD nAvgBytesPerSec;
  WORD  nBlockAlign;
  WORD  wBitsPerSample;
  WORD  cbSize;
} WAVEFORMATEX;

wFormatTag - A complete list of format tags can be found in the Mmreg.h header file

#define  WAVE_FORMAT_ALAW                       0x0006 /* Microsoft Corporation */
#define  WAVE_FORMAT_MULAW                      0x0007 /* Microsoft Corporation */
#define  WAVE_FORMAT_G723_ADPCM                 0x0014 /* Antex Electronics Corporation */
#define  WAVE_FORMAT_G721_ADPCM                 0x0040 /* Antex Electronics Corporation */
#define  WAVE_FORMAT_G728_CELP                  0x0041 /* Antex Electronics Corporation */
#define  WAVE_FORMAT_G726_ADPCM                 0x0064 /* APICOM */
#define  WAVE_FORMAT_G722_ADPCM                 0x0065 /* APICOM */
#define  WAVE_FORMAT_G729A                      0x0083 /* AT&T Labs, Inc. */
#define  WAVE_FORMAT_DF_G726                    0x0085 /* DataFusion Systems (Pty) (Ltd) */
#define  WAVE_FORMAT_DF_GSM610                  0x0086 /* DataFusion Systems (Pty) (Ltd) */

Opus

RTP

RTP Timestamp

RTP Payload Type

Типы определены тут: Профили данных RTP

Пример создания KaxSimpleBlock

https://github.com/neolynx/tvdaemon/blob/master/lib/Matroska.cpp

  KaxSimpleBlock &simpleblock = AddNewChild<KaxSimpleBlock>( *cluster );
  //KaxSimpleBlock *simpleblock = new KaxSimpleBlock( );
  simpleblock.SetParent( *cluster );
  simpleblock.AddFrame( *track, ts * timecode_scale, *frame, LACING_EBML );
  simpleblock.SetKeyframe( type == DVB_MPEG_ES_FRAME_I );
  simpleblock.SetDiscardable( type == DVB_MPEG_ES_FRAME_B );

  //KaxBlockBlob *blob = new KaxBlockBlob( BLOCK_BLOB_ALWAYS_SIMPLE );
  //blob->SetParent( *cluster );
  //blob->AddFrameAuto( *track, ts * timecode_scale, *frame, LACING_EBML );
  ////blob->SetBlockDuration( 50 * timecode_scale );
  //cluster->AddBlockBlob( blob );

  //cues.AddBlockBlob( simpleblock );
  //WriteSegment( );

SIP

Библиотеки

FFmpeg