c++ sleep函数_超详细ffmpeg.c框架分析

本文围绕FFmpeg展开,先介绍环境搭建与工程,指出ffmpeg.c是多媒体文件转换器,有转码、压缩等多种作用。接着分析ffmpeg框架涉及的文件,阐述程序框架流程,包括解析命令行、打开输入输出文件、读取文件、编解码及写入输出文件等步骤,还对transcode()函数进行了框图分析。

1.环境搭建和整体工程说明

命令行输入:-i 3.flv -vcodec copy 2_audio.mp4

188b1032690124fc2629db9f42d9d2b0.png

转码的CPU占有率。

1d8a6ce24d12b0613f16632d9b2b7b72.png

需要在这个目录下,拷贝正确的SDL2.dll

6ac7e71af8285bd768a7b1db0d108754.png

转码过程:

e6e14365f5ac7b342cc2d58c9031be5e.png

转码成功后,MP4的大小要比3.flv的大一些。

874e4e5271a8737c11fd8dbdf0c8d0b8.png

使用Mediainfo查看转码前后的对比。

46bf5dd0577f5d6f1a7838747c609258.png

接下来,就详细聊聊ffmpeg.c。

ffmpeg.c本质是是基于FFmpeg库开发的多媒体⽂件转换器(multimedia converter)。

ffmpeg.c的作⽤如下:

(1)转码:⽐如转成MP3/AAC/H264/H265等等。

(2)压缩:⽐如将PCM进⾏⾳频编码,YUV进⾏视频编码。

(3)提取:⽐如提取⾳频⽂件,保存为AAC,提前视频⽂件,保存为H264。

(4)截取:⽐如从第5秒开始截取10秒的视频。

(5)拼接:⽐如将多个⽂件视频拼接⻓⼀个⽂件视频。

(6)合并:⽐如实现九宫格输出。

(7)录屏:ffmpeg可以⽤来录屏,但效率不⾼。

市⾯是的格式⼯⼚⼯具,⼤部分都是基于ffmpeg.c⼆次开发,⽐如:

迅捷视频转换器

爱剪辑

2.ffmpeg框架分析

ffmpeg对应的⽂件

ffmpeg程序涉及的主要⽂件:

(1)cmdutils.c:解析命令相关的⼯具函数。

(2)ffmpeg_opt.c:负责解析命令⾏输⼊的参数,以-vcodec copy的处理为例,对应了opt_video_codec函数(key-value的结构,- 接下来的字符是代表key的开始,key后⾯紧跟着value)。重点关注的是解析出来的信息存储在 OptionsContext, ⽐如opt_video_codec函数。如下图,是解析命令的函数调用栈。

27912abcdc774d4fa35ecb0b8dc4d1f8.png

然后在处理的时候 open_output_file -> choose_encoder -> new_video_stream ->new_output_stream -> choose_encoder的时候可以获取到对应的编码器到底应该使⽤什么。

b1633131c5065a0a532f1999d532a1f3.png

ffmpeg.c:多媒体⽂件转换器的主体。

ffmpeg_cuvid.c:CUDA硬件相关的加速。

ffmpeg_filter.c:filter相关。

ffmpeg_hw.c:硬件加速相关。

3.ffmpeg程序框架流程

(1)解析命令⾏

ffmpeg_parse_options 解析命令⾏的函数。对应的命令 const OptionDef options,例如:

