我正在使用ffmpeg的transcoding.c示例进行工作。 当我将视频编码器编解码器设置为AV_CODEC_ID_H264并将音频编码器编解码器设置为AV_CODEC_ID_AAC时,我遇到了以下错误。
我该如何解决这个问题?
我该如何解决这个问题?
首先,感谢您提供的答案。
我的问题解决方案是AVBitStreamFilterContext*。我在“encode_write_frame”方法中添加了以下几行代码,问题得到了解决。
if(ifmt_ctx->streams[stream_index]->codec->codec_type == AVMEDIA_TYPE_VIDEO && ifmt_ctx->streams[stream_index]->codec->codec_id == AV_CODEC_ID_H264){
AVBitStreamFilterContext* h264BitstreamFilterContext = av_bitstream_filter_init("h264_mp4toannexb");
av_bitstream_filter_filter(h264BitstreamFilterContext, ofmt_ctx->streams[stream_index]->codec, NULL, &enc_pkt.data, &enc_pkt.size, enc_pkt.data, enc_pkt.size, 0);
} else if(ifmt_ctx->streams[stream_index]->codec->codec_id == AV_CODEC_ID_AAC) {
AVBitStreamFilterContext* aacBitstreamFilterContext = av_bitstream_filter_init("aac_adtstoasc");
av_bitstream_filter_filter(aacBitstreamFilterContext, ofmt_ctx->streams[stream_index]->codec, NULL, &enc_pkt.data, &enc_pkt.size, enc_pkt.data, enc_pkt.size, 0);
}
av_packet_rescale_ts
方法之前尝试过。代码运行完成,但生成的文件只有音频... - Setheronfoo.aac
并用其他程序打开。AV_CODEC_FLAG_GLOBAL_HEADER
,这意味着所有流只包含流数据,并且通过设置AVCodecContext.extradata
来提供其他数据。因为MP4有自己的传输元信息的方式(即传输信息),在每个帧之前编写该传输前缀将使数据无法读取。CODEC_FLAG_GLOBAL_HEADER
标志吗?//ofmt_ctx is AVFormatContext
//enc_ctx is the AVCodecContext of the current stream
if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
enc_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER;
没有这些元数据,编码器可能会将元数据添加到发送给容器的数据中。对于 AAC
,它是 ADTS
头,在 H264
中,它是 SPS
和 PPS
数据。
av_bitstream_filter_init
和av_bitstream_filter_filter
。 - aergistal