参考ffmpegAPI提供的例子实现了一个简单的封装格式转换器,在实际转换时候,需要考虑对h264的两种封装格式分别是h264和avc1。
AVC1 描述:H.264 bitstream without start codes.一般通过ffmpeg转码生成的视频,是不带起始码0×00000001的。
H264 描述:H.264 bitstream with start codes.一般对于一下HDVD等电影的压制格式,是带有起始码0×00000001的。
一般的像(mp4、mkv、flv)的封装格式都是没有startcode的AVC1。 而像avi的封装格式则是有start codes的H264 。ffmpeg提供了一个名称为“h264_mp4toannexb”的bitstream filter。其会将像mp4这样的没有start code的格式转换为像avi这样的有start code。 使用方法如下:
//注册filter AVBitStreamFilterContext * vbsf = av_bitstream_filter_init("h264_mp4toannexb"); //转换 if (pkt.stream_index == AVMEDIA_TYPE_VIDEO && in_stream->codecpar->codec_id == AV_CODEC_ID_H264) { AVPacket fpkt = pkt; int a = av_bitstream_filter_filter(vbsf, out_stream->codec, NULL, &fpkt.data, &fpkt.size, pkt.data, pkt.size, pkt.flags & AV_PKT_FLAG_KEY); pkt.data = fpkt.data; pkt.size = fpkt.size; }
一个完整的格式转换代码如下:
if(In