По моему опыту, потоковая передача видеоданных на RTMP-сервер на самом деле довольно проста на стороне librtmp.Задача состоит в том, чтобы правильно упаковать видео / аудио данные и прочитать их с правильной скоростью.
Предполагается, что вы используете FLV-видеофайлы, при условии, что вы можете правильно изолировать каждый тег в файле и отправить каждый из них, используяодин RTMP_Write
вызов, вам даже не нужно обрабатывать входящие пакеты.
Сложнее понять, как создаются файлы FLV.Официальная спецификация доступна здесь: http://www.adobe.com/devnet/f4v.html
Во-первых, есть заголовок, который состоит из 9 байтов.Этот заголовок не должен отправляться на сервер, а должен быть прочитан только для того, чтобы убедиться, что файл действительно FLV.
Тогда существует поток тегов.Каждый тег имеет 11-байтовый заголовок, который, помимо прочего, содержит тип тега (видео / аудио / метаданные), длину тела и метку времени тега.
Заголовок тега можно описать с помощью этой структуры:
typedef struct __flv_tag {
uint8 type;
uint24_be body_length; /* in bytes, total tag size minus 11 */
uint24_be timestamp; /* milli-seconds */
uint8 timestamp_extended; /* timestamp extension */
uint24_be stream_id; /* reserved, must be "\0\0\0" */
/* body comes next */
} flv_tag;
Длина тела и временная метка представлены в виде 24-разрядных целых чисел с прямым порядком байтов, с дополнительным байтом для расширения временной метки, если необходимо, до 32 бит (это приблизительно в пределах отметки 4 часа).
Как только вы прочитали заголовок тега, вы можете прочитать само тело, поскольку теперь вы знаете его длину (body_length
).
После этого существует 32-разрядное целое число с прямым порядком байтов, содержащее полноедлина тега (11 байт + body_length
).
Вы должны записать заголовок тега + тело + предыдущий размер тега в один RTMP_Write
вызов (иначе он не будет воспроизводиться).
Кроме того, будьте осторожны при отправке пакетов с номинальной частотой кадров видео, иначе воспроизведение сильно пострадает.
Я написал полный демультиплексор FLV-файла как часть моего проекта GPL FLVmeta , который вы можете использовать в качестве справочного.