当前位置: 首页 > article >正文

ffmpeg7.0 合并2个 aac 文件

    ffmpeg7.0 将2个aac文件合并。

#include <stdio.h>

// 之所以增加__cplusplus的宏定义,是为了同时兼容gcc编译器和g++编译器
#ifdef __cplusplus
extern "C"
{
#endif
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libavutil/avutil.h>
#ifdef __cplusplus
};
#endif

#pragma warning(disable:4996)

AVFormatContext* pFormatContext[2] = { NULL };
int g_nAudioIndex[2] = {-1};
AVStream* g_pStream[2] = {NULL};
AVCodecContext* g_pCodecContext[2] = {NULL};


bool Init(int nIndex, const char* pFileName)
{
    int nRet = avformat_open_input(&pFormatContext[nIndex], pFileName, NULL, NULL);
    if (nRet == 0) {
        nRet = avformat_find_stream_info(pFormatContext[nIndex], NULL);
        if (nRet >= 0) {
            g_nAudioIndex[nIndex] = av_find_best_stream(pFormatContext[nIndex], AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);
            if (g_nAudioIndex[nIndex] >= 0) {
                g_pStream[nIndex] = pFormatContext[nIndex]->streams[g_nAudioIndex[nIndex]];

                AVCodecID nCodecID = g_pStream[nIndex]->codecpar->codec_id;

                const AVCodec* pCodec = avcodec_find_decoder(nCodecID);
                if (pCodec) {
                    g_pCodecContext[nIndex] = avcodec_alloc_context3(pCodec);

                    nRet = avcodec_parameters_to_context(g_pCodecContext[nIndex], g_pStream[nIndex]->codecpar);
                    if (nRet >= 0) {
                        nRet = avcodec_open2(g_pCodecContext[nIndex], pCodec, NULL);
                        if (nRet == 0) {
                            return true;
                        }
                    }
                }
            }
        } 
    }
    return false;
}

void Uninit(int nIndex)
{
    avcodec_close(g_pCodecContext[nIndex]);

    avcodec_free_context(&g_pCodecContext[nIndex]);

    avformat_close_input(&pFormatContext[nIndex]);
    avformat_free_context(pFormatContext[nIndex]);
}

void _WriteFile(int nIndex, FILE* pFile)
{
    AVPacket* pPacket = av_packet_alloc();
    if (pPacket) {
        while (true) {
            int nRet = av_read_frame(pFormatContext[nIndex], pPacket);
            if (nRet < 0) {
                break;
            }

            if (pPacket->stream_index == g_nAudioIndex[nIndex]) {
                fwrite(pPacket->data, 1, pPacket->size, pFile); // AVPacket已经是一个完整的包,包括aac 数据头和aac 数据块
                av_packet_unref(pPacket); // 释放buffer
            }
        }

        av_packet_free(&pPacket);
    }
}

int main(int argc, char** argv)
{
    Init(0, "D:\\123.aac");
    Init(1, "D:\\234.aac");

    FILE* pFile = fopen("d:\\1.aac", "wb");
    _WriteFile(0, pFile);
    _WriteFile(1, pFile);
    fclose(pFile);

    Uninit(0);
    Uninit(1);
    return 0;
}

合并后,用网易云音乐app打开,正常播放,时间轴正常。

 


http://www.kler.cn/a/472371.html

相关文章:

  • 微信小程序map组件所有markers展示在视野范围内
  • 网络安全-web应用程序发展历程(基础篇)
  • flink cdc oceanbase(binlog模式)
  • 医学图像分析工具02:3D Slicer || 医学影像可视化与分析工具 支持第三方插件
  • 【机器学习】机器学习的基本分类-自监督学习(Self-supervised Learning)
  • 【形式篇】年终总结怎么写:PPT如何将内容更好地表现出来
  • 使用 MongoDB 构建高效的 NoSQL 数据库
  • ChatGPT如何赋能办公
  • 以太网MAC和PHY层问题的“对症下药”攻略
  • 缓存-Redis-API-Redission-可重入锁-原理
  • IWOA-GRU和GRU时间序列预测(改进的鲸鱼算法优化门控循环单元)
  • Centos7 安装MySQl8.0报错:“MySQL 8.0 Community Server“ 的 GPG 密钥已安装,但是不适用于此软件包
  • axios的学习笔记
  • 【SQL】进阶知识 — 各大数据库合并几条数据到一行的方式
  • 2025-01-07 Unity 使用 Tip3 —— 游戏保存数据到 Application.persistentDataPath 不生效解决方案更新
  • 基于Spring Boot的仓库租赁管理系统
  • el-dialog 组件 在<style lang=“scss“ scoped>标签
  • 2025-01-06日SSH钓鱼日志
  • 冬季蜂巢内蜂群运动的自动化监测
  • c++开源协程库libgo介绍及使用,srs协程,boost协程 Boost::fiber
  • Redis奇幻之旅(四)4. Redis Cluster
  • 使用systemd管理MySQL服务器
  • AI 平台 GPU 节点上运行基于 PyTorch 的深度学习任务
  • Mac中配置vscode(第一期:python开发)
  • 【Linux】UOS统信服务器本地yum源搭建实践
  • 1/7 C++