2015-04-20 5 views
4

J'ai une caméra IP qui donne H264 annexeb Bitstream via les appels SDK. Je veux emballer ce flux vidéo dans un conteneur FLV. Jusqu'à présent, je dois savoir ce qui suit: -h264 annexeb bitstream vers flv bibliothèque mux ffmpeg

Je dois convertir H264 annexb à H264 AVCC: Pour cela, je vais devoir remplacer l'octet d'en-tête NAL (0x00000001) avec la taille de NALU (grand format) .

Ma question est: Qu'est-ce que je fais avec SPS et PPS? devrais-je écrire (av_interleaved_write_frame) comme ils sont après avoir remplacé l'en-tête NAL? ou est-ce que je n'écris pas ces images?

Je lis à propos d'AVCC nécessitant des données supplémentaires. Comment puis-je construire cela? où est-ce que je passe ça?

Répondre

4

Récupérez d'abord le SPS/PPS de la caméra. Écrivez le SPS/PPS à AVcc le format extradata (voir comment ici: 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); 

Avant d'appeler avcodec_open2

+0

Je ne suis pas encodez le flux. Je suis juste en train de muxing dans FLV. Je n'ai donc pas "avcodec_open2" dans mon code. ret = avcodec_copy_context (out_stream-> codec, in_stream-> codec); Puis-je simplement affecter des données supplémentaires à extradata-> codec-> extradata? après le contexte de copie? –

+1

Je comprends. Vous n'avez pas besoin d'appeler avcodec_encode_video(), mais vous devriez appeler open_codec2(). Il fait l'initialisation finale du AVCodecContext (analyse l'extradata et initialise les variables internes telles que la résolution). – szatmary

+0

ok je comprends. Une chose que j'ai remarquée est que je reçois SPS périodiquement. Cela signifie-t-il que je devrai à nouveau transmettre des données supplémentaires au CodecContext? i-e open_codec2 encore et encore chaque fois que je reçois SPS? –