ffmpeg音频编码之pcm转码aac

news/2025/1/22 8:26:18/文章来源:https://www.cnblogs.com/navysummer/p/18238075

方法1:命令转码

# 转码ffmpeg -ac 2 -ar 48000 -f s16le -i input.pcm -acodec libfdk_aac output.aac
# 播放
ffplay output.aac

方法2:代码转码

 main.c

#include "libavutil/log.h"
#include "libavutil/avutil.h"
#include "libavcodec/avcodec.h"
#include "libavutil/parseutils.h"int encodeAudio(AVCodecContext *encoderCtx, AVFrame *frame, AVPacket *packet, FILE *dst) {int ret = avcodec_send_frame(encoderCtx, frame);if (ret < 0) {av_log(NULL, AV_LOG_ERROR, "avcodec_send_frame failed:%s\n", av_err2str(ret));return -1;}while (ret >= 0) {ret = avcodec_receive_packet(encoderCtx, packet);if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {return 0;} else if (ret < 0) {av_log(NULL, AV_LOG_ERROR, "avcodec_receive_packet failed:%s\n", av_err2str(ret));return -1;}fwrite(packet->data, 1, packet->size, dst);av_packet_unref(packet);}return 0;
}int main(int argc, char **argv) {av_log_set_level(AV_LOG_DEBUG);if (argc < 3) {av_log(NULL, AV_LOG_ERROR, "Usage: %s inputFile outputFile\n", argv[0]);return -1;}const char *inputFile = argv[1];const char *outputFile = argv[2];AVFrame *frame = av_frame_alloc();frame->sample_rate = 48000;frame->channels = 2;frame->channel_layout = AV_CH_LAYOUT_STEREO;frame->format = AV_SAMPLE_FMT_S16;frame->nb_samples = 1024;av_frame_get_buffer(frame, 0);AVCodec *encoder = avcodec_find_encoder_by_name("libfdk_aac");if (encoder == NULL) {av_log(NULL, AV_LOG_ERROR, "avcodec_find_encoder_by_name failed\n");av_frame_free(&frame);return -1;}AVCodecContext *encoderCtx = avcodec_alloc_context3(encoder);if (encoderCtx == NULL) {av_log(NULL, AV_LOG_ERROR, "avcodec_find_encoder_by_name failed\n");av_frame_free(&frame);return -1;}encoderCtx->sample_fmt = frame->format;encoderCtx->sample_rate = frame->sample_rate;encoderCtx->channels = frame->channels;encoderCtx->channel_layout = frame->channel_layout;int ret;ret = avcodec_open2(encoderCtx, encoder, NULL);if (ret < 0) {av_log(NULL, AV_LOG_ERROR, "avcodec_open2 failed\n");av_frame_free(&frame);avcodec_free_context(&encoderCtx);return -1;}FILE *inFp = fopen(inputFile, "rb");if (inFp == NULL) {av_log(NULL, AV_LOG_ERROR, "open input file failed\n");av_frame_free(&frame);avcodec_free_context(&encoderCtx);return -1;}FILE *ontFp = fopen(outputFile, "wb+");if (ontFp == NULL) {av_log(NULL, AV_LOG_ERROR, "open output file failed\n");av_frame_free(&frame);avcodec_free_context(&encoderCtx);fclose(inFp);return -1;}AVPacket *packet = av_packet_alloc();while (1) {size_t readSize = fread(frame->data[0], 1, frame->linesize[0], inFp);if (readSize == 0) {av_log(NULL, AV_LOG_INFO, "finish read input file\n");break;}encodeAudio(encoderCtx, frame, packet, ontFp);}encodeAudio(encoderCtx, NULL, packet, ontFp);av_frame_free(&frame);avcodec_free_context(&encoderCtx);fclose(inFp);fclose(ontFp);return 0;
}

Makefile

TARGET=main
SRC=main.c
CC=gcc
CFLAGS=-I /usr/local/ffmpeg/include
LDFLAGS=-L /usr/local/ffmpeg/lib
LDFLAGS+= -lavutil -lavformat -lavcodec -lswscale
all:$(TARGET)
$(TARGET):$(SRC)$(CC) $(SRC) $(CFLAGS) $(LDFLAGS) -o $(TARGET)
clean:rm -rf $(TARGET)

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/721666.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024第一届甲壳虫跑团百公里接力赛

