Скорость открытия экрана во время воспроизведения видео является очень важным показателем качества воспроизведения. Если скорость открытия экрана видео слишком медленная, пользователь может потерять терпение и прекратить просмотр. Если скорость видео открывается достаточно быстро, это может даже принести бизнес-пользу. ByteDance однажды привела данные: для некоторых моделей мобильных телефонов Android время воспроизведения первого кадра было оптимизировано в среднем со 170 мс до 100 мс, что составляет примерно 0,6 %. время воспроизведения у пользователей увеличилось.
Для измерения скорости открытия экрана во время воспроизведения видео мы можем использовать следующие показатели:
Чтобы разобрать процесс запроса и воспроизведения видео плеером, можно условно разделить его на следующие этапы:
Давайте объединим его с плеером с открытым исходным кодом. IJKPlayer[1],На этих этапах давайте поговорим об идее изоптимизации мгновенного открытия видео.
Говоря об оптимизации, нам сначала нужно посмотреть, как выглядит бизнес-сценарий при входе в комнату прямой трансляции на клиенте? Вообще говоря, на странице списка прямых трансляций нажмите на карточку прямой трансляции (Ячейка), чтобы войти в комнату прямой трансляции. Как происходит поток данных во время этого процесса? Самый простой способ — щелкнуть карточку прямой трансляции со страницы списка прямых трансляций в комнату прямой трансляции, запросить адрес прямой трансляции и различную информацию о комнате прямой трансляции (информацию о якоре, информацию чата, информацию о лайках, информацию о подарках и т. д.) из сервер и получите. После прибытия по адресу прямого потока передайте его проигрывателю для воспроизведения.
существоватьэтотпроцесссередина,Мы видим, что игрок должен дождаться входа в комнату прямой трансляции и просить адрес прямой трансляции, прежде чем он сможет начать воспроизведение.,этот На самом деле время можно перенестииз:мы можемсуществует страница со списком прямых трансляций, где можно получить адрес прямой трансляции каждой отдельной комнаты прямой трансляции. Соответствующий,существуютпередайте его непосредственно при входе в комнату прямой трансляции,Таким образом, как только вы войдете в проигрыватель комнаты прямой трансляции, вы сможете начать играть с адресом прямой трансляции.,Экономит время с сервера просить адрес прямой трансляции (хотя этого времени может быть не так много).
Даже мы можем найти в Когда страница со списком прямых трансляций переместится наиндивидуальный Карта позволяет игроку хранить адрес прямой трансляции.предварительная загрузка,При входе в комнату прямой трансляции экран будет отображаться напрямую.
Бизнес-сторона заранее получает адрес потока.
Кроме того, бизнес-клиент также предоставляет найти в Перед входом в комнату прямой трансляциипроходить HTTPDNS выбрать тот, у которого лучшие условия сети CDN узел,существуют При входе в комнату прямой трансляции, вытягивайте прямую трансляцию из лучшего изузел, а затем оптимизируйте загрузку сети по времени.,Ускорьте рендеринг первого экрана.
традиционный VID Режим воспроизведения, при воспроизведении видео клиентский проигрыватель получает ВИД, вам все равно нужно зайти на сервер, чтобы запросить видео URL чтобы фактически начать воспроизведение,Это добавляет еще одно время ожидания,Заниженное открытие видеоскорость.еслибудет видео URL инкапсулированный в model середина Дайте напрямуюигрокСразу Можетсохранятьодин Второсортныйпросить URL Пришло время.
В настоящее время большинство компаний, занимающихся потреблением, проводят видеоролики, UI Все интерактивные формы расположены в полноэкранном режиме вверх и вниз, как в Douyin. Обычный способ дескриптора — дождаться окончания слайда при загрузке следующего индивидуального плеера для переключения видео.,Здесь вообще возможнооптимизациядля:существуют Проведите пальцем, чтобы начать загрузку следующей индивидуальной ямы из плеера, чтобы начать воспроизведение видео。но,Здесь необходимо, чтобы плеер имел возможность асинхронно загружаться.,В противном случае это может привести к UI Нитка застряла. На этой основе, в сочетании с повторным использованием экземпляра проигрывателя, предварительной загрузкой и оптимизацией предварительного рендеринга, можно значительно улучшить процесс открытия видео.
При реализации короткого видеобизнеса мы обычно загружаем изображение обложки первого кадра видео в качестве изображения-заполнителя и скрываем изображение обложки, когда игрок завершает рендеринг первого кадра видео, чтобы завершить соединение изображения и дать пользователю приятный опыт.
Когда первый кадр видео хорошо оптимизирован, изображение обложки может стать бесполезной тратой и бременем. Например, когда мы можем быстро использовать проигрыватель для рендеринга первого кадра пит-видео посредством предварительной загрузки и предварительного рендеринга, загрузка соответствующего изображения обложки в это время не только отнимает полосу пропускания, но и тратит трафик.
В это время разрешение обложки можно понизить. Например, исходное изображение обложки 720P можно понизить до 540P. Мы даже можем отдать приоритет предварительной загрузке и предварительному рендерингу и загружать изображение обложки только тогда, когда ситуация прояснится.
DNS Анализ — это первый шаг в сетевых запросах, когда мы их используем. FFmpeg Реализованный плеер ffplay всего DNS Все запросы на анализ FFmpeg вызов getaddrinfo
метод получения.
Как мы подсчитываем потребление времени DNS в FFmpeg?
Можно найти в libavformat/tcp.c
в файле tcp_open
В методе статистика рассчитывается следующим образом:
int64_t start = av_gettime();
if (!hostname[0])
ret = getaddrinfo(NULL, portstr, &hints, &ai);
else
ret = getaddrinfo(hostname, portstr, &hints, &ai);
int64_t end = av_gettime();
Если кэша нет, фактические измерения показали, что разрешение доменного имени займет не менее 300 мс, а иногда и больше. Если срабатывает локальный кэш, время очень короткое, около нескольких мс, и его можно игнорировать. Эффективное время кэша — это время запроса пакета DNS-запроса. Для каждого доменного имени будет установлено соответствующее время TTL кэша. Это время является неопределенным. В зависимости от конфигурации каждого доменного имени некоторые из них длиннее, некоторые короче. поэтому неопределенность относительно велика.
Почему DNS-запросы выполняются так долго? Обычно подразумевается, что запрос DNS-пакета сначала будет искаться на DNS-сервере ближайшего оператора. Если DNS-сервера нет, он будет рекурсивно направляться на корневой сервер доменных имен, что занимает много времени. Как правило, если запрос делается один раз, на этих серверах будут кэши, а другие люди будут постоянно запрашивать и будут продолжать обновляться, поэтому следующий запрос будет быстрее.
в тестировании DNS В процессе запроса иногда при перехвате пакетов обнаруживается, что будет запрошен каждый запрос. A
и AAAA
Запрос, это запрос IPv6 адрес, но поскольку наше доменное имя не IPv6 адрес, поэтому вам придется каждый раз возвращаться к корневому серверу доменных имен для запроса. зачем просить IPV6 адрес, потому что FFmpeg В конфигурации DNS Запрос настроен следующим образом:
hints.ai_family = AF_UNSPEC;
это совместимо IPv4 и IPv6 конфигурация, если она изменена на AF_INET
,Тогда не будет AAAA
Пакет запросов включен. В результате реальных испытаний было обнаружено, что если только IPv4 запросы, даже впервые, будут 100ms Закончив внутри, спинка будет короче. Это точка оптимизации, но следует учитывать будущую совместимость. IPv6 проблема.
DNS Анализ всегда был основной проблемой при оптимизации сети. Его решение занимает слишком много времени и у небольших операторов. DNS угнатьпроблема.использовать HTTPDNS это оптимизация DNS Часто используемые решения для анализа,но HTTPDNS В некоторых областях также могут быть проблемы с точностью, и все аспекты могут быть рассмотрены. HTTPDNS и LocalDNS В сочетании с программой для повышения скорости и точности анализирования. Общая идея заключается в том, что приложение запускатьизвремя заранееанализироватьнасобратитесь к Конечноиздоменное имя,Потому что доменное имя для потока фиксировано из нескольких человек.,такнад Все можно сделать сначалакэшсуществовать App местный. Затем на основе времени достоверности, возвращаемого во время каждого разрешения доменного имени, кэш будет анализироваться и обновляться после истечения срока действия. Что касается DNS Проблема с угоном, если LocalDNS разобранный IP Если его нельзя использовать нормально или задержка слишком велика, переключитесь на HTTPDNS Повторная обработка. Это гарантирует, что каждый раз, когда вы действительно получаете поток, DNS Время разбора почти 0, поскольку пул кэша может регулярно обновляться, поэтому DNS Все они поступают из пула кэша.
Итак, как реализовать HTTPDNS?
Вариант 1: Прямое IP-соединение.
Предположим, что исходный прямой эфир URL да:http://www.example.com/abc.flv
。Предположим из HTTPDNS услуга получена www.example.com
этот Host Соответствующий IP Да: 192.168.1.1. Затем после обработки URL да:http://192.168.1.1/abc.mp4
。еслипрямойиспользоватьэтот URL инициировать HTTP просить,иметь может быть успешным в некоторых случаях, но не во многих. Если это IP машины только развернуты www.example.com
Соответствующий сервис, вы можете анализировать, если у вас есть индивидуальное доменное имя из сервиса, CDN узел просто невозможно правильно изанализировать. в этот раз целомнуждатьсянастраивать HTTP Запрошено header внутри Host поле.
AVDictionary **dict = ffplayer_get_opt_dict(ffplayer, opt_category);
av_dict_set(dict, "headers", "Host: www.example.com", 0);
нодаэтотпланиметьдваиндивидуальныйвопрос:
1) Если сервер использует метод перехода 302/307 для планирования ресурсов, возникнут проблемы с прямым IP-соединением.
еслисуществовать Проблемы клиентапросить(нравиться:http://www.example.com/abc.flv
)изкогда,Сервердапроходить 302/307 Планирование Способ Вернуться к ресурсам прямых трансляцийизреальный адрес(нравиться:http://www.realservice.com/abc.flv
),В это время IP Будут проблемы с прямым подключением. Потому что клиент не знает логику перехода, но клиент знает IP Прямое подключение с помощью www.example.com
Прямое соединение получено IP и заменен на http://192.168.1.1/abc.mp4
,этотпроситьдойти до сервера,На сервере нет ресурсов,приведет к ошибке. Эта ситуация может помешать серверу выдать 302 Метод прыжка, но он не универсален и оставит скрытые опасности в будущем. Поэтому общий подход заключается в создании уровня службы управления широковещательной передачей. Клиент запрашивает службу управления широковещательной передачей для получения фактического адреса широковещательной передачи и различной другой информации, а затем продолжает работу. IP Прямое подключение не является проблемой.
Достаточно хорошоссылка:iOS 302 Ожидание перенаправления бизнес-сценария IP Описание решения для прямого подключения[2]。
2) При использовании HTTPS возникнут проблемы с прямым подключением по IP.
Это решение используется HTTPS время, оно потерпит неудачу. потому что HTTPS В процессе проверки сертификата будет domain Несоответствие приводит к SSL/TLS Рукопожатие оказалось неудачным. Ссылка на план на данный момент HTTPS (включая SNI) бизнес-сценарий IP Описание решения для прямого подключения[3] и Бизнес-сценарий iOS HTTPS SNI Описание решения для прямого IP-соединения[4]。
Вариант 2. Замените реализацию DNS FFmpeg.
Другой вариант - заменить оригинал. DNS Реализация парсинга. существовать FFmpeg Замените его немедленно tcp.c
середина getaddreinfo
Метод, этот метод является фактическим анализом DNS метод, например следующий код:
if (my_getaddreinfo) {
ret = my_getaddreinfo(hostname, portstr, &hints, &ai);
} else {
ret = getaddrinfo(hostname, portstr, &hints, &ai);
}
существовать my_getaddreinfo
середина можно реализовать самостоятельно HTTPDNS логика синтаксического анализа для оптимизации оригинала DNS скорость разбора.
Вообще говоря, после оптимизации DNS время первого экрана прямой трансляции может быть сокращено примерно на 100–300 мс. Особенно в случае многих первоначальных открытий или истечения срока действия локального кэша DNS это может иметь хороший эффект оптимизации.
существоватьделатьиспользовать HTTP DNS Делать IP При прямом подключении может случиться так, что анализируемый IP ситуация неудачи. например:
улучшить HTTP DNS изиметьэффективность,Может ДелатьодининдивидуальныйМодуль опроса,ссылка HTTP DNS IP время истечения срока действия для периодического опроса и кэширования новых IP Держи так IP эффективность, а также работу с различными сетевыми коммутаторами или внутренними обновлениями обновлений. IP ситуация.
TCP Время установить связьсуществовать Вотвызов Socket из connect Метод требует много времени для построения подключения, это метод блокировки, он будет продолжать ждать TCP из Три рукопожатия были завершены. Это напрямую отражает мнение клиента CDN Задержка серверного узлаизверно, фактические измерения существуют. целомиз WIFI Отнимает много времени в сетевой среде. 50ms В течение этого времени он отражает состояние сети клиента или состояние сети клиента.
Для подсчета потраченного времени можно найти в libavformat/tcp.c в файле tcp_open
В методе статистика рассчитывается следующим образом:
int64_t start = av_gettime();
if ((ret = ff_listen_connect(fd, cur_ai->ai_addr, cur_ai->ai_addrlen,
s->open_timeout / 1000, h, !!cur_ai->ai_next)) < 0) {
if (ret == AVERROR_EXIT)
goto fail1;
else
goto fail;
}
int64_t end = av_gettime();
TCP соединять Кропотливыйоптимизацияизкосмический мастерхотетьдаОптимизация онлайн-ссылок,В основном ограничено Втрииндивидуальный Факторы, влияющие:Условия собственной сети пользователя
、Влияние на пограничные каналы между пользователем и CDN
、CDN Edge узел стабильность
。потому чтодля Условия сети пользователяиметьотносительно большойизнеуправляемость,Таким образом, оптимизация в основном будет существовать, за которой последуют два отдельных пункта. Его можно комбинировать с городом пользователя и условиями оператора.,объединенные одновременнооптимизация Сервериз CDN Система планирования в сочетании с HTTPDNS Назначайте пользователям лучшие ссылки (например, доступ поблизости), чтобы обеспечить установить связь。
В целом мы упомянули об установлении TCP, соединении процесса трехэтапного установления связи и отключении процесса четырехэтапного установления связи, как показано на рисунке ниже:
Трехстороннее рукопожатие TCP и четырехсторонняя волна
TFO(TCP Fast Open) используется для ускорения непрерывного TCP взаимодействие данных TCP Расширение протокола предназначено для TCP Процесс рукопожатия является упрощением. Ее принцип: существовать TCP Процесс трехстороннего рукопожатия середина, когда пользователь заходит в первый раз Server когда, отправь SYN Пакет, Сервер По словам пользователя IP генерировать Файл cookie (зашифрованный) и связанный с SYN-ACK Отправить обратно вместе Клиент; когда; Client При последующем повторном подключении существование SYN сумка для переноски TCP печенье, если Server проверка легальна, тогда существует ответы пользователей ACK Вы можете отправить данные заранее; в противном случае выполните обычное трехстороннее рукопожатие.
TFO Зависит от Google В 2011 Год диссертации TCP Fast Open серединапредлагать,IPV4 из TFO Уже объединено Linux Kernel Mainline,Client Версия ядра 3.6,Server Версия ядра 3.7。
Google результаты исследований TCP Трехстороннее рукопожатие является важной частью времени задержки страницы, поэтому они предложили TFO:существовать TCP Обмен данными во время рукопожатия,такможно уменьшитьодин Второсортный РТТ. По данным испытаний, ТФО можно уменьшить 15% из HTTP Задержка передачи, средняя экономия времени загрузки полной страницы 10%, до 40%。
Блок-схема TCP Fast Open выглядит следующим образом:
Процесс быстрого открытия TCP
Requesting Fast Open Cookie in connection 1:
TCP A (Client) TCP B (Server)
______________ ______________
CLOSED LISTEN
#1 SYN-SENT ----- <SYN,CookieOpt=NIL> ----------> SYN-RCVD
#2 ESTABLISHED <---- <SYN,ACK,CookieOpt=C> ---------- SYN-RCVD
(caches cookie C)
Performing TCP Fast Open in connection 2:
TCP A (Client) TCP B (Server)
______________ ______________
CLOSED LISTEN
#1 SYN-SENT ----- <SYN=x,CookieOpt=C,DATA_A> ----> SYN-RCVD
#2 ESTABLISHED <---- <SYN=y,ACK=x+len(DATA_A)+1> ---- SYN-RCVD
#3 ESTABLISHED <---- <ACK=x+len(DATA_A)+1,DATA_B>---- SYN-RCVD
#4 ESTABLISHED ----- <ACK=y+1>--------------------> ESTABLISHED
#5 ESTABLISHED --- <ACK=y+len(DATA_B)+1>----------> ESTABLISHED
Процесс ТФО выглядит следующим образом:
При отключении связи, после повторного подключения процесс выглядит следующим образом:
Статус удаления файлов cookie
Учредил TFO подключено, но не завершено TCP соединятьизпроситьсуществовать Server конец называется pending TFO соединение, когда pending изоединять превышает верхний предел, Сервер закроется TFO, последующие транзакции будут обрабатываться как обычное трехстороннее рукопожатие.
Если у кого-то есть TFO из SYN просить Если существование не получит ответа в течение определенного периода времени, пользователь перезапустит процесс. SYN запрос без каких-либо других данных.
ссылка:
существоватьсетьсоединятьслой Делатьодининдивидуальныйкэшмодуль,этоткэш будет IP для key кэштокиз socket совместно работать и настраивать таймаут. Таким образом, интерфейс может быть предоставлен бизнес-уровне. TCP Предварительно подключено.
Например, сцена скольжения вверх и вниз в комнате прямой трансляции.,Бизнес-уровень может, правда, следующей отдельной живой комнатой из Stream Делать пресоединять,предварительносоединятьизпроцессдаделатьиспользоватьдоменное имя Делать HTTPDNS или LocalDNS получать IP Приходите в Делатьсоединять. Когда трафик действительно начинает получаться, сетевой уровень соответствии с HTTPDNS или ВОЗ LocalDNS получатьиз IP Обнаружил, что уже есть socket соединятьизкэш,Просто повторно используйтеэтотсоединять,Это экономит время на повторное установление соединения.
для увеличения скорости предварительного отбора середина,Вы также можете использовать доменное имя Делать с высокой частотой и продолжать резервировать его соединяя,Когда время предварительного соединять истечет, попробуйте еще раз. Следует отметить, что из,Когда происходит переключение сети,Необходимо обновить пул пресоединятькэш,Сравниватьнравитьсяот WIFI Вырезать до 4G Соответствующим серверным узлом является необходимость переключения из.
существоватькороткое видео сцены вверх и внизсередина,иногда встреченные пользователи быстро выскальзывают из ситуации, в это время мы действительно возвращаемся из видео Делать предсоединять, предварительная Вместо этого загрузка может иметь неприятные последствия. Потому что дляпредварительная Загруженное видео было быстро удалено пользователем и не использовалось, что привело к потере трафика и зависит. от Впредварительная загрузка видеоданных также будет занимать полосу пропускания первого кадра других видео, которые будут загружены позже, что приведет к появлению черного экрана.
Следовательно, когда обнаруживается, что пользователь проводит быстро, пользователь может быстро прервать функцию предварительного пролистывания. сеть.
HTTP Время ответа — это момент, когда клиент инициирует HTTP Request запросить, а затем подождать HTTP ответиз Header Возврат этой детали требует времени. Прямая трансляция HTTP-FLV Соглашение также является HTTP request После того, как клиент инициирует запрос, сначала его выполняет сервер. HTTP возврат заголовка изответ, без аудио и видео потока из данных, код ответа, если он есть 200, что указывает на то, что видеопоток сохранен, а затем начинают загружаться видеоданные произношения. HTTP Время отклика очень важно, оно напрямую отражает CDN Сервисный узел обрабатывает возможности Запрошено. это связано с CDN узел, имеет ли хакэш этот поток, может отключить, если существуетпросить хакэш этот поток, узел будет напрямую отвечать клиенту, в этот раз целомтакжесуществовать 50ms Вокруг, не более 200 мс. Если хакэша нет, узел вернется к исходной станции прямой трансляции, чтобы получить прямой поток, что займет много времени, по крайней мере, существования. 200ms Выше в большинстве случаев время будет длиннее, поэтому это отражает, является ли эта прямая трансляция холодной или горячей,и CDN узелизкэшжизньсередина Состояние。
Если тебе нужно посчитать, Можно найти в libavformat/http.c в файле http_open
метод:
int64_t start = av_gettime();
ret = http_open_cnx(h, options);
int64_t end = av_gettime();
в целом CDN Стратегия команды изкэш середина связана с доступом к ресурсам из URL иметьзакрывать。еслижизньсередина Стратегияда URL Полное совпадение, тогда мы должны сделать все возможное, чтобы обеспечить URL изменьше изменчивости。Сравниватьнравиться:Попробуй несуществовать URL Параметр из середина содержит случайное значение, что приведет к CDN кэшжизньсерединаотклонить,Это приводит к постоянному возврату к источнику,Это увеличит время, необходимое для доступа к ресурсам. Конечно, это теряет некоторую гибкость.
CDN Фактически, могут быть предусмотрены некоторые стратегии конфигурации, такие как: соответствии Имя домена можно настроить, используя политику кэш-команды середина для игнорирования определенных параметров. Это обеспечит определенную степень гибкости.
С клиентом все в порядке и CDN сотрудничать для достижения CDN Крайний узел жизни середина скорости из закопанной точки. в Весь метод Делать заключается в том, чтобы позволить CDN Производительсуществовать HTTP Запрошено response header Он содержит поле «середина края узла», и клиент существует получает поле «анализироватьэтот», чтобы понять точку захоронения.
также,Вы также можете отслеживать популярный контент на сервере.,верно Популярныйиз Ресурсы реализованыподогреть,Пройдите как можно дальше до края узла,Тем самым увеличивая скорость ребра.
существоватьигрокпроситькороткое видеочас,в Мы инициируем это первыми Get проситьполучитькороткое видеоиз длины файла, а затем видеоиз соответствии с Длина файла для получения содержимого данных.
Если мы получим короткое заранее видеоиз Длина файла,проходитьнастраивать HTTP Запрошено Range Вы можете сохранить в первый раз Get просить Приходитьоптимизацияпервый кадрпродолжительность。
Когда мы делаем бизнес в прямом эфире,Плееру нужен индивидуальный плеер для воспроизведения видеопотока,Когда индивидуальный плеер поддерживает видеоформат, он может быть разных видов.,Вот в чем проблема. Транслируется отдельное видео,В плеере непонятно в каком формате этот видеопоток,Поэтому ему необходимо обнаружить определенное количество информации о видеопотоке.,определить его формат и решить, что с ним делать. Это означает, что существует индивидуальный процесс предварительного считывания данных и индивидуальный процесс анализа перед воспроизведением видео. Но для нашего бизнеса в прямом эфире,насизпоставлятьизпрямая трансляцияпланв все фиксировано, что означает потоковое видео из формата целомдазафиксированныйиз,такодиннекоторыйданныепредварительночитатьианализироватьпроцессда Незачемхотетьиз。Формат протокола прямой трансляции существует в зависимости от случая.,Просто прочитайте исправленную информацию, чтобы начать играть. Это сокращает время предварительного считывания и анализа данных.,Это позволяет игроку быстрее выйти с главного экрана.
Обнаружение звука и видео
база FFmpeg Реализованный плеер,существовать Воспроизвести видеочасгородвызовприезжатьодининдивидуальный avformat_find_stream_info
(libavformat/utils.c) Функция, функция этой функции заключается в считывании данных кодового потока определенной длины для анализа основной информации кодового потока, для видео середина каждого отдельного медиапотока из AVStream Структура заполняется соответствующим образом.данные。этотфункциясередина Делатьнайти правильныйиздекодированиеустройство、Откройте инструмент декодирования、Чтение определенных данных аудио- и видеокадров、пытатьсядекодирование Аудио и видеорамка В ожидании работы,по сутинад Это сделанодекодированиеизвсеиндивидуальныйпроцесс。В это времяодининдивидуальныйсинхронныйвызов,существуют Я не знаю формата видеоданных и хочу лучшей совместимости.,Этот процесс занимает относительно много времени из-за,Это повлияет на то, что первый экран плеера откроется мгновенно.
Можно найти в ijkplayer изпроектсередина ff_ffplay.c в файле read_thread
Метод подсчитывает затраты времени:
int64_t start = av_gettime();
avformat_find_stream_info(ic, opts);
int64_t end = av_gettime();
существоватьвнешний Можетпроходитьнастраивать probesize
и analyzeduration
Два отдельных параметра используются для управления размером данных, считываемых функцией, и продолжительность анализа относительно невелика, чтобы уменьшить значение. avformat_find_stream_info
из требует времени, поэтому оптимизация первый экран плеера открывается за считанные секунды. Однако следует отметить, что если эти два параметра слишком малы, предварительно считанных данных может быть недостаточно, и информация кодового потока не может быть выведена. В результате происходит сбой воспроизведения, нет звука и видео. Поэтому сервер выполняет стандартное перекодирование формата видео, чтобы определить формат видео и затем его вычислить. avformat_find_stream_info
Анализ минимальной совместимой информации о потоке кода. probesize
и analyzeduration
,Это может обеспечить успешность воспроизведения и максимально увеличить площадь первого экрана за считанные секунды.
существуют Мы можем контролировать формат видео, и после того, как он достигнет стандартизации, мы можем напрямую его модифицировать. avformat_find_stream_info
логика реализации,Игла верно Формат видео Делатьоптимизация,После оптимизации мгновенно открывается первый экран.
существовать FFmpeg серединаиз utils.c
в реализация функции файла серединиметь одну строку кода int fps_analyze_framecount = 20;
,Эта строка кода, вероятно, используется для:,Если внешние настройки не имеют дополнительных настроек, это значение,Что Что? avformat_find_stream_info
Нужно получить как минимум 20 Кадрировать видеоданные, это занимает много времени для первого экрана, верно В целом Всехотеть 1s о Более того, прямая трансляция также требует выполнения в режиме реального времени, поэтому не нужно брать как минимум. 20 рамка.Вы можете попробовать инициализацию значения Воляэтот для 0 Посмотрите эффект. существуют разработки середина, мы можем убрать это условие для достижения оптимизации:
av_dict_set_int(&ffp->format_opts, "fpsprobesize", 0, 0);
так,avformat_find_stream_info
Затраты времени могут быть сокращены до 100ms В пределах.
Даже мы можем пойти дальше и напрямую удалить avformat_find_stream_info
этотпроцесс,Настроитьнадстановитьсядекодирование Инициализация среды。Видеть:VLC Оптимизировать (1) avformat_find_stream_info Уменьшение задержки интерфейса[8] и Замена FFmpeg avformat_find_stream_info[9]。
верно avformat_find_stream_info
Код анализа,Достаточно хорошопосмотри сюда:Простой анализ исходного кода FFmpeg: avformat_find_stream_info()[10]。
существуют сеть плееров сцена по требованию выйти из строя просить MP4 Сначала необходимо получить видеоданные. moov box, анализировать можно начать загрузку и воспроизведение только после получения файла о кодировке, частоте кадров и другой информации. если MP4 из moov box быть освобожденнымсуществоватьконец файла,В этой ситуации проигрыватель успешно загрузит полный индивидуальный файл и успешно воспроизведет это видео. верно В такого рода видео,Нам бы лучше иметь возможность существовать на сервере Воляиц, перекодируя,Поле «Воля moov» перемещается в позицию рядом с заголовком файла.,гарантироватьигроксуществовать Проволокапроситьчас Можно играть быстрее。Сравниватьнравиться FFmpeg Для работы можно использовать следующие команды:
ffmpeg -i bad.mp4 -movflags faststart good.mp4
Мы тоже Можно найти в Сервер Проблемабизнесслойданныечас Сразу带上прямая трансляция流или ВОЗвидеоизинкапсуляцияикодирование Взаимнозакрыватьинформация,На основе этой информации,мы можемПропустите этап Обнаружение звука и видео и создайте декодирование заранее.。
Сравниватьнравиться,существоватьпрямая трансляция场景Сервер Может Проблема Видеозаголовок (включая SPS、PPS、VPS и другие данные) клиент заранее инициализирует декодер.
игрок Можетсоздаватьодининдивидуальныйдекодирование пула повторного использования,Когда параметры декодирования согласованы,Устройство декодирования можно использовать повторно. Таким образом,Информация, относящаяся к кодовому потоку, также может быть прозрачно передана проигрывателю.,Позвольте проигрывателю заранее создать декодирование, чтобы сократить время рендеринга первого кадра проигрывателя.
Устройство декодирования требует информации, включающей в себя: SPS, PPS, VPS (H.265).
IJKPlayer игроксуществоватьнадстановиться Обнаружение звука и После видео, при запуске декодирования, если вы используете жесткое решение, декодирование начнется Делать и обновит декодирование. Нет необходимости выполнять операции ирование и эту операцию, но это займет много времени и повлияет на продолжительность рендеринга первого пакета. Удалите эту операцию обновления, увеличится продолжительность первого кадра. 10-20ms。
Затраты времени на буферизацию относятся к времени, в течение которого проигрыватель буферизует данные, достигая заданного порога.,Вы можете начать воспроизведение видео. это значение может быть динамическим,Поэтому разные изнастройки по-разному влияют на первый экран.
Затраты времени на буферизацию и статистический метод,Это не так просто, как предыдущие.,Потому что для этого требуется много мест в коде.,такнуждатьсясуществоватьмногоиндивидуальныйместный планчас。Начни считатьчас Можетпрямойот avformat_find_stream_info
Начать позже и закончить время найти в Оно заканчивается, когда выходит первый кадр видеорендеринга.
avformat_find_stream_info(ic, opts);
start = av_gettime();
...
if (!ffp->first_video_frame_rendered) {
ffp->first_video_frame_rendered = 1;
ffp_notify_msg1(ffp, FFP_MSG_VIDEO_RENDERING_START);
end = av_gettime();
}
Оптимизация 1: Корректировка BUFFERING_CHECK_PER_MILLISECONDS
настраивать.
буферная зона Заполнение требует временииигроквнутриодининдивидуальныйнастраивать BUFFERING_CHECK_PER_MILLISECONDS
Значение отключено, потому что для игрока check Достигают ли данные буфера целевого значения, не определяется случайным образом, поскольку для check Он сам будет иметь определенные операции с числами с плавающей запятой, поэтому ijkplayer Изначально настроено на него 500ms час间间隔去Конечночасисследовать,это время явно больше,Таким образом, время буферизации будет сильно затронуто. Вы можете изменить это значение на меньшее.
#define BUFFERING_CHECK_PER_MILLISECONDS (500)
этот Стоит встречисуществовать ijkplayer проектсередина ff_ffplay.c
в файле read_thread
Метод середина использует:
if (ffp->packet_buffering) {
io_tick_counter = SDL_GetTickHR();
if (abs((int)(io_tick_counter - prev_io_tick_counter)) > BUFFERING_CHECK_PER_MILLISECONDS){
prev_io_tick_counter = io_tick_counter;
ffp_check_buffering_l(ffp);
}
}
Из логики этого кода видно, что каждый раз, когда вызов ffp_check_buffering_l
иди проверь buffer Выполняются ли условия и интервал времени 500ms Или так, если в этот раз для выполнения условий не хватает только одного кадра данных, то все равно нужно подождать. 500ms Только тогда мы сможем проверить еще раз. это время, правда, слишком длинное для прямой трансляции. Наш текущий метод из Делать сводится к 50 мс, среднее значение по фактическим результатам измерений уменьшить 200ms о.
Оптимизация 2: Корректировка MIN_MIN_FRAMES
настраивать.
кроме тогоодининдивидуальныйи缓冲区Взаимнозакрыватьизнастраиватьда MIN_MIN_FRAMES
,Что Соответствующий Используйте логикусуществовать ffp_check_buffering_l(ffp)
функциясередина:
#define MIN_MIN_FRAMES 10
if (is->buffer_indicator_queue && is->buffer_indicator_queue->nb_packets > 0) {
if ( (is->audioq.nb_packets > MIN_MIN_FRAMES || is->audio_stream < 0 || is->audioq.abort_request)
&& (is->videoq.nb_packets > MIN_MIN_FRAMES || is->video_stream < 0 || is->videoq.abort_request)) {
printf("ffp_check_buffering_l buffering end \n");
ffp_toggle_buffering(ffp, 0);
}
}
Вероятно, это означает, что данные необходимо буферизовать как минимум 11 кадрировать видео и 11 отдельные аудиопакеты, прежде чем они смогут покинуть буфер и начать воспроизведение. Аудиоданные легко удовлетворяют этому условию, поскольку для, если частота дискретизации 44.1k изаудио, затем 1s из Средние данные имеют 44 аудиопакет, 0,25 с из Данные могут быть достигнуты 11 индивидуальный аудиопакет. Но верно В видео, если оно есть 24 количество кадров из частоты кадров, как минимум требуется 0.4s Могут быть получены левые и правые данные 11 кадр Если частота кадров захвата и кодирования видео низкая (красота, AR. дело Зависит от В Расход на обработку высокий и частота кадров может быть ниже), только иметь 10-15, тогда должно быть близко 1s данных может быть достигнуто 11 рамка,Буферу нужно столько данных, чтобы начать воспроизведение,эта продолжительность слишком велика.
Когда в буфере будет достигнуто такое количество данных, сколько данных на самом деле загрузит плеер? Мы идем глубоко ff_ffplay.c
Из исходного кода видно, что видео будет декодировано и помещено в файл. frame_queue
в,использовать Врендерингданные。Можетсмотретьприезжатьвидеоданныеизпроцессдатакиз:буфер загрузки -> декодирование -> Буфер рендеринга -> рендеринг
。Чтосерединарендерингиз缓冲区Сразуда frame_queue
。скачатьданныепройдет мимо первымдекодирование Проволокастепень Воляданныевыходприезжать frame_queue
середина и подожди frame_queue
Только когда очередь заполнится, мы начнем рендеринг. существовать ff_ffplay.c
середина, вы можете найти следующий код:
#define VIDEO_PICTURE_QUEUE_SIZE_MIN (3)
#define VIDEO_PICTURE_QUEUE_SIZE_MAX (16)
#define VIDEO_PICTURE_QUEUE_SIZE_DEFAULT (VIDEO_PICTURE_QUEUE_SIZE_MIN)
ffp->pictq_size = VIDEO_PICTURE_QUEUE_SIZE_DEFAULT; // option
/* start video display */
if (frame_queue_init(&is->pictq, &is->videoq, ffp->pictq_size, 1) < 0)
goto fail;
Итак, в настоящее время, если вы установите MIN_MIN_FRAMES
для 10. Когда игрок начинает играть, у него должно быть не менее 14 кадрировать видео. верно В Для видео с низкой частотой кадров она также довольно велика. существующая практика серединамы приспосабливаем ее к 5. Сокращается время пребывания на первом экране. 300ms влево и вправо,а скорость отставания только увеличивалась 2 индивидуальныйпроцентный пункто.
Оптимизация 3. Используйте уровень воды в аудиобуфере для управления воспроизведением.
иногда встречается video packet duration Будетдля пустого положения, и IJKPlayer Да video Буферный уровень воды для ускорения воспроизведения, поэтому Зависит от Виметьточка video packet из duration Если «для» пусто, это приведет к тому, что «для» накопит достаточно уровня воды для загрузки фактической продолжительности и превысит уровень воды из видеоданных для начала трансляции, что приведет к медленному началу трансляции. Верно В этом нет проблемы, которую вы можете изменить для: к audio Уровень буферной воды управляет трансляцией из-за audio packet из duration в в целом все нормально, это можно оптимизировать Начать трансляциюскорость.
В дополнение к оптимизации клиентского бизнеса,Мы также можем сделать это со стороны сервера потоковой передачи. Все мы знаем, что изображения прямых трансляций делятся на кадры: I Рама, П Рама, Б кадры.,Чтосередина Толькоиметь I рамка может декодироваться независимо, не полагаясь на другие кадры, а это означает, что когда игрок получает I Кадр можно рендерить сразу, а после получения P Рама, Б Кадр должен дождаться зависимого кадра и не может быть немедленно преобразован в декодирование и рендеринг. В течение этого периода будет «черный экран».
так,существовать Служитьустройствоконец Можетпроходитькэш GOP(существовать H.264 середина,GOP закрыто из, Да I Начало кадра представляет собой набор последовательностей кадров изображения), чтобы гарантировать, что конец воспроизведения сможет получить его первым при доступе к прямой трансляции. I Рамка сразу выскакивает за пределы экрана, таким образом оптимизируя первую загрузку экрана с учетом опыта.
вот один IDR О концепции кадра необходимо поговорить, так что IDR рамки I кадры, но не все I рамки IDR Рама, РДЭ рамка I Кадр из подмножества. я Кадр строго определяется как внутрикодированный кадр. от В — индивидуальный кадр, закодированный с помощью полнокадрового сжатия, в целомиспользовать I Фрейм означает «ключевой кадр». РДЭ Это база I Индивидуальное расширение рамки, с логикой управления, IDR изображения I изображение кадра при декодировании устройства декодирования IDR Когда изображение будет снято, очередь опорных кадров будет немедленно очищена, а все данные будут выведены и удалены. Повторно выполните поиск набора параметров и запустите новую последовательность. Таким образом, если в предыдущей индивидуальной последовательности произошла серьезная ошибка, существование здесь может получить возможность ресинхронизации. РДЭ After image из image никогда не используется IDR Доизизображениеданные Приходитьдекодирование。существовать H.264 кодированиесередина,GOP Закрытое из, индивидуальное GOP из Нет.одинрамки IDR рамка.
GOP-кеш
в целомнас Можно найти в CDN изэджузел Делать GOP-кеш。
Быстрый старт оптимизации будет существовать ГОП-кеш в основном в соответствии с Размер буфера плеера установлен на определенный уровень. GOP Сумма для заполнения буфера плеера В.
Этот элемент оптимизации контролируется не клиентским игроком, а существованием. CDN Сервер контролирует распределение видеоданных и пропускную способность. Поскольку время буферизации связано не только с требованиями к буферизации и количеством кадров, но и со скоростью загрузки данных. CDN дляпример,Они могут настроить быструю загрузку после,существовать при вытягивании прямой трансляции,Сервер Воля с 5 Раз обычная пропускная способность и скорость выдаются на передний кэшиз 1s данные,Этот эффект не только быстрее, чем первая скорость экрана.,Открытие первого экрана за считанные секунды также будет более стабильным.,потому чтодляиметьзафиксированный 1s изкэш Быстрая доставка. Этот эффект оптимизации позволяет увеличить скорость открытия первого экрана за считанные секунды. 100ms о.
HLS из Воспроизвести за секундыдля「Начать трансляцию напрямую」и「Начать трансляцию seek」ситуация.
1) Начать трансляцию напрямую
верно В "Прямой трансляции" со сцены,Скорость начала воспроизведения во многом зависит от стратегии игрока. Например, iOS из AVPlayer возможно скачать 3 отдельных ts Срез начнет воспроизводиться IJKPlayer. Затем используйте стратегию уровня воды, чтобы загрузить определенный объем данных и начать трансляцию.,так Взаимноверно Начать трансляциюбудет быстрееодиннекоторый。
2) Начать поиск трансляции
в Целиком Мы будем использовать HLS Чтобы сохранить прямую трансляцию из файла воспроизведения, Зависит от Ва прямой эфиризтаймев целом дольше, существуют при просмотре повтора, в целомнуждаться seek Перейдите в определенное место, чтобы найти контент, который интересует пользователя.
верно Вв В целом из плеера вам может потребоваться сначала инициализировать плеер и загрузить воспроизводимый контент с начала, а затем зависит отбизнес Делать seek Операция, это будет медленнее. IJKPlayer иметь seek-at-start Возможность напрямую загружать данные о текущем местоположении без загрузки с нуля. искать, оптимизировать трансляцию seek изскорость.
в целом HLS из ts Нарезка как вживую GOP нарезать из если seek до определенногоиндивидуальный ts Отрезок изсередина вставки понадобится из этого ts Загрузите данные в начальной позиции среза и декодируйте, а затем рассчитайте seek Перейдите в положение «Из», чтобы отобразить экран, поэтому из seek Процесс будет медленнее. проблема верно Вэтот, сервер может верно Вэтот соответствии управление контентом прямой трансляции Воляone прямая трансляция разрезана на несколько отдельных m3u8, для всего контента больше не используется только один человек m3u8,идаодининдивидуальный Раздел контентаверноотвечатьодининдивидуальный m3u8. Это может гарантировать, что когда пользователь нажимает на привязку контента, видео будет воспроизводиться непосредственно с самого начала. m3u8, нет необходимости стремиться оптимизировать скорость ответа.
Если пользователь перетаскивает прогресс сам ищите, на этот раз реальная потребность существоватьсуществоватьиз seek Проведите оптимизацию, здесь существуем использование IJKPlayer часиметьодининдивидуальныйоптимизацияточка:иногда встречается video packet duration Будетдля пустого положения, и IJKPlayer Да video Буферный уровень воды для ускорения воспроизведения, поэтому Зависит от Виметьточка video packet из duration Если для пусто, это приведет к накоплению достаточного количества уровня воды для загрузки фактической продолжительности, превышающей уровень воды, из видеоданных, чтобы начать трансляцию, что приводит к seek Медленнее, верно В этой проблеме вы можете изменить на: на audio Уровень буферной воды управляет трансляцией из-за audio packet из duration в в целом все нормально, это можно оптимизировать seek скорость.
Мы также столкнулись HLS seek Проблема с черным экраном. В основном вызвана запуском. seek час,seek_position = stream.start_time + seek_duration
,stream из first_timestamp Неправильно инициализирован, что приводит к невозможности найти seek из положения, искать неудача.
Кроме того, IJKPlayer поддерживать EXT-X-DISCONTINUITY У тега есть проблема, которую необходимо решить с учетом ошибок ts seek проблема.seek Расположениеанализироватьприезжатьиз pts Если есть ошибка, добавьте «hat» перед ошибкой. ts изпродолжительность。
существовать Android с точки зрения реализации, если Surface Не создан заранее, IJKPlayer сначала создаст индивидуальное простое издекодирование,декодированиеустройствовстречаиметьодининдивидуальный Выбирать buffer из эксплуатации,этотпроцессиметь Замок,такой жечасвстречаиметьодининдивидуальный sleep продолжительность 100 мс. когда Surface После установки IJKPlayer Необходимо перенастроить устройство декодирования, а также для этой операции необходимо получить предыдущую индивидуальную блокировку. В это время требуется максимально равный интервал продержки. 100 мс. Кроме того, перенастройка сервера декодирования также занимает десятки миллисекунд. После успешного создания устройства декодирования перейдите в buffer При получении данных на них также будет влиять предыдущая блокировка. В это время требуется максимально равный интервал продержки. 100ms。
в соответствии сэтот Состояние,Можно найти вбезиметьнастраивать Surface Когда процессор декодирования простаивает, позвольте потоку ждать напрямую, не входя в выборку. buffer из эксплуатации,Запретить вход в логику блокировки,так Можетизбегайте быть Surface был задержан из-за ожидания блокировки после настройки。
Предварительная загрузка видео — это распространенный метод оптимизации первого кадра. Его принцип заключается в предварительной загрузке части видеоданных для достижения быстрого старта.
Принцип прост, но для достижения хороших результатов нужно учитывать множество факторов: Когда начинать предварительную загрузку, предварительную загрузку. объем загрузки, количество параллельных предварительных загрузок и т. д.
и,Игла правда отличается от сцен,Аналогично, результаты стратегии могут быть разными.,такхотеть Делатьхорошийпредварительная загрузка требует использования экспериментов в сочетании с бизнес-сценариями для отладки наиболее подходящих параметров стратегии.
При загрузке видео для воспроизведения,Вы также можете открыть другую задачу хранения.,будет кэш видео данных на локальном компьютере,Таким образом, когда видео будет воспроизведено в следующий раз, оно сможет напрямую загрузить локальные кэшпросить данные.,С одной стороны, это может сэкономить полосу пропускания.,С другой стороны, это может улучшить скорость загрузки данных.,Тем самым улучшая скорость открытия первых кадров.
Конечно, здесь нужно подумать о том, как сегментировать локальные видеоданные и как их очистить, если видеоданные слишком велики.
проходитьпредварительная загрузка видеоданных может быть передана в сеть «Воля» Запрошено трудоемким способом, но плееру все равно необходимо пройти декапсуляцию и расшифровку. процесс екодирования, рендеринга, этосуществоватьсередина также будет доступно на машинах начального уровня. 100-200ms из Отнимает много времени. Мы можем провести пререндеринг, чтобы избавиться от этих трудоемких действий.
Пререндеринг — это плеер, который существует и получает видео URL Тогда вы можете начать подготовиться, процесс существования этого середина начнет считывать данные для декапсуляции и декодирования рендеринга. Когда будет обработан первый кадр рендеринга, он будет ждать последующего. play команда, чтобы играть снова.
Предварительный рендеринг процессора、GPU Дополнительное потребление может привести к UI Частота кадров падает. В это время ее необходимо выборочно включать в зависимости от производительности модели.
также,При одновременном включении пререндеринга предварительная загрузка,Также занимайтесь оптимизацией стратегии.
Когда над становится способностью пререндеринга,Фактически, вы можете использовать плеер для предварительного рендеринга первого кадра вместо изображения обложки.,Это может сэкономить трафик на загрузку обложек.,Это также может уменьшить конфликты за полосу пропускания, вызванные загрузкой изображений обложек.
Но, в конце концов, все равно необходимо иметь секретную стратегию.,Например: когда предварительный рендеринг не завершен,Когда следует выбрать продолжение загрузки изображения обложки.
[1]
IJKPlayer: https://github.com/bilibili/ijkplayer
[2]
iOS 302 Ожидание перенаправления бизнес-сценария IP Описание плана прямого подключения: https://helpcdn.aliyun.com/knowledge_detail/60148.html
[3]
HTTPS (включаяSNI) бизнес-сценарий IP Описание плана прямого подключения: https://help.aliyun.com/document_detail/30143.html
[4]
iOS HTTPS SNI Бизнес-сценарий IПописание плана прямого подключения: https://help.aliyun.com/knowledge_detail/60147.html
[5]
TCP Fast Open Примечания к практике: https://www.jianshu.com/p/24bcaa99bb02
[6]
TCP Fast Open Концепция, функции и реализация: https://blog.csdn.net/Windgs_YF/article/details/94743088
[7]
TCP из этих вещей | TCP Fast Open: https://blog.csdn.net/u014023993/article/details/85928026
[8]
VLC Оптимизировать (1) avformat_find_stream_info Уменьшение задержки интерфейса: https://jiya.io/archives/vlc_optimize_1.html
[9]
FFmpeg avformat_find_stream_info заменять: http://blog.csdn.net/leo2007608/article/details/53421528
[10]
FFmpeg Простой анализ исходного кода: avformat_find_stream_info(): http://blog.csdn.net/leixiaohua1020/article/details/44084321