/*
* Copyright (c) 2013-2022 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;
const AVStream *stream;
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;
}
stream = (*input_format_context)->streams[0];
/* Find a decoder for the audio stream. */
if (!(input_codec = avcodec_find_decoder(stream->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, stream->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;
}
/* Set the packet timebase for the decoder. */
avctx->pkt_timebase = stream->time_base;
/* 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. */
av_channel_layout_default(&avctx->ch_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;
/* Set the sample rate for the container. */
stream->time_base.den =
没有合适的资源?快使用搜索试试~ 我知道了~
音视频开发-FFmpeg-n5.1.2开发库
共377个文件
h:274个
c:23个
1:15个
需积分: 0 174 下载量 162 浏览量
2022-10-14
22:38:35
上传
评论 1
收藏 9.12MB 7Z 举报
温馨提示
这里是我程序中使用的FFmpeg库文件
资源详情
资源评论
资源推荐
收起资源包目录
音视频开发-FFmpeg-n5.1.2开发库 (377个子文件)
ffmpeg-all.1 1.77MB
ffprobe-all.1 1.4MB
ffplay-all.1 1.39MB
ffmpeg-filters.1 973KB
ffmpeg-codecs.1 207KB
ffmpeg-formats.1 178KB
ffmpeg.1 128KB
ffmpeg-devices.1 79KB
ffmpeg-protocols.1 78KB
ffprobe.1 43KB
ffmpeg-bitstream-filters.1 38KB
ffmpeg-utils.1 36KB
ffplay.1 31KB
ffmpeg-resampler.1 14KB
ffmpeg-scaler.1 9KB
libswresample.3 6KB
libswscale.3 5KB
libavutil.3 5KB
libavcodec.3 5KB
libavformat.3 5KB
libavdevice.3 5KB
libavfilter.3 5KB
libavutil.dll.a 376KB
libavcodec.dll.a 110KB
libavformat.dll.a 101KB
libavfilter.dll.a 41KB
libswscale.dll.a 22KB
libswresample.dll.a 17KB
libavdevice.dll.a 13KB
libpostproc.dll.a 7KB
transcode_aac.c 35KB
transcoding.c 22KB
muxing.c 21KB
demuxing_decoding.c 14KB
filter_audio.c 12KB
filtering_audio.c 10KB
vaapi_transcode.c 10KB
filtering_video.c 10KB
hw_decode.c 8KB
resampling_audio.c 8KB
decode_audio.c 7KB
qsvdec.c 7KB
vaapi_encode.c 7KB
encode_audio.c 7KB
encode_video.c 7KB
remuxing.c 7KB
extract_mvs.c 6KB
decode_video.c 6KB
http_multiclient.c 5KB
scaling_video.c 5KB
avio_list_dir.c 4KB
avio_reading.c 4KB
metadata.c 2KB
avutil-57.def 13KB
avcodec-59.def 4KB
avformat-59.def 4KB
avfilter-8.def 2KB
swscale-6.def 746B
avdevice-59.def 544B
swresample-4.def 519B
postproc-56.def 223B
avcodec-59.dll 13.11MB
avfilter-8.dll 3.86MB
avformat-59.dll 2.3MB
SDL2.dll 1.91MB
libiconv-2.dll 1.06MB
avutil-57.dll 923KB
swscale-6.dll 630KB
liblzma-5.dll 148KB
avdevice-59.dll 141KB
postproc-56.dll 130KB
swresample-4.dll 123KB
zlib1.dll 116KB
libbz2-1.dll 97KB
libwinpthread-1.dll 57KB
ffmpeg.exe 316KB
ffprobe.exe 181KB
ffplay.exe 150KB
libvpx-720p.ffpreset 246B
libvpx-1080p.ffpreset 246B
libvpx-1080p50_60.ffpreset 246B
libvpx-720p50_60.ffpreset 246B
libvpx-360p.ffpreset 237B
avcodec.h 114KB
avcodec.h 113KB
avformat.h 113KB
avformat.h 112KB
avfilter.h 44KB
avfilter.h 44KB
opt.h 37KB
opt.h 37KB
pixfmt.h 37KB
pixfmt.h 37KB
frame.h 32KB
frame.h 32KB
avio.h 32KB
avio.h 31KB
channel_layout.h 31KB
channel_layout.h 31KB
swresample.h 25KB
共 377 条
- 1
- 2
- 3
- 4
mahuifa
- 粉丝: 2w+
- 资源: 34
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0