{ "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg =opt_video_codec },

{ "codec", HAS_ARG | OPT_STRING | OPT_SPEC |OPT_INPUT | OPT_OUTPUT, { .off =OFFSET(codec_names) },"codec name", "codec" },

(2)打开输⼊⽂件 open_input_file

avformat_open_input。

分析码流 avformat_find_stream_info。

查找对应的编码器。

(3)打开输出⽂件 open_output_file

avformat_alloc_output_context2 先建⼀个输出⽂件。

avformat_new_stream 新建⼀个steam。

(4)读取输⼊⽂件

av_read_frame 读取输⼊⽂件。

(5)解码编码

解码:avcodec_send_packet和avcodec_receive_frame。

编码:avcodec_send_frame和avcodec_receive_packet。

(6)写⼊输出⽂件

avformat_write_header写⼊头部。

av_interleaved_write_frame 交替写⼊packet。

av_write_trailer 写⼊尾部。

4.框图分析

接下来主要分析transcode()。

0db2f926c9b24bbacf1cca060769bc56.png

transcode_init():转码的初始化⼯作。

check_keyboard_interaction():检测键盘操作。⽐如转码的过程中按下“q”键之后,会退出转码,该函数内还有⼀些其他的按键处理,具体看函数实现也是挺简单的。

transcode_step():进⾏转码

print_report():打印转码信息,输出到屏幕上,如下信息:

a05e238cbe8ad26991d545ae6a26f71d.png

flush_encoder():输出编码器中剩余的帧。

当中check_keyboard_interaction(),transcode_step(),print_report()三个函数位于⼀个循环之中会不断地运⾏

transcode_init()调⽤了以下⼏个重要的函数:

(1)init_input_stream():当中调⽤了avcodec_open2()打开编码器。

(2)init_output_stream()。

(3)av_dump_format()在屏幕上打印输出格式信息。注意是输出格式的信息。输⼊格式的信息的打印是在parse_options()函数运⾏过程中调⽤opt_input_file()的时候打印到屏幕上。

(4)avformat_write_header():写输出⽂件的⽂件头。

transcode_step()调⽤了例如以下函数:

(1)process_input():完成解码⼯作。

(2)transcode_from_filter():未分析。

(3)reap_filters():完成编码⼯作。

(4)process_input()流程图如下所示:

0b9b3fcdc25e809f01ef1c51c79bd63c.png

get_input_packet():获取⼀帧压缩编码数据,即⼀个AVPacket。当中调⽤了av_read_frame()。

output_packet():解码压缩编码的数据并将之送⾄AVFilterContext。

output_packet()调⽤了例如以下函数:

decode_video():解码⼀帧视频(⼀个AVPacket)。

decode_audio():解码⾳频(并不⼀定是⼀帧,是⼀个AVPacket)。

do_streamcopy():假设不需要⼜⼀次编码的话,则调⽤此函数,⼀般⽤于封装格式之间的转换。速度⽐转码快⾮常多

decode_video()调⽤了例如以下函数:

avcodec_decode_video2():解码⼀帧视频。

rate_emu_sleep():要求依照帧率处理数据的时候调⽤。能够避免FFmpeg处理速度过快。经常使⽤于⽹络实时流的处理(RTP/RTMP流的推送)。

configure_filtergraph():设置AVFilterGraph。

av_buffersrc_add_frame():将解码后的数据(⼀个AVFrame)送⾄AVFilterContext。

decode_audio()调⽤的函数和decode_video()基本⼀样。唯⼀的不同在于其解码⾳频的函数是avcodec_decode_audio4()。

reap_filters():主要完成了编码的工作。

其函数调⽤结构例如以下图:

9bd2482e79d0ea2794c15f02d7e8f1d7.png

reap_filters()调⽤了例如以下函数:

av_buffersink_get_buffer_ref():从AVFilterContext中取出⼀帧解码后的数据(结构为AVFilterBufferRef。能够转换为AVFrame)。

avfilter_copy_buf_props():AVFilterBufferRef转换为AVFrame。

do_audio_out():编码⾳频。

do_video_out():编码视频。do_video_out()调⽤了例如以下函数:

avcodec_encode_video2():编码⼀帧视频。

write_frame():写⼊编码后的视频压缩数据。

write_frame()调⽤了例如以下函数:

av_bitstream_filter_filter():使⽤AVBitStreamFilter的时候。会调⽤此函数进⾏处理。

av_interleaved_write_frame():写⼊压缩编码数据。

avfilter_unref_buffer():释放资源。

do_audio_out()调⽤的函数与do_video_out()基本上⼀样。唯⼀的不同在于视频编码函数。

avcodec_encode_video2()变成了⾳频编码函数avcodec_encode_audio2()。

exit_program()主要完成了清理⼯作。调⽤关系例如以下图:

4afcc58ec1f5655076821cf7d86ccce1.png

调⽤了如以下函数:

avfilter_graph_free():释放AVFilterGraph。

avformat_free_context():释放输出⽂件的AVFormatContext。

av_bitstream_filter_close():关闭AVBitStreamFilter。

avformat_close_input():关闭输⼊⽂件。

4.附加部分

(1)解析命令行ffmpeg_parse_options。

(2)打开输入文件。

(3)打开输出文件。

(4)读取输入文件,av_read_frame。函数调用栈如下:

3652ee3462348938b18294bee430b6e0.png

(5)编解码

解码:avcodec_send_packet。

编码:avcode_send_frame。

解码video:

86e916dff01e199772fc35b3815a3f4d.png
bb3392b87e4add1cd3a8bcaa7b69aa66.png

解码audio:

5d36cbcb477b5169a416960bd1550616.png

(6)将packet写入输出文件

avformat_write_header:写入头部。

av_interleaved_write_frame:写入packet。

av_write_trailer:写入尾部。

4ef5edb29c5cee09cdd3d42af27bdbe6.png

本篇文章就分享到这里,欢迎关注,点赞,转发,收藏。

690c7d0a3f86fee8d83e6165a12e11a0.png
Rebuild started: Project: Project *** Using Compiler 'V6.19', folder: 'C:\Keil_v5\ARM\ARMCLANG\Bin' Rebuild target 'Project' compiling app_ble.c... ../Src/main.c(200): warning: null passed to a callee that requires a non-null argument [-Wnonnull] fputc('s', NULL); ~~~~^ ../Src/main.c(339): warning: null passed to a callee that requires a non-null argument [-Wnonnull] fputc('w', NULL); ~~~~^ 2 warnings generated. compiling main.c... ../Src/app_at.c(793): warning: passing 'char *' to parameter of type 'uint8_t *' (aka 'unsigned char *') converts between pointers to integer types where one is of the unique plain 'char' type and the other is not [-Wpointer-sign] tcp_rec_show_update((char *)p->payload,p->len); ^~~~~~~~~~~~~~~~~~ ../Src/app_at.c(792): note: passing argument to parameter 'data' here extern void tcp_rec_show_update(uint8_t *data,uint32_t len); ^ 1 warning generated. compiling app_at.c... compiling app_btdm.c... ../Src/app_bt.c(662): warning: format specifies type 'char *' but the argument has type 'void *' [-Wformat] printf("hfg codec connection rsp: %s,type = %d\r\n",Info->p.ptr,codec_type); ~~ ^~~~~~~~~~~ 1 warning generated. compiling app_bt.c... compiling app_task.c... compiling app_hw.c... compiling diskio.c... compiling app_lvgl.c... compiling user_bt.c... compiling autonavi_profile.c... compiling autonavi_handler.c... compiling app_rpmsg.c... compiling msbc_sample.c... compiling app_hid_sdp.c... compiling app_audio.c... compiling sbc_sample.c... compiling mp3_sample.c... compiling btdm_mem.c... compiling controller.c... assembling controller_code.s... compiling host.c... assembling img_rom.s... compiling SWD.c... compiling fal_flash_port.c... compiling fdb_app.c... assembling startup_fr30xx.s... compiling trim_fr30xx.c... compiling driver_cali.c... compiling system_fr30xx.c... compiling driver_efuse.c... compiling driver_frspim.c... compiling driver_flash.c... compiling driver_gpio.c... compiling driver_pmu.c... compiling driver_pmu_iwdt.c... compiling driver_qspi.c... compiling driver_trng.c... compiling driver_uart.c... compiling driver_timer.c... compiling driver_dma.c... compiling driver_display.c... compiling driver_spi_master.c... compiling driver_sd_card.c... compiling driver_ipc.c... compiling driver_sd.c... compiling driver_can.c... compiling driver_pdm.c... compiling driver_i2s.c... compiling driver_psd_dac.c... compiling driver_display_dev.c... compiling driver_saradc.c... compiling driver_st7282_rgb_hw.c... compiling ext_flash.c... compiling co_log.c... ../../../../components/drivers/bsp/spi_flash/IC_W25Qxx.c(240): warning: incompatible pointer types passing 'uint16_t *' (aka 'unsigned short *') to parameter of type 'uint8_t *' (aka 'unsigned char *') [-Wincompatible-pointer-types] __SPI_Read_flash_X1(lu8_DataBuffer, 4, pu8_Buffer, fu32_Length); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ../../../../components/drivers/bsp/spi_flash/IC_W25Qxx.h(37): note: expanded from macro '__SPI_Read_flash_X1' #define __SPI_Read_flash_X1(__CMD__, __CSIZE__, __BUFFER__, __SIZE__) spi_master_readflash_X1(&spi_flash_handle, (uint16_t *)__CMD__, __CSIZE__, (void *)__BUFFER__, __SIZE__) ^~~~~~~~~~~~~~~~~~~ ../../../../components/drivers/peripheral/Inc/driver_spi.h(522): note: passing argument to parameter 'fp_CMD_ADDR' here void spi_master_readflash_X1(SPI_HandleTypeDef *hspi, uint8_t *fp_CMD_ADDR, uint32_t fu32_CMDLegnth, uint8_t *fp_Data, uint16_t fu16_Size); ^ 1 warning generated. compiling IC_W25Qxx.c... compiling fal.c... compiling co_list.c... compiling co_util.c... compiling fal_flash.c... compiling fdb.c... compiling fal_partition.c... compiling croutine.c... compiling fdb_utils.c... compiling event_groups.c... compiling list.c... compiling fdb_kvdb.c... compiling stream_buffer.c... compiling queue.c... compiling port.c... compiling timers.c... compiling portasm.c... compiling heap_6.c... assembling cpu_context.s... compiling tasks.c... compiling freertos_sleep.c... compiling heap.c... compiling lv_indev.c... compiling lv_refr.c... compiling lv_obj_pos.c... compiling lv_flex.c... compiling lv_bmp.c... compiling lv_ffmpeg.c... compiling lv_grid.c... compiling lv_freetype.c... compiling lv_fs_fatfs.c... compiling lv_fs_posix.c... compiling lv_fs_stdio.c... compiling lv_fs_win32.c... compiling lv_gif.c... compiling lodepng.c... compiling gifdec.c... compiling lv_png.c... compiling lv_qrcode.c... compiling lv_rlottie.c... compiling lv_sjpg.c... compiling tjpgd.c... compiling lv_fragment.c... compiling lv_fragment_manager.c... compiling lv_gridnav.c... compiling lv_ime_pinyin.c... compiling qrcodegen.c... compiling lv_imgfont.c... compiling lv_monkey.c... compiling lv_msg.c... compiling lv_snapshot.c... compiling lv_theme_basic.c... compiling lv_theme_mono.c... compiling lv_animimg.c... compiling lv_theme_default.c... compiling lv_calendar_header_arrow.c... compiling lv_calendar.c... compiling lv_calendar_header_dropdown.c... compiling lv_imgbtn.c... compiling lv_colorwheel.c... compiling lv_keyboard.c... compiling lv_chart.c... compiling lv_led.c... compiling lv_list.c... compiling lv_menu.c... compiling lv_meter.c... compiling lv_msgbox.c... compiling lv_spinner.c... compiling lv_spinbox.c... compiling lv_span.c... compiling lv_tabview.c... compiling lv_tileview.c... compiling lv_win.c... compiling lv_font.c... compiling lv_extra.c... compiling lv_font_dejavu_16_persian_hebrew.c... compiling lv_font_fmt_txt.c... compiling lv_font_montserrat_8.c... compiling lv_font_loader.c... compiling lv_font_montserrat_10.c... compiling lv_font_montserrat_12.c... compiling lv_font_montserrat_12_subpx.c... compiling lv_font_montserrat_14.c... compiling lv_font_montserrat_16.c... compiling lv_font_montserrat_18.c... compiling lv_font_montserrat_20.c... compiling lv_font_montserrat_22.c... compiling lv_font_montserrat_24.c... compiling lv_font_montserrat_26.c... compiling lv_font_montserrat_28_compressed.c... compiling lv_font_montserrat_28.c... compiling lv_font_montserrat_30.c... compiling lv_font_montserrat_32.c... compiling lv_font_montserrat_34.c... compiling lv_font_montserrat_36.c... compiling lv_font_montserrat_38.c... compiling lv_font_montserrat_40.c... compiling lv_font_montserrat_42.c... compiling lv_font_montserrat_44.c... compiling lv_font_montserrat_46.c... compiling lv_font_montserrat_48.c... compiling lv_font_simsun_16_cjk.c... compiling lv_font_unscii_8.c... compiling lv_font_unscii_16.c... compiling lv_hal_tick.c... compiling lv_hal_indev.c... compiling lv_hal_disp.c... compiling lv_anim_timeline.c... compiling lv_anim.c... compiling lv_area.c... compiling lv_async.c... compiling lv_color.c... compiling lv_fs.c... compiling lv_bidi.c... compiling lv_gc.c... compiling lv_log.c... compiling lv_ll.c... compiling lv_math.c... compiling lv_lru.c... compiling lv_printf.c... compiling lv_mem.c... compiling lv_templ.c... compiling lv_style.c... compiling lv_style_gen.c... compiling lv_timer.c... compiling lv_tlsf.c... compiling lv_utils.c... compiling lv_txt.c... compiling lv_txt_ap.c... compiling lv_btn.c... compiling lv_arc.c... compiling lv_bar.c... compiling lv_checkbox.c... compiling lv_canvas.c... compiling lv_btnmatrix.c... compiling lv_img.c... compiling lv_dropdown.c... compiling lv_objx_templ.c... compiling lv_label.c... compiling lv_line.c... compiling lv_slider.c... compiling lv_roller.c... compiling lv_switch.c... compiling lv_table.c... compiling lv_textarea.c... compiling lv_demo_benchmark.c... compiling img_benchmark_cogwheel_alpha16.c... compiling img_benchmark_cogwheel_argb.c... compiling img_benchmark_cogwheel_chroma_keyed.c... compiling img_benchmark_cogwheel_indexed16.c... compiling img_benchmark_cogwheel_rgb.c... compiling img_benchmark_cogwheel_rgb565a8.c... compiling lv_font_bechmark_montserrat_12_compr_az.c.c... compiling lv_font_bechmark_montserrat_16_compr_az.c.c... compiling lv_font_bechmark_montserrat_28_compr_az.c.c... compiling lv_demo_stress.c... compiling img_clothes.c... compiling lv_demo_widgets.c... compiling img_demo_widgets_avatar.c... compiling img_lvgl_logo.c... compiling lv_demo_music.c... compiling lv_demo_music_list.c... compiling img_lv_demo_music_btn_corner_large.c... compiling img_lv_demo_music_btn_list_pause.c... compiling lv_demo_music_main.c... compiling img_lv_demo_music_btn_list_pause_large.c... compiling img_lv_demo_music_btn_list_play.c... compiling img_lv_demo_music_btn_list_play_large.c... compiling img_lv_demo_music_btn_loop.c... compiling img_lv_demo_music_btn_loop_large.c... compiling img_lv_demo_music_btn_next.c... compiling img_lv_demo_music_btn_next_large.c... compiling img_lv_demo_music_btn_pause.c... compiling img_lv_demo_music_btn_pause_large.c... compiling img_lv_demo_music_btn_play.c... compiling img_lv_demo_music_btn_play_large.c... compiling img_lv_demo_music_btn_prev.c... compiling img_lv_demo_music_btn_prev_large.c... compiling img_lv_demo_music_btn_rnd.c... compiling img_lv_demo_music_btn_rnd_large.c... compiling img_lv_demo_music_corner_left.c... compiling img_lv_demo_music_corner_left_large.c... compiling img_lv_demo_music_corner_right.c... compiling img_lv_demo_music_corner_right_large.c... compiling img_lv_demo_music_cover_1.c... compiling img_lv_demo_music_cover_1_large.c... compiling img_lv_demo_music_cover_2.c... compiling img_lv_demo_music_cover_2_large.c... compiling img_lv_demo_music_cover_3.c... compiling img_lv_demo_music_cover_3_large.c... compiling img_lv_demo_music_icon_1.c... compiling img_lv_demo_music_icon_1_large.c... compiling img_lv_demo_music_icon_2.c... compiling img_lv_demo_music_icon_2_large.c... compiling img_lv_demo_music_icon_3.c... compiling img_lv_demo_music_icon_3_large.c... compiling img_lv_demo_music_icon_4.c... compiling img_lv_demo_music_icon_4_large.c... compiling img_lv_demo_music_list_border.c... compiling img_lv_demo_music_list_border_large.c... compiling img_lv_demo_music_logo.c... compiling img_lv_demo_music_slider_knob.c... compiling img_lv_demo_music_slider_knob_large.c... compiling img_lv_demo_music_wave_bottom.c... compiling img_lv_demo_music_wave_bottom_large.c... compiling img_lv_demo_music_wave_top.c... compiling crc32.c... compiling ffsystem.c... compiling img_lv_demo_music_wave_top_large.c... compiling ffunicode.c... compiling lfs_util.c... compiling ext_flash_program.c... compiling ff.c... compiling ext_flash_uart.c... compiling lfs_port.c... compiling lv_common_function.c... compiling batt_full_yellow.c... compiling lfs.c... compiling batt_full_gren.c... compiling arialuni_bbp1_32px__.c... compiling Number_HarmonyOS_bpp4_16px.c... compiling Number_HarmonyOS_bpp4_12px.c... compiling Number_HarmonyOS_bpp4_36px.c... compiling Number_HarmonyOS_bpp4_44px.c... compiling Number_HarmonyOS_bpp4_92px.c... compiling Number_HarmonyOS_bpp4_20px.c... compiling fr_lv_test_page.c... compiling fr_lv_86box_page.c... compiling fr_lv_customer_page.c... compiling fr_lv_app_music_control.c... compiling fr_lv_instrument_panel.c... compiling fr_lv_instrument_panel_km.c... compiling fr_lv_list_page.c... compiling fr_lv_can_page.c... compiling fr_lv_bt_pan_page.c... compiling fr_watch.c... compiling fr_guimain.c... compiling lv_user_sqlist.c... compiling fr_device_button.c... compiling fr_device_rtc.c... compiling fr_device_encode.c... compiling fr_device_pmu_io.c... compiling fr_device_canfd.c... compiling autoip.c... compiling icmp.c... compiling etharp.c... compiling igmp.c... compiling dhcp.c... compiling ip4.c... compiling ip4_addr.c... compiling dhcp6.c... compiling ip4_frag.c... compiling ethip6.c... compiling icmp6.c... compiling inet6.c... compiling ip6.c... compiling ip6_addr.c... compiling mld6.c... compiling ip6_frag.c... compiling nd6.c... compiling altcp.c... compiling altcp_tcp.c... compiling altcp_alloc.c... compiling def.c... compiling inet_chksum.c... compiling dns.c... compiling init.c... compiling ip.c... compiling mem.c... compiling memp.c... compiling raw.c... compiling netif.c... compiling stats.c... compiling sys.c... compiling pbuf.c... compiling tcp_in.c... compiling tcp.c... compiling tcp_out.c... compiling timeouts.c... compiling api_lib.c... compiling udp.c... compiling err.c... compiling if_api.c... compiling api_msg.c... compiling netbuf.c... compiling netifapi.c... compiling netdb.c... compiling tcpip.c... compiling ethernet.c... compiling ethernetif.c... compiling sys_arch.c... compiling sockets.c... compiling rpmsg.c... compiling rpmsg_lite.c... compiling rpmsg_ns.c... compiling rpmsg_queue.c... compiling llist.c... compiling virtqueue.c... compiling rpmsg_env_freertos.c... compiling rpmsg_platform.c... compiling dsp.c... assembling dsp_code_rom.s... compiling dsp_mem.c... compiling audio_a2dp_source.c... compiling audio_a2dp_sink.c... compiling audio_encoder.c... compiling audio_rpmsg.c... ../../../../components/modules/audio/audio_decoder.c(72): warning: null passed to a callee that requires a non-null argument [-Wnonnull] fputc(hex2char[(value >> 12)&0xf], NULL); ~~~~^ ../../../../components/modules/audio/audio_decoder.c(73): warning: null passed to a callee that requires a non-null argument [-Wnonnull] fputc(hex2char[(value >> 8)&0xf], NULL); ~~~~^ ../../../../components/modules/audio/audio_decoder.c(74): warning: null passed to a callee that requires a non-null argument [-Wnonnull] fputc(hex2char[(value >> 4)&0xf], NULL); ~~~~^ ../../../../components/modules/audio/audio_decoder.c(75): warning: null passed to a callee that requires a non-null argument [-Wnonnull] fputc(hex2char[(value >> 0)&0xf], NULL); ~~~~^ 4 warnings generated. compiling audio_decoder.c... compiling audio_hw.c... compiling audio_scene.c... compiling local_playback.c... compiling audio_sco.c... compiling loopback.c... compiling recorder.c... compiling voice_recognize.c... compiling algorithm.c... compiling codec.c... compiling resample.c... compiling AMS_client.c... compiling simple_gatt_service.c... compiling ANCS_AMS_client.c... compiling retarget_io.c... compiling hid_service.c... linking... ..\..\..\..\components\tools\keil\xip_flash_add_psram.sct(39): warning: L6329W: Pattern algorithm.o(RO) only matches removed unused sections. ..\..\..\..\components\tools\keil\xip_flash_add_psram.sct: Error: L6221E: Execution region RW_RAM_CODE with Execution range [0x1ffe01b0,0x20000c3c) overlaps with Execution region RW_IRAM1 with Execution range [0x20000000,0x2005cb40). ..\..\..\..\components\tools\keil\xip_flash_add_psram.sct: Error: L6388E: ScatterAssert expression ((ImageLength(RW_RAM_CODE_FRONT) + ImageLength(RW_RAM_CODE)) <= 0x20000) failed on line 52 : (0x20c30 <= 0x20000) Finished: 0 information, 1 warning and 2 error messages. ".\Objects\Project.axf" - 2 Error(s), 10 Warning(s). Target not created. Build Time Elapsed: 00:01:13
最新发布
09-13
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值