[英](C) avcodec_receive_frame (ffmpeg) function always returns AVERROR(EAGAIN)
我正在關注本教程: http://dranger.com/ffmpeg/tutorial01.html並試圖更改一些不推薦使用的函數,因此我不得不嘗試使用avcodec_send_packet
和avcodec_receive_frame
函數。
我遇到的問題是avcodec_receive_frame
總是返回AVERROR(EAGAIN)
。
我的解碼function如下:
static int decode(AVCodecContext *pCodecCtx, AVFrame *pFrame, AVPacket *packet) {
int ret = avcodec_send_packet(pCodecCtx, packet);
if (ret<0) {
fprintf(stderr, "error sending packet for decoding\n");
exit(1);
}
while (ret>=0) {
// avcodec_receive_packet(pCodecCtx, NULL);
ret = avcodec_receive_frame(pCodecCtx, pFrame);
if (ret == AVERROR(EAGAIN)) {
fprintf(stderr, "\naverror(eagain) ret = %d\n", ret);
return -1;
}
else if (ret == AVERROR_EOF) {
fprintf(stderr, "eof\n");
return -100;
}
else if (ret <0) {
fprintf(stderr, "error during decoding\n");
exit(1);
}
}
return 0;
}
我讀到的所有地方都說這可以通過在下一幀調用avcodec_send_packet
來解決,但這對我來說並沒有解決問題,因為這個 function 是在循環中調用的:
while (av_read_frame(pFormatCtx, &packet)>=0) {
// is this a packet from the video stream?
if (packet.stream_index==videoStream) {
frameNotFinished = decode(pCodecCtx, pFrame, &packet);
// did we get a video frame?
if (!frameNotFinished) fprintf(stderr, "it worked!");
}
av_packet_unref(&packet);
}
我可能還應該補充一點, avcodec_send_packet
總是返回 0(成功)。
任何幫助將非常感激。
當你真正得到一個框架時你永遠不會回來(ret == 0)
另一方面,如果您返回,您實際上不會“解碼”所有幀,直到您獲得 AVERROR(EAGAIN) 這意味着您可能會丟失一些幀。 所以,我想你首先必須決定你到底想做什么。
(我想你只需要在while(ret> = 0)內有你的“過程” function 如果你有 ret == 0 你做任何你做的事)
過程如下......
3.1)如果沒有可用的幀,您會收到 AVERROR(EAGAIN) 並且您必須向解碼器發送更多數據包(返回步驟 1)
3.2)如果幀可用,你 avcodec_receive_frame 直到你得到 AVERROR(EAGAIN)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.