2024第一届甲壳虫跑团百公里接力赛活动记录 经过统计大家的投票结果,甲壳虫跑团管理层决定于2024年6月2号举行第一届百公里接力赛活动。活动奖励每位参与接力和摄影的同学迷你玻璃杯一个。活动过程 早上八点,在东操场开始了第一棒的出发,本次接力采取传递“跑表”的形式,每…

Day17| 110.平衡二叉树、 257. 二叉树的所有路径 、 404.左叶子之和

110.平衡二叉树 (优先掌握递归) 再一次涉及到,什么是高度,什么是深度,可以巩固一下。 题目链接/文章讲解/视频讲解:https://programmercarl.com/0110.平衡二叉树.html # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=Non…

2024.6.7

18万条数据public class HotCategoryTop10_3 {public static void main(String[] args) {// TODO 搭建Spark的运行环境SparkConf conf = new SparkConf();conf.setAppName("HotCategoryTop10");conf.setMaster("local[*]"); // Yarn : Spark On YarnJavaSp…

Android Media Framework(三)OpenMAX API阅读与分析

这篇文章我们将聚焦Control API的功能与用法,为实现OMX Core、Component打下坚实的基础。1、OMX_Core.h OMX Core在OpenMAX IL架构中的位置位于IL Client与实际的OMX组件之间,OMX Core提供了两组API给IL Client使用,一组API用于管理OMX组件,另一组API用于操作/使用创建的OM…

Java (Redis)

前沿 让我们来学习下Redis吧官网下载客户端 https://app.redislabs.com/#/rlec-downloads什么是 Redis?Redis(Remote Dictionary Server)是一个开源的、高性能的、基于内存的键值存储系统。它支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。由于其基于内存的设…

NSSCTF——crypto

[鹤城杯 2021]easy_crypto [强网拟态 2021]拟态签到题 [SWPUCTF 2021 新生赛]crypto8[SWPUCTF 2021 新生赛]crypto7[SWPUCTF 2021 新生赛]crypto6[SWPUCTF 2021 新生赛]ez_caesar[SWPUCTF 2021 新生赛]…

攻防世界

misc 1.MeowMeowMeow 首先是是一个猫猫的图片,习惯先看看属性,放入hex中,发现一些特殊的符合继续往上翻,发现有一段密码用base64解码,得到提示Do you know what Ascii art is? Hint:I put the serect in a 01 Ascii art.像这样的艺术字,发现下面编码有点像字母 解出来是…

__init__.py

在Python的项目中,通常会看到__init__.py文件,当我们导入这个项目时,会优先执行该项目的__init__.py文件。当我们导入这个项目。或者这个项目的子模块时,都会优先执行该项目下的__init__.py文件。 该过程有缓存机制,连续导入一个父模块的不同子模块时,只会执行一次父模块…

PHP历理 PhpStorm的设置PHP版本

打开 文件 -> 设置 -> PHP -> 选择对应的PHP版本

客观谈谈上一中 or 凤城

首先是一个问题,为什么在一中各方面似乎都要强于凤城的情况下,还是会有许多人想去上凤城呢? 很简单,凤城给的实在是太多了( 只要你足够优秀,凤城似乎可以满足你大部分要求,有很多优惠条件,并且老师水平也不一定比一中差多少,还有高校专项计划诱人的降分,助力实现梦想…

AD给线周围铺铜只显示框的问题

如下图所示,想给直角线加斜边的铜,但是加完之后只有框没有铜(也选择了网络)解决方法如下: 点击这个框,在属性里面取消勾选Remove Islands Less Than 再选择Pour Over All Same Net Objects即可

Dragon_Knight_CTF-stack(栈迁移)

Dragon_Knight_CTF-stack(栈迁移) 程序的保护情况如下,可以看到没有开启pie保护 Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x3fe000)可以看道main函数也很简洁,只有一个0x10大小的溢出,程序…