static int write_audio_frame(void) { AVCodecContext* c = NULL; AVPacket pkt; c = audio_stream->codec; av_init_packet(&pkt); pkt.size = 0; AUD_readDevice(audio_mixdown_device, audio_input_buffer, audio_input_samples); audio_time += (double) audio_input_samples / (double) c->sample_rate; pkt.size = avcodec_encode_audio(c, audio_output_buffer, audio_outbuf_size, (short*) audio_input_buffer); if(pkt.size < 0) { // XXX error("Error writing audio packet"); return -1; } pkt.data = audio_output_buffer; if(c->coded_frame && c->coded_frame->pts != AV_NOPTS_VALUE) { pkt.pts = av_rescale_q(c->coded_frame->pts, c->time_base, audio_stream->time_base); fprintf(stderr, "Audio Frame PTS: %d\n", (int)pkt.pts); } pkt.stream_index = audio_stream->index; pkt.flags |= AV_PKT_FLAG_KEY; if (av_interleaved_write_frame(outfile, &pkt) != 0) { fprintf(stderr, "Error writing audio packet!\n"); return -1; } return 0; }
static int write_audio_frame(void) { AVCodecContext *c = NULL; AVPacket pkt; AVFrame *frame = NULL; int got_output = 0; c = audio_stream->codec; av_init_packet(&pkt); pkt.size = 0; pkt.data = NULL; AUD_readDevice(audio_mixdown_device, audio_input_buffer, audio_input_samples); audio_time += (double) audio_input_samples / (double) c->sample_rate; #ifdef FFMPEG_HAVE_ENCODE_AUDIO2 frame = avcodec_alloc_frame(); avcodec_get_frame_defaults(frame); frame->pts = audio_time / av_q2d(c->time_base); frame->nb_samples = audio_input_samples; frame->format = c->sample_fmt; #ifdef FFMPEG_HAVE_FRAME_CHANNEL_LAYOUT frame->channel_layout = c->channel_layout; #endif if (audio_deinterleave) { int channel, i; uint8_t *temp; for (channel = 0; channel < c->channels; channel++) { for (i = 0; i < frame->nb_samples; i++) { memcpy(audio_deinterleave_buffer + (i + channel * frame->nb_samples) * audio_sample_size, audio_input_buffer + (c->channels * i + channel) * audio_sample_size, audio_sample_size); } } temp = audio_deinterleave_buffer; audio_deinterleave_buffer = audio_input_buffer; audio_input_buffer = temp; } avcodec_fill_audio_frame(frame, c->channels, c->sample_fmt, audio_input_buffer, audio_input_samples * c->channels * audio_sample_size, 1); if (avcodec_encode_audio2(c, &pkt, frame, &got_output) < 0) { // XXX error("Error writing audio packet"); return -1; } if (!got_output) { avcodec_free_frame(&frame); return 0; } #else pkt.size = avcodec_encode_audio(c, audio_output_buffer, audio_outbuf_size, (short *) audio_input_buffer); if (pkt.size < 0) { // XXX error("Error writing audio packet"); return -1; } pkt.data = audio_output_buffer; got_output = 1; #endif if (got_output) { if (pkt.pts != AV_NOPTS_VALUE) pkt.pts = av_rescale_q(pkt.pts, c->time_base, audio_stream->time_base); if (pkt.dts != AV_NOPTS_VALUE) pkt.dts = av_rescale_q(pkt.dts, c->time_base, audio_stream->time_base); if (pkt.duration > 0) pkt.duration = av_rescale_q(pkt.duration, c->time_base, audio_stream->time_base); pkt.stream_index = audio_stream->index; pkt.flags |= AV_PKT_FLAG_KEY; if (av_interleaved_write_frame(outfile, &pkt) != 0) { fprintf(stderr, "Error writing audio packet!\n"); if (frame) avcodec_free_frame(&frame); return -1; } av_free_packet(&pkt); } if (frame) avcodec_free_frame(&frame); return 0; }