[Libav-user] I/O Error on av_interleaved_write_frame for Audio track
Reynolds Kosloskey
reynolds at kosloskey.com
Thu Aug 25 21:30:33 EEST 2022
On 8/25/2022 12:16 PM, Reynolds Kosloskey wrote:
>
> 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
>
If anyone else comes across this error, one thing to look at would be
the size of the buffers you're using. In my case, I had an audio
decoding thread that I passed a buffer to *avio_alloc_context*.
Increasing that buffer size seems to have gotten rid of the issue.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://ffmpeg.org/pipermail/libav-user/attachments/20220825/a3baead2/attachment.htm>
More information about the Libav-user
mailing list