8k双声道的pcmu格式重采样44.1kHz并转码aac格式例子
src : 其中adts包是给aac填充头部的,这里就没给了。

package mainimport("github.com/ailumiyana/goav-incr/goav/avcodec""github.com/ailumiyana/goav-incr/goav/avutil""github.com/ailumiyana/goav-incr/goav/avfilter""unsafe""os""io/ioutil""log""strconv""adts"
)func main() {avutil.AvLogSetLevel(avutil.AV_LOG_TRACE)//decoderpkt            := avcodec.AvPacketAlloc()if pkt == nil {log.Panic("AvPacketAlloc failed.")}codec          := avcodec.AvcodecFindDecoder(avcodec.CodecId(avcodec.AV_CODEC_ID_PCM_MULAW))if codec == nil {log.Panic("AvcodecFindDecoder failed.")}context      := codec.AvcodecAllocContext3()if context == nil {log.Panic("AvcodecAllocContext3 failed.")}frame          := avutil.AvFrameAlloc()if frame == nil {log.Panic("AvFrameAlloc failed.")}//设置通道数context.SetAudioDecodeParamsTest(2)context.AvcodecOpen2(codec, nil)//encodercodec_enc            := avcodec.AvcodecFindEncoder(avcodec.CodecId(avcodec.AV_CODEC_ID_AAC))if codec_enc == nil {log.Panic("AvcodecFindEncoder failed.")}pkt_enc            := avcodec.AvPacketAlloc()if pkt_enc == nil {log.Panic("AvPacketAlloc failed.")}context_enc        := codec_enc.AvcodecAllocContext3()if context_enc == nil {log.Panic("AvcodecAllocContext3 failed.")}context_enc.SetAudioEncodeParams(128000, 44100, "stereo", avcodec.AV_SAMPLE_FMT_FLTP)err := context_enc.AvcodecOpen2(codec_enc, nil)if err < 0 {log.Panic("AvcodecOpen2 failed.")}//filtergraph := avfilter.AvfilterGraphAlloc()if graph == nil {log.Fatal("AvfilterGraphAlloc Failed.")}inputs  := avfilter.AvfilterInoutAlloc()outputs := avfilter.AvfilterInoutAlloc()if inputs == nil || outputs == nil {log.Fatal("AvfilterInoutAlloc Failed.")}defer avfilter.AvfilterInoutFree(inputs)defer avfilter.AvfilterInoutFree(outputs)var buffersrc *avfilter.Filtervar buffersink *avfilter.Filterbuffersrc  = avfilter.AvfilterGetByName("abuffer")buffersink = avfilter.AvfilterGetByName("abuffersink")if buffersink == nil || buffersrc == nil {log.Panic("AvfilterGetByName Failed.")}ret := graph.AvfilterGraphParse2("aresample=44100,aformat=sample_fmts=fltp:channel_layouts=stereo,asetnsamples=1024", &inputs, &outputs)if ret < 0 {log.Panic("AvfilterInoutAlloc Failed des : ", avutil.ErrorFromCode(ret))}var ins    []*avfilter.Contextvar outs   []*avfilter.Contextvar frames []*avutil.Frame// inputsindex := 0for cur := inputs; cur != nil; cur = cur.Next() {var in *avfilter.ContextinName := "in" + strconv.Itoa(index)ret = avfilter.AvfilterGraphCreateFilter(&in, buffersrc, inName, "sample_rate=8000:time_base=1/8000:sample_fmt=s16:channel_layout=stereo", 0, graph)if ret < 0 {log.Panic("AvfilterGraphCreateFilter Failed des : ", avutil.ErrorFromCode(ret))}ins = append(ins, in)ret = avfilter.AvfilterLink(ins[index], 0, cur.FilterContext(), cur.PadIdx())if ret < 0 {log.Panic("AvfilterLink Failed des : ", avutil.ErrorFromCode(ret))}index++}// outputsindex = 0for cur := outputs; cur != nil; cur = cur.Next() {var out *avfilter.ContextoutName := "out" + strconv.Itoa(index)ret = avfilter.AvfilterGraphCreateFilter(&out, buffersink, outName, "", 0, graph)if ret < 0 {log.Panic("AvfilterGraphCreateFilter Failed des : ", avutil.ErrorFromCode(ret))}outs = append(outs, out)ret = avfilter.AvfilterLink(cur.FilterContext(), cur.PadIdx(), outs[index], 0)if ret < 0 {log.Panic("AvfilterLink Failed des : ", avutil.ErrorFromCode(ret))}index++f := avutil.AvFrameAlloc()if f == nil {log.Panic("AvFrameAlloc failed.")}frames = append(frames, f)}ret = graph.AvfilterGraphConfig(0)if ret < 0 {log.Panic("AvfilterGraphConfig Failed des : ", avutil.ErrorFromCode(ret))}//input pcm filedata, errr := ioutil.ReadFile("ilem8kmulaw.pcm")if errr != nil {log.Panic("File reading error", err)}l := len(data)//parser := make([]byte, 160)offset := -160//out aac file file, errr := os.Create("./out.aac")if errr != nil {log.Panic("Error Reading")}defer file.Close()//handleapts := int64(0)for offset + 160 < l {offset+=160pkt.AvPacketFromData(data[offset:offset+160], 160)ret := context.AvcodecSendPacket(pkt)if ret < 0 {log.Println("AvcodecSendPacket err ", avutil.ErrorFromCode(ret))}ret = context.AvcodecReceiveFrame((*avcodec.Frame)(unsafe.Pointer(frame)))if ret < 0 {log.Println("AvcodecReceiveFrame err ", avutil.ErrorFromCode(ret))}if ret == 0 {             apts += 160frame.SetPts(apts)frame.SetSampleRate(8000)ret := avfilter.AvBuffersrcAddFrame(ins[0], (*avfilter.Frame)(unsafe.Pointer(frame)))if ret < 0 {log.Println("AvBuffersrcAddFrame error :", avutil.ErrorFromCode(ret))}log.Println("---------")ret = avfilter.AvBufferSinkGetFrame(outs[0], (*avfilter.Frame)(unsafe.Pointer(frames[0])))if ret == -11 {log.Println("AvBufferSinkGetFrame Failed des : ", ret, avutil.ErrorFromCode(ret))avutil.AvFrameUnref(frame)continue}if frames[0] != nil {ret = context_enc.AvcodecSendFrame((*avcodec.Frame)(unsafe.Pointer(frames[0])))if ret < 0 {log.Panic("AvcodecSendFrame err ", avutil.ErrorFromCode(ret))}ret := context_enc.AvcodecReceivePacket(pkt_enc)if ret < 0 {if ret == -11 {log.Println("AvcodecReceivePacket Failed des : ", ret, avutil.ErrorFromCode(ret))avutil.AvFrameUnref(frame)continue}log.Panic("AvcodecReceivePacket err ", avutil.ErrorFromCode(ret))}log.Println("=================================")if ret == 0 {data0 := pkt_enc.Data()buf := make([]byte, pkt_enc.GetPacketSize())start := uintptr(unsafe.Pointer(data0))for i := 0; i < pkt_enc.GetPacketSize(); i++ {elem := *(*uint8)(unsafe.Pointer(start + uintptr(i)))buf[i] = elem}header := adts.Default()header.SetFrameSize(uint16(len(buf)))b := append(header.Bytes()[0:], buf[0:]...)file.Write(b)}avutil.AvFrameUnref(frames[0])}}avutil.AvFrameUnref(frame)}}
detected 8 logical cores
[Parsed_aresample_0 @ 000000000089fe00] Setting 'sample_rate' to value '44100'
[Parsed_aformat_1 @ 00000000001fd5c0] Setting 'sample_fmts' to value 'fltp'
[Parsed_aformat_1 @ 00000000001fd5c0] Setting 'channel_layouts' to value 'stereo'
[Parsed_asetnsamples_2 @ 00000000001fe6c0] Setting 'nb_out_samples' to value '1024'
[in0 @ 00000000001feac0] Setting 'sample_rate' to value '8000'
[in0 @ 00000000001feac0] Setting 'time_base' to value '1/8000'
[in0 @ 00000000001feac0] Setting 'sample_fmt' to value 's16'
[in0 @ 00000000001feac0] Setting 'channel_layout' to value 'stereo'
[in0 @ 00000000001feac0] tb:1/8000 samplefmt:s16 samplerate:8000 chlayout:stereo
[AVFilterGraph @ 0000000003ad6b80] query_formats: 5 queried, 12 merged, 0 already done, 0 delayed
[Parsed_aresample_0 @ 000000000089fe00] [SWR @ 000000000089ffc0] Using fltp internally between filters
[Parsed_aresample_0 @ 000000000089fe00] ch:2 chl:stereo fmt:s16 r:8000Hz -> ch:2 chl:stereo fmt:fltp r:44100Hz

[ffmpeg][goav]ffmpeg代码例子pcmu重采样并转码aac格式相关推荐

  1. 最简单的基于FFmpeg的移动端例子:IOS 视频转码器

    ===================================================== 最简单的基于FFmpeg的移动端例子系列文章列表: 最简单的基于FFmpeg的移动端例子:A ...

  2. 最简单的基于FFmpeg的移动端例子:Android 视频转码器

    ===================================================== 最简单的基于FFmpeg的移动端例子系列文章列表: 最简单的基于FFmpeg的移动端例子:A ...

  3. 最简单的基于FFmpeg的移动端例子:Windows Phone HelloWorld

    ===================================================== 最简单的基于FFmpeg的移动端例子系列文章列表: 最简单的基于FFmpeg的移动端例子:A ...

  4. 最简单的基于FFmpeg的移动端例子:IOS 视频解码器

    ===================================================== 最简单的基于FFmpeg的移动端例子系列文章列表: 最简单的基于FFmpeg的移动端例子:A ...

  5. 最简单的基于FFmpeg的移动端例子:IOS HelloWorld

    ===================================================== 最简单的基于FFmpeg的移动端例子系列文章列表: 最简单的基于FFmpeg的移动端例子:A ...

  6. 最简单的基于FFmpeg的移动端例子附件:SDL Android HelloWorld

    ===================================================== 最简单的基于FFmpeg的移动端例子系列文章列表: 最简单的基于FFmpeg的移动端例子:A ...

  7. 最简单的基于FFmpeg的移动端例子:Android 推流器

    ===================================================== 最简单的基于FFmpeg的移动端例子系列文章列表: 最简单的基于FFmpeg的移动端例子:A ...

  8. 最简单的基于FFmpeg的移动端例子:Android 视频解码器-单个库版

    ===================================================== 最简单的基于FFmpeg的移动端例子系列文章列表: 最简单的基于FFmpeg的移动端例子:A ...

  9. 最简单的基于FFmpeg的移动端例子:Android HelloWorld

    ===================================================== 最简单的基于FFmpeg的移动端例子系列文章列表: 最简单的基于FFmpeg的移动端例子:A ...

  10. 最简单的基于FFmpeg的移动端例子附件:IOS自带播放器

    ===================================================== 最简单的基于FFmpeg的移动端例子系列文章列表: 最简单的基于FFmpeg的移动端例子:A ...

最新文章

  1. 《JavaScript快速全栈开发》作者Azat Mardanov:现在是拥抱Node技术栈的最佳时机
  2. eclipse中各种查找
  3. lavaral中文手册_【laravel7.x中文文档】路由
  4. Java 多线程:线程优先级
  5. @select注解_SSM框架(十三):Spring框架中的IoC(3)新注解,完全摆脱xml文件
  6. mysql类似的数据库_MemSQL学习笔记-类似MySQL的数据库
  7. 【编辑器】用CodeRunner打造VScode的C++开发环境
  8. 传文件 华为云桌面_怎么避免亚马逊账号关联(二)?阿里云华为云ECS远程桌面教程...
  9. 中国产品在越南如何落地?
  10. Arduino + AD9833 波形发生器
  11. 百度富文本编辑器UEditor增加自定义字体
  12. 推荐16个高清图片网站,可做网站背景
  13. 【日常】python脚本系列:拳皇13一键出招以及连段实现
  14. 微信开发工具新版本黑屏的解决办法
  15. 预定义 宏 #define 详解
  16. Python(关于运算符的运用的作业题)
  17. 无货源开店已确认违法
  18. 【Linux】软件包管理器yum和编辑器vim(内附动图)
  19. MIUI10设置Android通知,Miui10状态栏美化修改工具
  20. 一个忙碌架构师的Java后端书架-2018

热门文章

  1. 基于C语言编写的电子通讯录
  2. 中段尾段全段什么意思_排气管中段 尾段 全段 和芭蕉 是什么意思
  3. 2021年石景山区景贤计划人才认定条件及材料,补贴100万
  4. 使用bootstrap写一个注册页面
  5. 戒指你戴对了吗?Meet Surprise教你正确的戴法
  6. 三种模型验证方法:holdout, K-fold, leave one out cross validation(LOOCV)
  7. 深度残差网络+自适应参数化ReLU激活函数(调参记录2)
  8. mcinabox运行库下载_MCinaBox运行库
  9. plotyy函数_Matlab plotyy函数的使用及问题总结
  10. 比较器应用一:滞回比较器