|
|
@@ -553,23 +553,16 @@ int encoder_aac::add_adts_header(AVPacket *packet)
|
|
|
|
|
|
// ADTS头部长度为7字节
|
|
|
const int adts_header_size = 7;
|
|
|
- int new_size = packet->size + adts_header_size;
|
|
|
-
|
|
|
- // 创建新的缓冲区
|
|
|
- uint8_t *new_data = (uint8_t*)av_malloc(new_size);
|
|
|
- if (!new_data) {
|
|
|
- al_error("Failed to allocate memory for ADTS header");
|
|
|
- return AE_FFMPEG_ALLOC_FRAME_FAILED;
|
|
|
- }
|
|
|
-
|
|
|
+ const int new_size = packet->size + adts_header_size;
|
|
|
+
|
|
|
// 生成ADTS头部
|
|
|
- uint8_t adts_header[7];
|
|
|
-
|
|
|
+ uint8_t adts_header[adts_header_size];
|
|
|
+
|
|
|
// 获取编码器参数
|
|
|
int sample_rate = _encoder_ctx->sample_rate;
|
|
|
int channels = ffmpeg_get_codec_context_channels(_encoder_ctx);
|
|
|
int profile = _encoder_ctx->profile; // AAC-LC = 1
|
|
|
-
|
|
|
+
|
|
|
// 采样率索引映射
|
|
|
int freq_idx = 4; // 默认44100Hz
|
|
|
switch (sample_rate) {
|
|
|
@@ -584,14 +577,14 @@ int encoder_aac::add_adts_header(AVPacket *packet)
|
|
|
case 16000: freq_idx = 8; break;
|
|
|
case 12000: freq_idx = 9; break;
|
|
|
case 11025: freq_idx = 10; break;
|
|
|
- case 8000: freq_idx = 11; break;
|
|
|
- default: freq_idx = 4; break;
|
|
|
+ case 8000: freq_idx = 11; break;
|
|
|
+ default: freq_idx = 4; break;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 声道配置
|
|
|
int channel_config = channels;
|
|
|
if (channels > 6) channel_config = 0; // 自定义配置
|
|
|
-
|
|
|
+
|
|
|
// 构建ADTS头部
|
|
|
adts_header[0] = 0xFF; // syncword (12 bits) - 高8位
|
|
|
adts_header[1] = 0xF0 | (0 << 3) | (0 << 2) | 1; // syncword低4位 + MPEG版本 + Layer + protection_absent
|
|
|
@@ -600,19 +593,48 @@ int encoder_aac::add_adts_header(AVPacket *packet)
|
|
|
adts_header[4] = (new_size >> 3) & 0xFF;
|
|
|
adts_header[5] = ((new_size & 7) << 5) | 0x1F;
|
|
|
adts_header[6] = 0xFC; // number_of_raw_data_blocks_in_frame (2 bits) + 6位填充
|
|
|
-
|
|
|
- // 复制ADTS头部和原始数据
|
|
|
- memcpy(new_data, adts_header, adts_header_size);
|
|
|
- memcpy(new_data + adts_header_size, packet->data, packet->size);
|
|
|
-
|
|
|
- // 释放原始数据并更新packet
|
|
|
+
|
|
|
+ // 备份原始包的时间戳与元数据
|
|
|
+ int64_t old_pts = packet->pts;
|
|
|
+ int64_t old_dts = packet->dts;
|
|
|
+ int64_t old_duration = packet->duration;
|
|
|
+ int old_flags = packet->flags;
|
|
|
+ int old_stream_index = packet->stream_index;
|
|
|
+ int64_t old_pos = packet->pos;
|
|
|
+
|
|
|
+ // 创建新包并拷贝数据(头部+原数据),以避免清空原包导致PTS/DTS丢失
|
|
|
+ AVPacket *new_pkt = av_packet_alloc();
|
|
|
+ if (!new_pkt) {
|
|
|
+ al_error("Failed to allocate AVPacket for ADTS header");
|
|
|
+ return AE_FFMPEG_ALLOC_FRAME_FAILED;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (av_new_packet(new_pkt, new_size) < 0) {
|
|
|
+ av_packet_free(&new_pkt);
|
|
|
+ al_error("Failed to allocate packet buffer for ADTS header");
|
|
|
+ return AE_FFMPEG_ALLOC_FRAME_FAILED;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 拷贝ADTS头部和原始数据
|
|
|
+ memcpy(new_pkt->data, adts_header, adts_header_size);
|
|
|
+ memcpy(new_pkt->data + adts_header_size, packet->data, packet->size);
|
|
|
+
|
|
|
+ // 恢复时间戳与元数据
|
|
|
+ new_pkt->pts = old_pts;
|
|
|
+ new_pkt->dts = old_dts;
|
|
|
+ new_pkt->duration = old_duration;
|
|
|
+ new_pkt->flags = old_flags;
|
|
|
+ new_pkt->stream_index = old_stream_index;
|
|
|
+ new_pkt->pos = old_pos;
|
|
|
+
|
|
|
+ // 用新包替换旧包
|
|
|
av_packet_unref(packet);
|
|
|
- packet->data = new_data;
|
|
|
- packet->size = new_size;
|
|
|
-
|
|
|
- al_debug("ADTS header added: total_size=%d, profile=%d, freq_idx=%d, channels=%d",
|
|
|
- new_size, profile, freq_idx, channels);
|
|
|
-
|
|
|
+ av_packet_move_ref(packet, new_pkt);
|
|
|
+ av_packet_free(&new_pkt);
|
|
|
+
|
|
|
+ al_debug("ADTS header added: total_size=%d, profile=%d, freq_idx=%d, channels=%d (pts=%lld, dts=%lld)",
|
|
|
+ new_size, profile, freq_idx, channels, packet->pts, packet->dts);
|
|
|
+
|
|
|
return AE_NO;
|
|
|
}
|
|
|
|