/*
* Copyright (c) 2013-2018 Andreas Unterweger
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/**
* @file
* Simple audio converter
*
* @example transcode_aac.c
* Convert an input audio file to AAC in an MP4 container using FFmpeg.
* Formats other than MP4 are supported based on the output file extension.
* @author Andreas Unterweger (dustsigns@gmail.com)
*/
#include <stdio.h>
#include "libavformat/avformat.h"
#include "libavformat/avio.h"
#include "libavcodec/avcodec.h"
#include "libavutil/audio_fifo.h"
#include "libavutil/avassert.h"
#include "libavutil/avstring.h"
#include "libavutil/channel_layout.h"
#include "libavutil/frame.h"
#include "libavutil/opt.h"
#include "libswresample/swresample.h"
/* The output bit rate in bit/s */
#define OUTPUT_BIT_RATE 96000
/* The number of output channels */
#define OUTPUT_CHANNELS 2
/**
* Open an input file and the required decoder.
* @param filename File to be opened
* @param[out] input_format_context Format context of opened file
* @param[out] input_codec_context Codec context of opened file
* @return Error code (0 if successful)
*/
static int open_input_file(const char *filename,
AVFormatContext **input_format_context,
AVCodecContext **input_codec_context)
{
AVCodecContext *avctx;
const AVCodec *input_codec;
int error;
/* Open the input file to read from it. */
if ((error = avformat_open_input(input_format_context, filename, NULL,
NULL)) < 0) {
fprintf(stderr, "Could not open input file '%s' (error '%s')\n",
filename, av_err2str(error));
*input_format_context = NULL;
return error;
}
/* Get information on the input file (number of streams etc.). */
if ((error = avformat_find_stream_info(*input_format_context, NULL)) < 0) {
fprintf(stderr, "Could not open find stream info (error '%s')\n",
av_err2str(error));
avformat_close_input(input_format_context);
return error;
}
/* Make sure that there is only one stream in the input file. */
if ((*input_format_context)->nb_streams != 1) {
fprintf(stderr, "Expected one audio input stream, but found %d\n",
(*input_format_context)->nb_streams);
avformat_close_input(input_format_context);
return AVERROR_EXIT;
}
/* Find a decoder for the audio stream. */
if (!(input_codec = avcodec_find_decoder((*input_format_context)->streams[0]->codecpar->codec_id))) {
fprintf(stderr, "Could not find input codec\n");
avformat_close_input(input_format_context);
return AVERROR_EXIT;
}
/* Allocate a new decoding context. */
avctx = avcodec_alloc_context3(input_codec);
if (!avctx) {
fprintf(stderr, "Could not allocate a decoding context\n");
avformat_close_input(input_format_context);
return AVERROR(ENOMEM);
}
/* Initialize the stream parameters with demuxer information. */
error = avcodec_parameters_to_context(avctx, (*input_format_context)->streams[0]->codecpar);
if (error < 0) {
avformat_close_input(input_format_context);
avcodec_free_context(&avctx);
return error;
}
/* Open the decoder for the audio stream to use it later. */
if ((error = avcodec_open2(avctx, input_codec, NULL)) < 0) {
fprintf(stderr, "Could not open input codec (error '%s')\n",
av_err2str(error));
avcodec_free_context(&avctx);
avformat_close_input(input_format_context);
return error;
}
/* Save the decoder context for easier access later. */
*input_codec_context = avctx;
return 0;
}
/**
* Open an output file and the required encoder.
* Also set some basic encoder parameters.
* Some of these parameters are based on the input file's parameters.
* @param filename File to be opened
* @param input_codec_context Codec context of input file
* @param[out] output_format_context Format context of output file
* @param[out] output_codec_context Codec context of output file
* @return Error code (0 if successful)
*/
static int open_output_file(const char *filename,
AVCodecContext *input_codec_context,
AVFormatContext **output_format_context,
AVCodecContext **output_codec_context)
{
AVCodecContext *avctx = NULL;
AVIOContext *output_io_context = NULL;
AVStream *stream = NULL;
const AVCodec *output_codec = NULL;
int error;
/* Open the output file to write to it. */
if ((error = avio_open(&output_io_context, filename,
AVIO_FLAG_WRITE)) < 0) {
fprintf(stderr, "Could not open output file '%s' (error '%s')\n",
filename, av_err2str(error));
return error;
}
/* Create a new format context for the output container format. */
if (!(*output_format_context = avformat_alloc_context())) {
fprintf(stderr, "Could not allocate output format context\n");
return AVERROR(ENOMEM);
}
/* Associate the output file (pointer) with the container format context. */
(*output_format_context)->pb = output_io_context;
/* Guess the desired container format based on the file extension. */
if (!((*output_format_context)->oformat = av_guess_format(NULL, filename,
NULL))) {
fprintf(stderr, "Could not find output file format\n");
goto cleanup;
}
if (!((*output_format_context)->url = av_strdup(filename))) {
fprintf(stderr, "Could not allocate url.\n");
error = AVERROR(ENOMEM);
goto cleanup;
}
/* Find the encoder to be used by its name. */
if (!(output_codec = avcodec_find_encoder(AV_CODEC_ID_AAC))) {
fprintf(stderr, "Could not find an AAC encoder.\n");
goto cleanup;
}
/* Create a new audio stream in the output file container. */
if (!(stream = avformat_new_stream(*output_format_context, NULL))) {
fprintf(stderr, "Could not create new stream\n");
error = AVERROR(ENOMEM);
goto cleanup;
}
avctx = avcodec_alloc_context3(output_codec);
if (!avctx) {
fprintf(stderr, "Could not allocate an encoding context\n");
error = AVERROR(ENOMEM);
goto cleanup;
}
/* Set the basic encoder parameters.
* The input file's sample rate is used to avoid a sample rate conversion. */
avctx->channels = OUTPUT_CHANNELS;
avctx->channel_layout = av_get_default_channel_layout(OUTPUT_CHANNELS);
avctx->sample_rate = input_codec_context->sample_rate;
avctx->sample_fmt = output_codec->sample_fmts[0];
avctx->bit_rate = OUTPUT_BIT_RATE;
/* Allow the use of the experimental AAC encoder. */
avctx->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
/* Set the sample rate for the container. */
stream->time_base.den = input_codec_context->sample_rate;
stream->time_base.num = 1;
/* Some container formats (like MP4) require global headers to be present.
* Mark
没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
收起资源包目录
4.4版本ffmpeg windows动态库,包含32位和64位,支持X264和X265 (372个子文件)
transcode_aac.c 34KB
transcode_aac.c 34KB
transcoding.c 22KB
transcoding.c 22KB
muxing.c 21KB
muxing.c 21KB
demuxing_decoding.c 13KB
demuxing_decoding.c 13KB
filter_audio.c 12KB
filter_audio.c 12KB
filtering_audio.c 10KB
filtering_audio.c 10KB
vaapi_transcode.c 10KB
vaapi_transcode.c 10KB
filtering_video.c 9KB
filtering_video.c 9KB
hw_decode.c 8KB
hw_decode.c 8KB
resampling_audio.c 8KB
resampling_audio.c 8KB
decode_audio.c 7KB
decode_audio.c 7KB
qsvdec.c 7KB
qsvdec.c 7KB
vaapi_encode.c 7KB
vaapi_encode.c 7KB
encode_audio.c 6KB
encode_audio.c 6KB
encode_video.c 6KB
encode_video.c 6KB
remuxing.c 6KB
remuxing.c 6KB
extract_mvs.c 6KB
extract_mvs.c 6KB
decode_video.c 5KB
decode_video.c 5KB
http_multiclient.c 5KB
http_multiclient.c 5KB
scaling_video.c 5KB
scaling_video.c 5KB
avio_list_dir.c 4KB
avio_list_dir.c 4KB
avio_reading.c 4KB
avio_reading.c 4KB
metadata.c 2KB
metadata.c 2KB
avutil-57.def 13KB
avutil-57.def 13KB
avcodec-59.def 4KB
avcodec-59.def 4KB
avformat-59.def 4KB
avformat-59.def 4KB
avfilter-8.def 2KB
avfilter-8.def 2KB
swscale-6.def 778B
swscale-6.def 778B
avdevice-59.def 581B
avdevice-59.def 581B
swresample-4.def 496B
swresample-4.def 496B
avcodec-59.dll 17.61MB
avcodec-59.dll 13.53MB
avfilter-8.dll 5.31MB
avfilter-8.dll 4.18MB
avformat-59.dll 3.67MB
avformat-59.dll 3.03MB
avutil-57.dll 1.73MB
swscale-6.dll 1.38MB
avutil-57.dll 1.32MB
swscale-6.dll 1.02MB
avdevice-59.dll 802KB
swresample-4.dll 707KB
avdevice-59.dll 623KB
swresample-4.dll 557KB
ffmpeg.exe 1MB
ffmpeg.exe 805KB
ffprobe.exe 786KB
ffprobe.exe 612KB
libvpx-1080p50_60.ffpreset 227B
libvpx-720p.ffpreset 227B
libvpx-1080p.ffpreset 227B
libvpx-720p50_60.ffpreset 227B
libvpx-720p.ffpreset 227B
libvpx-1080p.ffpreset 227B
libvpx-1080p50_60.ffpreset 227B
libvpx-720p50_60.ffpreset 227B
libvpx-360p.ffpreset 219B
libvpx-360p.ffpreset 219B
avcodec.h 110KB
avcodec.h 110KB
avformat.h 110KB
avformat.h 110KB
avfilter.h 42KB
avfilter.h 42KB
pixfmt.h 36KB
pixfmt.h 36KB
opt.h 36KB
opt.h 36KB
avio.h 30KB
avio.h 30KB
共 372 条
- 1
- 2
- 3
- 4
全才欧巴
- 粉丝: 6
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1