τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Το μπλογκ του «kn-zheng», του αφεντικού του porting blog park
Ξεκινώντας από το FFmpeg 3.0, χρησιμοποιούνται πολλές νέες διεπαφές, ως εξής:
1. avcodec_decode_video2() Η αρχική συνάρτηση αποκωδικοποίησης αποσυναρμολογείται σε δύο συναρτήσεις avcodec_send_packet() και avcodec_receive_frame().
old:
avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, pPacket);
new:
avcodec_send_packet(pCodecCtx, pPacket);
avcodec_receive_frame(pCodecCtx, pFrame);
2. Η συνάρτηση κωδικοποίησης που αντιστοιχεί στο avcodec_encode_video2() χωρίζεται επίσης σε δύο συναρτήσεις avcodec_send_frame() και avcodec_receive_packet().
old:
avcodec_encode_video2(pCodecCtx, pPacket, pFrame, &got_picture);
new:
avcodec_send_frame(pCodecCtx, pFrame); avcodec_receive_packet(pCodecCtx, pPacket);
3. Η avpicture_get_size() χρησιμοποιεί πλέον την av_image_get_size() Η συγκεκριμένη χρήση είναι η εξής:
old:
avpicture_get_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);
new: //最后一个参数align这里是置1的,具体看情况是否需要置1
av_image_get_buffer_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height, 1);
4. Η avpicture_fill() χρησιμοποιεί πλέον av_image_fill_arrays Η συγκεκριμένη χρήση είναι η εξής:
old:
avpicture_fill((AVPicture *)pFrame, buffer, AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);
new: //最后一个参数align这里是置1的,具体看情况是否需要置1
av_image_fill_arrays(pFrame->data, pFrame->linesize, buffer, AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height,1);
5. Όσον αφορά τα ζητήματα κωδικοποιητή, ορισμένα μπορούν να αλλάξουν απευθείας σε codecpar, αλλά μερικές φορές αυτό είναι λάθος, γι' αυτό εξακολουθώ να εξερευνώ Εδώ υπάρχει μια αλλαγή στη μέθοδο εκχώρησης του pCodecCtx και του pCodec.
old:
pCodecCtx = pFormatCtx->streams[video_index]->codec;
pCodec = avcodec_find_decoder(pFormatCtx->streams[video_index]->codec->codec_id);
new:
pCodecCtx = avcodec_alloc_context3(NULL);avcodec_parameters_to_context(pCodecCtx,pFormatCtx->streams[video_index]->codecpar);
pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
6、PIX_FMT_YUV420P -> AV_PIX_FMT_YUV420P
7. 'AVStream::codec': Δηλώθηκε ως καταργημένο:
old:
pCodecCtx = pFormatCtx->streams[videoindex]->codec;
new:
pCodecCtx = avcodec_alloc_context3(NULL);
avcodec_parameters_to_context(pCodecCtx, pFormatCtx->streams[videoindex]->codecpar);
8. 'avpicture_fill': Δηλώθηκε ως καταργημένο:
old:
avpicture_fill((AVPicture *)pFrameYUV, out_buffer, AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);
new:
av_image_fill_arrays(pFrameYUV->data, pFrameYUV->linesize, out_buffer, AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height, 1);
9. 'avcodec_decode_video2': Δηλώθηκε ως καταργημένο:
old:
ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, packet); //got_picture_ptr Zero if no frame could be decompressed
new:
ret = avcodec_send_packet(pCodecCtx, packet);
got_picture = avcodec_receive_frame(pCodecCtx, pFrame); //got_picture = 0 success, a frame was returned //注意:got_picture含义相反
或者:
int ret = avcodec_send_packet(aCodecCtx, &pkt);
if (ret != 0)
{
prinitf("%s/n","error");
return;
}
while( avcodec_receive_frame(aCodecCtx, &frame) == 0)
{
//读取到一帧音频或者视频 //处理解码后音视频 frame
}
10. 'av_free_packet': Δηλώθηκε ως καταργημένο:
old:
av_free_packet(packet);
new:
av_packet_unref(packet);
11. avcodec_decode_audio4: Δηλώθηκε ως καταργημένο:
old:
result = avcodec_decode_audio4(dec_ctx, out_frame, &got_output, &enc_pkt);
new:
int ret = avcodec_send_packet(dec_ctx, &enc_pkt);
if (ret != 0)
{
prinitf("%s/n","error");
}
while( avcodec_receive_frame(dec_ctx, &out_frame) == 0)
{
//读取到一帧音频或者视频
//处理解码后音视频 frame
}
旧接口av_register_all()------------新版不需要注册
PKT_FLAG_KEY ---------------->AV_PKT_FLAG_KEY
AV_CODEC_CAP_DELAY----->AV_CODEC_CAP_DELAY
guess_format ------------>av_guess_format
av_alloc_format_context ---------->avformat_alloc_output_context
CODEC_TYPE_VIDEO ----------------->AVMEDIA_TYPE_VIDEO
CODEC_TYPE_AUDIO ---------------->AVMEDIA_TYPE_AUDIO
audio_resample_init ----------------->av_audio_resample_init
PIX_FMT_YUV420P -> AV_PIX_FMT_YUV420P
AVStream::codec 被声明为已否决
‘avpicture_get_size’: 被声明为已否决
新的API中将AVStream结构体中codec作了遗弃处理,当需要解码器上下文的时候,需要用AVCodecParameters去转化,解决方案是如下
av_free_packet(packet)--------------------> av_packet_unref(packet);