FFmpeg: avcodec_send_packet() -1094995529, error string: Invalid data found when processing input


錯誤原因:

調用 int av_read_frame(AVFormatContext *s, AVPacket *pkt) 函數 時,將會讀取一幀數據並填充到AVPacket里面,但是讀取的這幀數據可能是視頻也可能是音頻,也可能是字幕,具體是什么類型可以通過 AVPacket對象的 stream_index 屬性來判斷,因此在讀取完一幀數據后,調用  avcodec_send_packet(inputCodecCtx, inputPacket)  函數將這幀數據發送到解碼隊列之前,一定要確保這幀數據(AVPacket)的類型與 解碼器上下文的類型保持一致

也就是說你AVPacket中的stream_index對應的是音頻流數據,那你在調用avcodec_send_packet()函數時,第二個參數傳入的必須是一個音頻解碼器上下文,只有這樣send packet才有可能成功。

解決辦法:

在send_packet之前,對packet的類型作判斷,類似於這樣:

while(av_read_frame(ctx_format, pkt) >= 0){
    if (pkt->stream_index == stream_idx) {
        int ret = avcodec_send_packet(ctx_codec, pkt);
        if (ret < 0 || ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
            std::cout << "avcodec_send_packet: " << ret << std::endl;
            break;
        }
        while (ret  >= 0) {
            ret = avcodec_receive_frame(ctx_codec, frame);
            if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
                //std::cout << "avcodec_receive_frame: " << ret << std::endl;
                break;
            }
            std::cout << "frame: " << ctx_codec->frame_number << std::endl;
        }
    }
    av_packet_unref(pkt);
}

參考鏈接:

1. ffmpeg failed to call avcodec_send_packet

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM