Browse Source

Merge commit 'f27e262dbdea1991b22e08b639ac03e642a3482c'

* commit 'f27e262dbdea1991b22e08b639ac03e642a3482c':
  examples/encode_audio: switch to the new audio encoding API

Merged-by: Clément Bœsch <u@pkh.me>
tags/n3.4
Clément Bœsch 9 years ago
parent
commit
a434657de9
1 changed files with 41 additions and 28 deletions
  1. +41
    -28
      doc/examples/encode_audio.c

+ 41
- 28
doc/examples/encode_audio.c View File

@@ -92,14 +92,42 @@ static int select_channel_layout(const AVCodec *codec)
return best_ch_layout;
}

static void encode(AVCodecContext *ctx, AVFrame *frame, AVPacket *pkt,
FILE *output)
{
int ret;

/* send the frame for encoding */
ret = avcodec_send_frame(ctx, frame);
if (ret < 0) {
fprintf(stderr, "Error sending the frame to the encoder\n");
exit(1);
}

/* read all the available output packets (in general there may be any
* number of them */
while (ret >= 0) {
ret = avcodec_receive_packet(ctx, pkt);
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
return;
else if (ret < 0) {
fprintf(stderr, "Error encoding audio frame\n");
exit(1);
}

fwrite(pkt->data, 1, pkt->size, output);
av_packet_unref(pkt);
}
}

int main(int argc, char **argv)
{
const char *filename;
const AVCodec *codec;
AVCodecContext *c= NULL;
AVFrame *frame;
AVPacket pkt;
int i, j, k, ret, got_output;
AVPacket *pkt;
int i, j, k, ret;
FILE *f;
uint16_t *samples;
float t, tincr;
@@ -154,6 +182,13 @@ int main(int argc, char **argv)
exit(1);
}

/* packet for holding encoded output */
pkt = av_packet_alloc();
if (!pkt) {
fprintf(stderr, "could not allocate the packet\n");
exit(1);
}

/* frame containing input raw audio */
frame = av_frame_alloc();
if (!frame) {
@@ -176,10 +211,6 @@ int main(int argc, char **argv)
t = 0;
tincr = 2 * M_PI * 440.0 / c->sample_rate;
for (i = 0; i < 200; i++) {
av_init_packet(&pkt);
pkt.data = NULL; // packet data will be allocated by the encoder
pkt.size = 0;

/* make sure the frame is writable -- makes a copy if the encoder
* kept a reference internally */
ret = av_frame_make_writable(frame);
@@ -194,34 +225,16 @@ int main(int argc, char **argv)
samples[2*j + k] = samples[2*j];
t += tincr;
}
/* encode the samples */
ret = avcodec_encode_audio2(c, &pkt, frame, &got_output);
if (ret < 0) {
fprintf(stderr, "Error encoding audio frame\n");
exit(1);
}
if (got_output) {
fwrite(pkt.data, 1, pkt.size, f);
av_packet_unref(&pkt);
}
encode(c, frame, pkt, f);
}

/* get the delayed frames */
for (got_output = 1; got_output; i++) {
ret = avcodec_encode_audio2(c, &pkt, NULL, &got_output);
if (ret < 0) {
fprintf(stderr, "Error encoding frame\n");
exit(1);
}
/* flush the encoder */
encode(c, NULL, pkt, f);

if (got_output) {
fwrite(pkt.data, 1, pkt.size, f);
av_packet_unref(&pkt);
}
}
fclose(f);

av_frame_free(&frame);
av_packet_free(&pkt);
avcodec_free_context(&c);

return 0;


Loading…
Cancel
Save