[Libav-user] What is the correct way of writing NAL units to file?
I am using a slightly modified encode_video example to feed one frame
at a time to h264_v4l2m2m encoder, and getting encoded packets using
avcodec_receive_packet function, and write to output file using
av_write_frame. The very first packet that comes out of the encoder is
always the NAL units [ 00 00 00 01 67 4d 00 0a da 01 40 16 e4 00 00 00
01 68 ce 01 9e 20 ], probably because the v4l2_m2m encoder sets the
HEADER_MODE to HEADER_MODE_SEPARATE.
My questions are:
- How do I detect which packet is the NAL unit, and which is I frame
or P frame? Currently I look for packet PTS == 0 and AV_PKT_FLAG_KEY
not set. Is there a better way?
- What is the correct way of writing this NAL unit packet to my output
file? I am using av_write_frame function to write this NAL unit
packet, but when I run ffprobe, I get this error:
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x18efb00] st: 0 edit list: 1 Missing key
frame while searching for timestamp: 0
[h264 @ 0x18f0fb0] no frame!
If I manually copy the NAL units into the first I frame packet (by
doing av_grow_packet, memmove, memcpy), then ffprobe runs without any
issue. This seems like an ugly way of handling NAL unit packet.
Any help or guidance is greatly appreciated. Thanks in advance.