2 * Copyright (c) 2001 Fabrice Bellard
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to deal
6 * in the Software without restriction, including without limitation the rights
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 * copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 * @file libavcodec encoding audio API usage examples
25 * @example encode_audio.c
27 * Generate a synthetic audio signal and encode it to an output MP2 file.
41/* check that a given sample format is supported by the encoder */
44 const void *out_config;
46 0, &out_config,
NULL);
48 fprintf(stderr,
"Error getting supported sample formats\n");
64/* just pick the highest supported samplerate */
67 const void *out_config;
69 0, &out_config,
NULL);
71 fprintf(stderr,
"Error getting supported sample rates\n");
74 const int *p = out_config;
75 int best_samplerate = 0;
81 if (!best_samplerate ||
abs(44100 - *p) <
abs(44100 - best_samplerate))
85 return best_samplerate;
88/* select layout with the highest channel count */
91 const void *out_config;
93 0, &out_config,
NULL);
95 fprintf(stderr,
"Error getting supported channel layouts\n");
99 int best_nb_channels = 0;
104 while (p->nb_channels) {
105 int nb_channels = p->nb_channels;
107 if (nb_channels > best_nb_channels) {
109 best_nb_channels = nb_channels;
121 /* send the frame for encoding */
124 fprintf(stderr,
"Error sending the frame to the encoder\n");
128 /* read all the available output packets (in general there may be any
135 fprintf(stderr,
"Error encoding audio frame\n");
139 fwrite(
pkt->data, 1,
pkt->size, output);
144 int main(
int argc,
char **argv)
146 const char *filename;
157 fprintf(stderr,
"Usage: %s <output file>\n", argv[0]);
162 /* find the MP2 encoder */
165 fprintf(stderr,
"Codec not found\n");
171 fprintf(stderr,
"Could not allocate audio codec context\n");
175 /* put sample parameters */
178 /* check that the encoder supports s16 pcm input */
181 fprintf(stderr,
"Encoder does not support sample format %s",
186 /* select other audio parameters supported by the encoder */
194 fprintf(stderr,
"Could not open codec\n");
198 f = fopen(filename,
"wb");
200 fprintf(stderr,
"Could not open %s\n", filename);
204 /* packet for holding encoded output */
207 fprintf(stderr,
"could not allocate the packet\n");
211 /* frame containing input raw audio */
214 fprintf(stderr,
"Could not allocate audio frame\n");
218 frame->nb_samples =
c->frame_size;
219 frame->format =
c->sample_fmt;
224 /* allocate the data buffers */
227 fprintf(stderr,
"Could not allocate audio data buffers\n");
231 /* encode a single tone sound */
233 tincr = 2 *
M_PI * 440.0 /
c->sample_rate;
234 for (
i = 0;
i < 200;
i++) {
235 /* make sure the frame is writable -- makes a copy if the encoder
236 * kept a reference internally */
240 samples = (uint16_t*)
frame->data[0];
242 for (j = 0; j <
c->frame_size; j++) {
243 samples[
c->ch_layout.nb_channels*j] = (int)(sin(t) * 10000);
245 for (k = 1; k <
c->ch_layout.nb_channels; k++)
246 samples[
c->ch_layout.nb_channels*j + k] = samples[
c->ch_layout.nb_channels*j];
252 /* flush the encoder */
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
static AVFormatContext * ctx
Libavcodec external API header.
#define i(width, name, range_min, range_max)
Public libavutil channel layout APIs header.
common internal and external API header
static int select_channel_layout(const AVCodec *codec, AVChannelLayout *dst)
static void encode(AVCodecContext *ctx, AVFrame *frame, AVPacket *pkt, FILE *output)
static int check_sample_fmt(const AVCodec *codec, enum AVSampleFormat sample_fmt)
static int select_sample_rate(const AVCodec *codec)
reference-counted frame API
int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options)
Initialize the AVCodecContext to use the given AVCodec.
AVCodecContext * avcodec_alloc_context3(const AVCodec *codec)
Allocate an AVCodecContext and set its fields to default values.
const AVCodec * avcodec_find_encoder(enum AVCodecID id)
Find a registered encoder with a matching codec ID.
void avcodec_free_context(AVCodecContext **avctx)
Free the codec context and everything associated with it and write NULL to the provided pointer.
int avcodec_receive_packet(AVCodecContext *avctx, AVPacket *avpkt)
Read encoded data from the encoder.
int avcodec_send_frame(AVCodecContext *avctx, const AVFrame *frame)
Supply a raw video or audio frame to the encoder.
int avcodec_get_supported_config(const AVCodecContext *avctx, const AVCodec *codec, enum AVCodecConfig config, unsigned flags, const void **out, int *out_num)
Retrieve a list of all supported values for a given configuration type.
@ AV_CODEC_CONFIG_SAMPLE_FORMAT
AVSampleFormat, terminated by AV_SAMPLE_FMT_NONE.
@ AV_CODEC_CONFIG_SAMPLE_RATE
int, terminated by 0
@ AV_CODEC_CONFIG_CHANNEL_LAYOUT
AVChannelLayout, terminated by {0}.
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
#define AV_CHANNEL_LAYOUT_STEREO
int av_channel_layout_copy(AVChannelLayout *dst, const AVChannelLayout *src)
Make a copy of a channel layout.
#define AVERROR_EOF
End of file.
int av_frame_get_buffer(AVFrame *frame, int align)
Allocate new buffer(s) for audio or video data.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
int av_frame_make_writable(AVFrame *frame)
Ensure that the frame data is writable, avoiding data copy if possible.
const char * av_get_sample_fmt_name(enum AVSampleFormat sample_fmt)
Return the name of sample_fmt, or NULL if sample_fmt is not recognized.
AVSampleFormat
Audio sample formats.
@ AV_SAMPLE_FMT_S16
signed 16 bits
An AVChannelLayout holds information about the channel layout of audio data.
main external API structure.
This structure describes decoded (raw) audio or video data.
This structure stores compressed data.