2015-04-20 1 views
4

У меня есть IP-камера, которая дает H264 приложению Bitstream через вызовы SDK. Я хочу упаковать этот видеопоток в контейнер FLV. До сих пор я должен был знать следующее: -h264 applicationb bitstream to flv mux ffmpeg library

Мне нужно преобразовать H264 в приложение H264 AVCC: Для этого мне придется заменить байт заголовка NAL (0x00000001) на размер NALU (формат большого конца) ,

Мой вопрос: что мне делать с SPS и PPS? следует ли писать (av_interleaved_write_frame) их, как после замены заголовка NAL? или вообще не писать эти кадры?

Я читал о AVCC, требующем дополнительных данных. Как это построить? где я это передаю?

ответ

4

Сначала извлеките SPS/PPS с камеры. Написать SPS/PPS в AVCC ExtraData формат (посмотреть, как здесь: Possible Locations for Sequence/Picture Parameter Set(s) for H.264 Stream)

Set AVCodecContext.extradata

void *extradata = /**/; 
int extradata_size = /**/; 
codecCtx->extradata_size = extradata_size; 
codecCtx->extradata = av_malloc (codecCtx->extradata_size); 
memcpy (codecCtx->extradata, extradata, codecCtx->extradata_size); 

Перед вызовом avcodec_open2

+0

Я не повторное кодирование потока. Я просто перемещаю его в FLV. Поэтому у меня нет «avcodec_open2» в моем коде. ret = avcodec_copy_context (out_stream-> codec, in_stream-> codec); Могу ли я просто назначить дополнительные данные для outstream-> codec-> extradata? после контекста копирования? –

+1

Я понимаю. Вам не нужно вызывать avcodec_encode_video(), но вы должны позвонить open_codec2(). Он выполняет окончательную инициализацию AVCodecContext (анализирует extradata и инициализирует внутренние переменные, такие как разрешение). – szatmary

+0

ОК я понимаю. Одна вещь, которую я заметил, это то, что я периодически получаю SPS. Означает ли это, что мне понадобится снова передать дополнительные данные в CodecContext снова? i-e open_codec2 снова и снова, когда я получаю SPS? –