Exemple #1
0
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;
}
Exemple #2
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;
}