Как использовать FFMPEG для воспроизведения потока H.264 с блоков NAL, которые хранятся в виде AV-пакетов

Я пишу клиент-серверную систему, которая использует библиотеку FFMPEG для анализа потока H.264 в блоки NAL на стороне сервера, а затем использует канальное кодирование для отправки их по сети на сторону клиента, где мое приложение должно иметь возможность воспроизводить видео.

Вопрос в том, как воспроизвести полученные AVPackets (блоки NAL) в моем приложении в виде видеопотока.
я нашел этот урок полезно и использовал его в качестве основы для сервера и клиента.

Некоторые примеры кода или ресурса, связанные с воспроизведением видео не из файла, а из данных внутри программы с использованием библиотеки FFMPEG, были бы очень полезны.

Я уверен, что полученной информации будет достаточно для воспроизведения видео, потому что я попытался сохранить полученные данные в виде файла .h264 или .mp4, и он может быть воспроизведен проигрывателем VLC.

0

Решение

Из того, что я понимаю из вашего вопроса, у вас есть AVPackets и хотите воспроизвести видео. На самом деле это две проблемы; 1. декодирование ваших пакетов и 2. воспроизведение видео.

Для декодирования ваших пакетов, с FFmpeg, вы должны взглянуть на документацию для AVPacket, AVCodecContext а также avcodec_decode_video2 получить некоторые идеи; общая идея заключается в том, что вы хотите что-то сделать (просто написали это в браузере, возьмите немного соли) в соответствии с:

//the context, set this appropriately based on your video. See the above links for the documentation
AVCodecContext *decoder_context;
std::vector<AVPacket> packets;   //assume this has your packets
...
AVFrame *decoded_frame = av_frame_alloc();
int ret = -1;
int got_frame = 0;
for(AVPacket packet : packets)
{
avcodec_get_frame_defaults(frame);
ret = avcodec_decode_video2(decoder_context, decoded_frame, &got_frame, &packet);
if (ret <= 0) {
//had an error decoding the current packet or couldn't decode the packet
break;
}

if(got_frame)
{
//send to whatever video player queue you're using/do whatever with the frame
...
}
got_frame = 0;
av_free_packet(&packet);
}

Это довольно грубый набросок, но это общая идея для вашей задачи декодирования AVPackets. Что касается вашей проблемы воспроизведения видео, у вас есть много вариантов, которые, вероятно, будут зависеть больше от ваших клиентов. То, что вы спрашиваете, является довольно большой проблемой, я бы посоветовал ознакомиться с документацией FFmpeg и приведенными примерами на сайт FFmpeg. Надеюсь, что это имеет смысл

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]