<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<p><font face="monospace">Hello all.</font></p>
<p><font face="monospace">I am working on a capture/encoder
project. I've gotten it to work well enough, for the most part.</font></p>
<p><font face="monospace">If I record shorter segments, like in the
1-2 minute range, the output files are fine.</font></p>
<p><font face="monospace">However, as the clip gets longer, it
eventually starts hitting an I/O Error (-5) when executing </font><font
face="monospace"><b>av_interleaved_write_frame(format_context,
output_packet). </b>It never recovers from this, all writing
to the file stops, and attempting to close the file results in
an unplayable file.</font></p>
<p><font face="monospace">This is the part of the code that writes
audio frames, and also where the error is detected:<br>
</font></p>
<p><font face="monospace">int Recorder::audioWriteFrame(void* ctx,
AVFrame* frame) {<br>
if (!decoding) return -1;<br>
if (recording) {<br>
frames_all++;<br>
frames_audio++;<br>
AVPacket* output_packet = av_packet_alloc();<br>
int ret = avcodec_send_frame(audio_context, frame);<br>
while (ret >= 0)<br>
{<br>
ret = avcodec_receive_packet(audio_context,
output_packet);<br>
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {<br>
break;<br>
}<br>
else if (ret < 0) {<br>
cout << "AUD-AVCRPX: ";<br>
cout << ret;<br>
break;<br>
}<br>
chrono::steady_clock::time_point now =
chrono::high_resolution_clock::now();<br>
long long ms_elapsed =
chrono::duration_cast<chrono::microseconds>(now -
rec_started).count();<br>
ms_elapsed = av_rescale_q(ms_elapsed,
audio_context->time_base, audio_stream->time_base);<br>
output_packet->pts = ms_elapsed;<br>
output_packet->dts = ms_elapsed;<br>
output_packet->stream_index =
audio_stream->index;<br>
<br>
<b> ret = av_interleaved_write_frame(format_context,
output_packet); </b><b><br>
</b><b> if (ret < 0) {</b><b><br>
</b><b> char* errmsg = new char[4096];</b><b><br>
</b><b> av_strerror(ret, errmsg, 4096);</b><b><br>
</b><b> cout << "audio
av_interleaved_write_frame ERROR: ";</b><b><br>
</b><b> cout << errmsg;</b><b><br>
</b><b> cout << "\r\n";</b><b><br>
</b><b> }</b><b><br>
</b><b> ret = ret;</b><br>
}<br>
<br>
av_packet_unref(output_packet);<br>
av_packet_free(&output_packet);<br>
}<br>
return 0;<br>
}<br>
</font></p>
<p><font face="monospace"><br>
</font></p>
<p><font face="monospace">Any ideas why this is happening would be
helpful.</font></p>
<p><font face="monospace">--Reynolds<br>
</font></p>
</body>
</html>