[Libav-user] I/O Error on av_interleaved_write_frame for Audio track

Reynolds Kosloskey reynolds at kosloskey.com
Thu Aug 25 19:16:54 EEST 2022


Hello all.

I am working on a capture/encoder project.  I've gotten it to work well 
enough, for the most part.

If I record shorter segments, like in the 1-2 minute range, the output 
files are fine.

However, as the clip gets longer, it eventually starts hitting an I/O 
Error (-5) when executing *av_interleaved_write_frame(format_context, 
output_packet). *It never recovers from this, all writing to the file 
stops, and attempting to close the file results in an unplayable file.

This is the part of the code that writes audio frames, and also where 
the error is detected:

int Recorder::audioWriteFrame(void* ctx, AVFrame* frame) {
     if (!decoding) return -1;
     if (recording) {
         frames_all++;
         frames_audio++;
         AVPacket* output_packet = av_packet_alloc();
         int ret = avcodec_send_frame(audio_context, frame);
         while (ret >= 0)
         {
             ret = avcodec_receive_packet(audio_context, output_packet);
             if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
                 break;
             }
             else if (ret < 0) {
                 cout << "AUD-AVCRPX: ";
                 cout << ret;
                 break;
             }
             chrono::steady_clock::time_point now = 
chrono::high_resolution_clock::now();
             long long ms_elapsed = 
chrono::duration_cast<chrono::microseconds>(now - rec_started).count();
             ms_elapsed = av_rescale_q(ms_elapsed, 
audio_context->time_base, audio_stream->time_base);
             output_packet->pts = ms_elapsed;
             output_packet->dts = ms_elapsed;
             output_packet->stream_index = audio_stream->index;

*            ret = av_interleaved_write_frame(format_context, 
output_packet); **
**            if (ret < 0) {**
**                char* errmsg = new char[4096];**
**                av_strerror(ret, errmsg, 4096);**
**                cout << "audio av_interleaved_write_frame ERROR: ";**
**                cout << errmsg;**
**                cout << "\r\n";**
**            }**
**            ret = ret;*
         }

         av_packet_unref(output_packet);
         av_packet_free(&output_packet);
     }
     return 0;
}


Any ideas why this is happening would be helpful.

--Reynolds
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://ffmpeg.org/pipermail/libav-user/attachments/20220825/a1d85e28/attachment.htm>


More information about the Libav-user mailing list