У меня есть устройство Android, которое будет отправлять необработанный живой поток NAL H264 AnnexB, например [0,0,0,1,103,...][0,0,0,104,...][0,0,0,101,.. .][0,0,0,1,65,...][0,0,0,1,65,...] и попробуйте мультиплексировать их в контейнер flv и отправить в nginx-с использованием модуля rtmp libavформат ffmpeg.
Если я сохраню полученный прямой эфир в локальный файл, скажем, test.h264. Я могу мультиплексировать его на сервер, используя команду ffmpeg «ffmpeg -i test.h264 -f flv rtmp://my/server/url». Но я не знаю, как вести прямую трансляцию.
Я заметил, что в ffmpeg/libavformat/avc.c есть две функции, которые, кажется, достигают моей цели. Но я не уверен.
Вот код ffmpeg
int ff_avc_parse_nal_units(AVIOContext *pb, const uint8_t *buf_in, int size)
{
const uint8_t *p = buf_in;
const uint8_t *end = p + size;
const uint8_t *nal_start, *nal_end;
size = 0;
nal_start = ff_avc_find_startcode(p, end);
for (;;) {
while (nal_start < end && !*(nal_start++));
if (nal_start == end)
break;
nal_end = ff_avc_find_startcode(nal_start, end);
avio_wb32(pb, nal_end - nal_start);
avio_write(pb, nal_start, nal_end - nal_start);
size += 4 + nal_end - nal_start;
nal_start = nal_end;
}
return size;
}
int ff_avc_parse_nal_units_buf(const uint8_t *buf_in, uint8_t **buf, int *size)
{
AVIOContext *pb;
int ret = avio_open_dyn_buf(&pb);
if(ret < 0)
return ret;
ff_avc_parse_nal_units(pb, buf_in, *size);
av_freep(buf);
*size = avio_close_dyn_buf(pb, buf);
return 0;
}
Любой полезный ответ приветствуется.
Благодарю вас!