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打开,正常播放,时间轴正常。