首页 > 其他分享 >ffmpeg SDK编码MP4 AAC的一处小坑

ffmpeg SDK编码MP4 AAC的一处小坑

时间:2024-03-20 20:35:44浏览次数:22  
标签:编码器 ffmpeg AAC avcodec rate MP4 codec DISPOSITION

在最新版的ffmpeg SDK中,如果我们按照一般的编码音频的步骤编码AAC并封入MP4,我们往往会写入一个很奇怪的音频Stream。它的MediaInfo会长这样:
image
如图所示,解码器不能理解这个流,会认为它就是一个ER Parametric而不能理解它是AAC。ffprobe查看stream其配置也会很奇怪:

[STREAM]
index=1
codec_name=aac
codec_long_name=AAC (Advanced Audio Coding)
profile=-1
codec_type=audio
codec_tag_string=mp4a
codec_tag=0x6134706d
sample_fmt=fltp
sample_rate=48000
channels=2
channel_layout=stereo
bits_per_sample=0
initial_padding=0
id=0x2
r_frame_rate=0/0
avg_frame_rate=0/0
time_base=1/48000
start_pts=0
start_time=0.000000
duration_ts=728064
duration=15.168000
bit_rate=126300
max_bit_rate=N/A
bits_per_raw_sample=N/A
nb_frames=712
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
DISPOSITION:captions=0
DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
TAG:language=und
TAG:handler_name=SoundHandler
TAG:vendor_id=[0][0][0][0]
[/STREAM]

ffprobe理解这个AAC流的profile是-1。很明显存在问题。

解决的方法是,要在使用avcodec_open2打开音频编码器之后,再执行avcodec_parameters_from_context拷贝参数。如果在打开编码器之前拷贝参数或者没有拷贝参数,打开编码器的过程所修改的一些参数就不会更新到流信息中,AAC信息也就无法被解析。

也就是说,我们需要:

// 先执行
avError = avcodec_open2(oAudioEncoderCxt, oAudioEncoder, 0);
// 再执行
avError = avcodec_parameters_from_context(oAudioStream->codecpar, oAudioEncoderCxt);

这样,编码器的一些参数就会在打开编码器后被更新到流信息里,即可正确编码可以被识别的AAC。

同时,如果有必要,建议为编码器上下文添加AV_CODEC_FLAG_GLOBAL_HEADER这个flag。也就是在初始化编码器上下文时配置:

oAudioEncoderCxt -> flags |= AV_CODEC_FLAG_GLOBAL_HEADER;

标签:编码器,ffmpeg,AAC,avcodec,rate,MP4,codec,DISPOSITION
From: https://www.cnblogs.com/izwb003/p/18086007/ffmpeg_encode_mp4_aac_problem

相关文章

  • ffmpeg实现视频的加密解密
    刚打开一个视频,发现居然是加密的,感觉这个还挺有意思的:然后店家还给了这样一个播放的软件,打开是这样的:看来是需要密码的,从potplayer的打印来看就是这个视频的一些类型不对了,因此设备无法识别,就没法打开,我发现ffmpeg也可以实现:加密方式:#使用AES-128-CBC算法对视频文件进行加......
  • FFmpeg-aac、h264封装flv及时间转换
    文章目录时间概念流程api核心代码时间概念dts:解码时间戳,表示压缩帧的解码时间pts:显示时间戳,表示将压缩帧解码后得到的原始帧的显示时间时间基:time_base,通常以ms为单位时间戳:timestamp,多少个时间基真实时间:time_base*timestamp如一个视频帧......
  • ffmpeg avformat_alloc_context System.NotSupportedException 不支持所指定的方法
    这个错误报了第二次了,网上搜不到靠谱的解决方案,赶快记录一下。第一个情况:报错如题目System.NotSupportedException不支持所指定的方法第二个情况:如果换autogen版本的话,我是用的5.1.2.3,切换到5.0或者其他版本的话,会提示avformat.59dllnotfound。这个报错根本原因是没找到对......
  • centos7安装ffmpeg
     CentOS7系统默认不包含FFmpeg工具,但可以通过安装第三方YUM源来安装。以下是安装FFmpeg的步骤:升级yum:sudoyuminstallepel-release-ysudoyumupdate-y安装NuxDextopYum源:sudorpm--importhttp://li.nux.ro/download/nux/RPM-GPG-KEY-nux.rosudorpm-Uvh......
  • FFmpeg开发笔记(六)如何访问Github下载FFmpeg源码
    ​学习FFmpeg的时候,经常要到GitHub下载各种开源代码,比如FFmpeg的源码页面位于https://github.com/FFmpeg/FFmpeg。然而国内访问GitHub很不稳定,经常打不开该网站,比如在命令行执行下面的ping命令。pinggithub.com上面的ping结果如下所示,可见默认解析的DNS地址连接超时。正在......
  • FFmpeg开发笔记(五)更新MSYS的密钥环
    ​ 《FFmpeg开发实战:从零基础到短视频上线》一书提到:使用MSYS对FFmpeg进行交叉编译时,需要事先安装交叉编译工具链,也就是执行下面命令。pacman-Smingw-w64-x86_64-toolchain一般情况可以正常安装交叉编译工具链,不过有时会提示错误“signaturefrom"DavidMacek<david.mace......
  • FFmpeg命令视频音频转码参数详解
    前言全局说明FFmpeg命令转码参数详解一、参数1.1FFmpeg常用参数参数说明备注-ifilename指定输入文件(或直接写文件名,用|竖线分割),在Linux下当然也能指定:0.0(屏幕录制)或摄像头。-c:v指定视频编码器copy、libx265-crf指定视频质量,范围为0-51,0为无损,23......
  • ffmpeg aiv转mp4
    MOV0001.AVI436Mffmpeg-y-iMOV00001.AVI-c:vlibx264-crf30-presetslow-c:aaac-b:a44k-ac21.mp4转换后130M-preset:指定编码的配置。x264编码算法有很多可供配置的参数,不同的参数值会导致编码的速度大相径庭,甚至可能影响质量。为了免去用户了解算法,然后手工配......
  • ffmpeg多路视频合并
    2,3,4路视频拼接可以参考下面:https://blog.csdn.net/tianshan2010/article/details/104737576https://blog.csdn.net/Gary__123456/article/details/887427054路拼接【上下左右】:ffmpeg-i1.mp4-i2.mp4-i3.mp4-i4.mp4-filter_complex"[0:v]pad=iw2:ih2[a];[a][1:v]ove......
  • window下使用Cygwin编译ffmpeg步骤和问题记录
    window下使用Cygwin编译ffmpeg步骤和问题记录1.编译环境搭建安装Cygwin到Cygwin官网下载Cygwin的可执行程序setup-x86_64.exe官网地址:https://cygwin.com/install.html安装包地址:https://cygwin.com/setup-x86_64.exe安装操作很简单,基本是下一步,下一步就可以安装过程中,......