...
Пример кадра из микшированного файла
Получение информации о дорожках из записанного файла
В сборке 5.2.1049 с помощью инструмента для микширования записанных потоков можно получить информацию о дорожках в файле с несколькими потоками. Для этого необходимо запустить его следующим образом:
Code Block | ||||
---|---|---|---|---|
| ||||
./offline_mixer_tool.sh --show-tracks-info ../records/multi-recorder___test-record.mp4 |
В этом случае инструмент выведет данные в формате JSON. Например, для файла с записью конференции с двумя участниками:
Code Block | ||||
---|---|---|---|---|
| ||||
[
{
"durationInMS": "37282",
"trackEdits": [
{
"endInMs": "14",
"type": "pause",
"startInMs": "0"
},
{
"endInMs": "37282",
"type": "media",
"startInMs": "14"
}
],
"channels": "2",
"trackType": "AUDIO",
"trackId": "1",
"timescale": "44100",
"streamName": "room-09f012-user1-e6ff",
"trackCodec": "mp4a",
"sampleRate": "44100",
"mediaSessionId": "e6ff54e0-1c2a-11ec-90e8-79a2a32f3d9d"
},
{
"durationInMS": "37336",
"trackEdits": [
{
"endInMs": "37336",
"type": "media",
"startInMs": "0"
}
],
"trackType": "VIDEO",
"trackId": "0",
"width": "320",
"timescale": "90000",
"streamName": "room-09f012-user1-e6ff",
"trackCodec": "avc1",
"mediaSessionId": "e6ff54e0-1c2a-11ec-90e8-79a2a32f3d9d",
"height": "240"
},
{
"durationInMS": "39274",
"trackEdits": [
{
"endInMs": "100",
"type": "pause",
"startInMs": "0"
},
{
"endInMs": "21534",
"type": "pause",
"startInMs": "100"
},
{
"endInMs": "39274",
"type": "media",
"startInMs": "21534"
}
],
"channels": "2",
"trackType": "AUDIO",
"trackId": "3",
"timescale": "44100",
"streamName": "room-09f012-user2-f746",
"trackCodec": "mp4a",
"sampleRate": "44100",
"mediaSessionId": "f74633a1-1c2a-11ec-bba5-af8cf43275a8"
},
{
"durationInMS": "39303",
"trackEdits": [
{
"endInMs": "21434",
"type": "pause",
"startInMs": "0"
},
{
"endInMs": "39303",
"type": "media",
"startInMs": "21434"
}
],
"trackType": "VIDEO",
"trackId": "2",
"width": "320",
"timescale": "90000",
"streamName": "room-09f012-user2-f746",
"trackCodec": "avc1",
"mediaSessionId": "f74633a1-1c2a-11ec-bba5-af8cf43275a8",
"height": "240"
}
] |
Здесь:
durationInMS - длительность дорожки в миллисекундах
trackType - тип дорожки: AUDIO или VIDEO
- trackId - идентификатор дорожки
- streamName - имя потока, к которому принадлежит эта дорожка
- mediaSessionId - идентификатор медиассессии потока
- timescale - количество семплов дорожки в секунду
- trackCodec - кодек дорожки
- width, height - размеры картинки для видеодорожки, по первому ключевому кадру
- channels - количество каналов для аудиодорожки
- sampleRate - частота дискретизации для аудиодорожки, совпадает с timescale
- trackEdits - описание временной шкалы дорожки
Временная шкала дорожки описывается как набор отрезков, построенный в соответствии с атомом MP4 'edit lists`, со следующими параметрами:
- startInMs - начало отрезка в миллисекундах относительно начала файла
- endInMs - окончание отрезка в миллисекундах относительно начала файла
- type - тип отрезка: медиаданные (media) или пауза (pause)
По этим данным из файла можно извлечь нужную дорожку при помощи ffmpeg или другого инструмента редактирования MP4 файлов.
Отметим, что, если один и тот же поток был добавлен в рекордер, затем удален из рекордера, и потом снова добавлен, он будет представлен в файле различными дорожками с разными идентификаторами trackId, например:
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
[
{
"durationInMS": "78978",
"trackEdits": [
{
"endInMs": "63050",
"type": "pause",
"startInMs": "0"
},
{
"endInMs": "78978",
"type": "media",
"startInMs": "63050"
}
],
"channels": "2",
"trackType": "AUDIO",
"trackId": "3",
"timescale": "44100",
"streamName": "test",
"trackCodec": "mp4a",
"sampleRate": "44100",
"mediaSessionId": "fbbf5b50-20ee-11ec-bf06-ef6ec6048b2c"
},
{
"durationInMS": "39708",
"trackEdits": [
{
"endInMs": "23150",
"type": "media",
"startInMs": "0"
}
],
"channels": "2",
"trackType": "AUDIO",
"trackId": "1",
"timescale": "44100",
"streamName": "test",
"trackCodec": "mp4a",
"sampleRate": "44100",
"mediaSessionId": "c7bc1460-20ee-11ec-bf06-ef6ec6048b2c"
},
{
"durationInMS": "39791",
"trackEdits": [
{
"endInMs": "23233",
"type": "media",
"startInMs": "0"
}
],
"trackType": "VIDEO",
"trackId": "0",
"width": "640",
"timescale": "90000",
"streamName": "test",
"trackCodec": "avc1",
"mediaSessionId": "c7bc1460-20ee-11ec-bf06-ef6ec6048b2c",
"height": "360"
},
{
"durationInMS": "63050",
"trackEdits": [
{
"endInMs": "39791",
"type": "pause",
"startInMs": "0"
},
{
"endInMs": "50191",
"type": "media",
"startInMs": "39791"
}
],
"trackType": "VIDEO",
"trackId": "2",
"width": "640",
"timescale": "90000",
"streamName": "test",
"trackCodec": "avc1",
"mediaSessionId": "ed3ebda0-20ee-11ec-bf06-ef6ec6048b2c",
"height": "360"
}
] |
Скрипт для обработки записанных файлов
...