-
2022-03-26 22:08:43
其实很不好意思说是老陈学生的,因为拖了很久才开始来认真的学习
说是来总结,其实也算是是给自己一个复盘的时间,把自己所学的东西回顾一下
一、基础知识
1.程序初识,前面先是跟着老师了解计算机程序的基础知识,程序可以理解为传统电脑软件我们在电脑上使用的各种软件(QQ、word、游戏等),然后还有其他的OS内核和服务器代码也属于电脑程序。然后在嵌入式中的程序C51小车、STM32无人机、ARM架构的手机操作系统、智能终端等
2.程序概念,算法+数据结构=程序。数据结构可以分开理解为数据类型(整数、浮点数、字符等)和数据的组织方式(例如一些数据存放方式按照什么规律存放数据)。算法就是为了某个目的,进行对数据的处理方法,让我们将完成达到目的的方法(就像我们为了算账,知道把所有的钱加起来来再减去支出就能得到我们的钱还有多少,这个过程就类似算法)
3.程序如何完成的,编程(用各种编程语言写代码)➡编译(高级语言变为机器语言0101二进制的代码过程,让机器能够读懂你想要执行的什么)➡执行
4.计算机语言,计算机和人交流的语言,分为机器语言(机器能识别的0101)、汇编语言(较为难的读懂)、高级语言(和人类语言很类似)
二、C语言
1.基础框架,C语言的最基础的组成
#include <stdio.h> int main()//程序入口的主函数main() { //你想要写的代码! return o; }
这个框架是要在以后的编程过程中最先要写出来,养成习惯!!!
我的第一个程序代码,嘿嘿!!
#include <stdio.h> int main() { printf ("阿强Paul头要秃了"); return 0; }
2.变量的认识,变量就是可以在程序运行过程中可以改变的量
变量要先定义以后,才能拿来使用,被赋值
变量具有四要素,是我们看到变量一定要知道的①变量名②变量类型③变量的值④变量的存放地址(和指针链表相关,现在我也不明白,后面老陈会讲)
①变量名,要给变量的一个名字,定义变量(要做的顾名思义)看到名字就能知道是什么数据,一般都是用英文单词来命名,并且只能用下划线和字母开头,不能以数字开头
刚开始或者英语不好的老陈说可以先用中文拼音,后面慢慢积累一些单词来使用
编程中同一单词的变量名,区分大小写的
int data = 3; int _data = 3; int shuju = 3; //区分大小写 int mydata; int Mydata;//这两个是不同变量 //驼峰命名法,两单词以上的名字,单词首字母用大小写区分开来 int MyData = 3; int myData = 3;
②变量类型(数据类型),首先要了解这三种类型整数型、浮点型、字符型
int data = 3; float data = 3.0; char data = 'c'
今天就先到这了!后面继续加油,坚持发博客
更多相关内容 -
linux文件编程学习汇总(完)(师上官可编程)
2021-01-09 18:48:55pathname:为要打开文件的名字, flags:可以操作的权限有三种: 可读(O_RDONLY) 可写(O__WRONLY) 可读可写(O_RDWR) mode_t mode:用户权限一般为0600(其中6=4+2。4代表可读,2代表可写) 创建文件 int creat...1,打开并创建文件的命令
头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
return 为一个整型数意思是描述该文件的一个描述符,若没有则返回为-1;pathname:为要打开文件的名字,
flags:可以操作的权限有三种:
可读(O_RDONLY)
可写(O__WRONLY)
可读可写(O_RDWR)
mode_t mode:用户权限一般为0600(其中6=4+2。4代表可读,2代表可写)
创建文件
int creat(const char *pathname, mode_t mode);
变量名同上
2,对一个文件采取写的操作
头文件
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
如果什么都没有写那么意味着返回值为0;错误为1;
fd:为一个文件描述符
buf:无类型的一个指针
count:从buf里面取回字节的大小
return 返回一个buf指向文件的大小
3,读文件操作
头文件
#include <unistd.h>ssize_t read(int fd, void *buf, size_t count);
fd:文件描述符;
*buf :文件中所指的内容
count:buf指向文件的字节数大小
return:buf指向文件的大小(光标以后的字符大小)4,光标挪动位置
头文件
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
fd:文件描述符
offset:偏移量(相对于光标往后偏移)
whence:光标位置(SEEK_SET 光标指向头,SEEK_END光标指向尾巴,SEEK_CUR光标指向当前位置)
return:返回为光标加上偏移值以前的大小文件描述符总结
为什么在编写命令时先打开后关闭
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> int main() { int fd; char *buf = "liuxinhenshuai"; fd = open("./file1",O_RDWR); printf("fd=%d\n",fd); if(fd==-1){ printf("open file1 failed\n"); fd = open("./file1",O_RDWR|O_CREAT,0600); } if(fd > 0){ printf("create file1 successfully\n"); } int n_write = write(fd,buf,strlen(buf)); if(n_write>-1){ printf("n_write=%d\n",n_write); } close(fd); fd = open("./file1",O_RDWR); char *readBuf; readBuf = (char *)malloc(sizeof(char)*n_write+1); int n_read = read(fd, readBuf,n_write); if(n_read > 0){ printf("n_read = %d\n context:%s\n",n_read,readBuf); } return 0; }
C语言标准库中的fopen,fwrite,fseek,fread与以上的比较
头文件都为#include <stdio.h>
fopen函数参数
FILE *fopen(const char *path, const char *mode);path与open里面的fd同为文件描述符但是一个返回的是指针一个返回的是整型
mode 与open里面的mode是一样的意思,只不过他们的命令符不一样,且fopen里面的命令需要加例如"w+".以下为所有命令
fwrite函数
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);ptr:与write里面的buf相对应
size:每一次写的大小
nmemb:写几次
stream:文件描述符fread函数
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
ptr:与read里面的buf相对应
size:每一次读的大小
nmemb:读几次
stream:文件描述符fseek函数
int fseek(FILE *stream, long offset, int whence);
stream:文件描述符
offset:偏移量
whence:光标位置。
补充C库
fgetc()
int fgetc(FILE *stream);
把此文件的字符一个一个的输出来
return:为一个字符;fputc()
int fputc(int c, FILE *stream);
int c 这里可以是字符串;
FILE *stream 文件描述符
返回值:为一个非负数feof()
int feof(FILE *stream);
判断文件到尾巴没有
return:到尾巴返回一个非零数 -
ffmpeg 源代码简单分析 av_register_all() 基于4.02 author:上官可编程(抖音)
2021-10-08 07:14:32void av_register_all(void) { ff_thread_once(&av_format_next_init, av_format_init_next); } static inline int ff_thread_once(char *control, void (*routine)(void)) { if (!*control) { ....void av_register_all(void) { ff_thread_once(&av_format_next_init, av_format_init_next); }
static inline int ff_thread_once(char *control, void (*routine)(void)) { if (!*control) { routine(); *control = 1; } return 0; }
static AVOnce av_format_next_init = AV_ONCE_INIT;
#define AV_ONCE_INIT 0
ff_thread_once 第一个实参定义为static AVOnce av_format_next_init = AV_ONCE_INIT;
AV_ONCE_INIT初始值为0
所以ff_thread_once中的if(!*control)条件成立,执行函数指针routine代表的函数,也就是调用ff_thread_once中第二个实参 av_format_init_next 函数,同时写入cotrol的值为1,下次被调用的时候,就不满足条件判断,这边处理体现了所谓的ff_thread_once 中的once定义
真正的初始化函数是av_format_init_next,这种处理方式能导致不管调用多少次的av_register_all,都才执行一次的av_format_init_next真实初始化函数。
——————————————————————————————————————————
接着看下av_format_init_next做哪些事儿
static void av_format_init_next(void) { AVOutputFormat *prevout = NULL, *out; AVInputFormat *previn = NULL, *in; ff_mutex_lock(&avpriv_register_devices_mutex); for (int i = 0; (out = (AVOutputFormat*)muxer_list[i]); i++) { if (prevout) prevout->next = out; prevout = out; } if (outdev_list) { for (int i = 0; (out = (AVOutputFormat*)outdev_list[i]); i++) { if (prevout) prevout->next = out; prevout = out; } } for (int i = 0; (in = (AVInputFormat*)demuxer_list[i]); i++) { if (previn) previn->next = in; previn = in; } if (indev_list) { for (int i = 0; (in = (AVInputFormat*)indev_list[i]); i++) { if (previn) previn->next = in; previn = in; } } ff_mutex_unlock(&avpriv_register_devices_mutex); }
这个初始化函数主要针对输入输出的复用器和解复用器加载,每一种复用器用结构体表示,所支持的复用器和解复用器以简单工厂模式的设计方法进行管理。放在链表 AVOutputFormat *prevout中进行管理。
于是这个函数执行的结果生产输入和输出的(复用器,编码器)的”资源整合“。后面根据特定开发场景在两个链表中找到目标复用器和解复用器使用。(复用可以理解成封装,比如封装成flv格式)
复用器列表如下
static const AVOutputFormat * const muxer_list[] = { &ff_a64_muxer, &ff_ac3_muxer, &ff_adts_muxer, &ff_adx_muxer, &ff_aiff_muxer, &ff_amr_muxer, &ff_apng_muxer, &ff_aptx_muxer, &ff_aptx_hd_muxer, &ff_asf_muxer, &ff_ass_muxer, &ff_ast_muxer, &ff_asf_stream_muxer, &ff_au_muxer, &ff_avi_muxer, &ff_avm2_muxer, &ff_bit_muxer, &ff_caf_muxer, &ff_cavsvideo_muxer, &ff_codec2_muxer, &ff_codec2raw_muxer, &ff_crc_muxer, &ff_dash_muxer, &ff_data_muxer, &ff_daud_muxer, &ff_dirac_muxer, &ff_dnxhd_muxer, &ff_dts_muxer, &ff_dv_muxer, &ff_eac3_muxer, &ff_f4v_muxer, &ff_ffmetadata_muxer, &ff_fifo_muxer, &ff_fifo_test_muxer, &ff_filmstrip_muxer, &ff_fits_muxer, &ff_flac_muxer, &ff_flv_muxer, &ff_framecrc_muxer, &ff_framehash_muxer, &ff_framemd5_muxer, &ff_g722_muxer, &ff_g723_1_muxer, &ff_g726_muxer, &ff_g726le_muxer, &ff_gif_muxer, &ff_gsm_muxer, &ff_gxf_muxer, &ff_h261_muxer, &ff_h263_muxer, &ff_h264_muxer, &ff_hash_muxer, &ff_hds_muxer, &ff_hevc_muxer, &ff_hls_muxer, &ff_ico_muxer, &ff_ilbc_muxer, &ff_image2_muxer, &ff_image2pipe_muxer, &ff_ipod_muxer, &ff_ircam_muxer, &ff_ismv_muxer, &ff_ivf_muxer, &ff_jacosub_muxer, &ff_latm_muxer, &ff_lrc_muxer, &ff_m4v_muxer, &ff_md5_muxer, &ff_matroska_muxer, &ff_matroska_audio_muxer, &ff_microdvd_muxer, &ff_mjpeg_muxer, &ff_mlp_muxer, &ff_mmf_muxer, &ff_mov_muxer, &ff_mp2_muxer, &ff_mp3_muxer, &ff_mp4_muxer, &ff_mpeg1system_muxer, &ff_mpeg1vcd_muxer, &ff_mpeg1video_muxer, &ff_mpeg2dvd_muxer, &ff_mpeg2svcd_muxer, &ff_mpeg2video_muxer, &ff_mpeg2vob_muxer, &ff_mpegts_muxer, &ff_mpjpeg_muxer, &ff_mxf_muxer, &ff_mxf_d10_muxer, &ff_mxf_opatom_muxer, &ff_null_muxer, &ff_nut_muxer, &ff_oga_muxer, &ff_ogg_muxer, &ff_ogv_muxer, &ff_oma_muxer, &ff_opus_muxer, &ff_pcm_alaw_muxer, &ff_pcm_mulaw_muxer, &ff_pcm_f64be_muxer, &ff_pcm_f64le_muxer, &ff_pcm_f32be_muxer, &ff_pcm_f32le_muxer, &ff_pcm_s32be_muxer, &ff_pcm_s32le_muxer, &ff_pcm_s24be_muxer, &ff_pcm_s24le_muxer, &ff_pcm_s16be_muxer, &ff_pcm_s16le_muxer, &ff_pcm_s8_muxer, &ff_pcm_u32be_muxer, &ff_pcm_u32le_muxer, &ff_pcm_u24be_muxer, &ff_pcm_u24le_muxer, &ff_pcm_u16be_muxer, &ff_pcm_u16le_muxer, &ff_pcm_u8_muxer, &ff_psp_muxer, &ff_rawvideo_muxer, &ff_rm_muxer, &ff_roq_muxer, &ff_rso_muxer, &ff_rtp_muxer, &ff_rtp_mpegts_muxer, &ff_rtsp_muxer, &ff_sap_muxer, &ff_sbc_muxer, &ff_scc_muxer, &ff_segafilm_muxer, &ff_segment_muxer, &ff_stream_segment_muxer, &ff_singlejpeg_muxer, &ff_smjpeg_muxer, &ff_smoothstreaming_muxer, &ff_sox_muxer, &ff_spx_muxer, &ff_spdif_muxer, &ff_srt_muxer, &ff_sup_muxer, &ff_swf_muxer, &ff_tee_muxer, &ff_tg2_muxer, &ff_tgp_muxer, &ff_mkvtimestamp_v2_muxer, &ff_truehd_muxer, &ff_tta_muxer, &ff_uncodedframecrc_muxer, &ff_vc1_muxer, &ff_vc1t_muxer, &ff_voc_muxer, &ff_w64_muxer, &ff_wav_muxer, &ff_webm_muxer, &ff_webm_dash_manifest_muxer, &ff_webm_chunk_muxer, &ff_webp_muxer, &ff_webvtt_muxer, &ff_wtv_muxer, &ff_wv_muxer, &ff_yuv4mpegpipe_muxer, NULL };
解复用器列表如下;
static const AVInputFormat * const demuxer_list[] = { &ff_aa_demuxer, &ff_aac_demuxer, &ff_ac3_demuxer, &ff_acm_demuxer, &ff_act_demuxer, &ff_adf_demuxer, &ff_adp_demuxer, &ff_ads_demuxer, &ff_adx_demuxer, &ff_aea_demuxer, &ff_afc_demuxer, &ff_aiff_demuxer, &ff_aix_demuxer, &ff_amr_demuxer, &ff_amrnb_demuxer, &ff_amrwb_demuxer, &ff_anm_demuxer, &ff_apc_demuxer, &ff_ape_demuxer, &ff_apng_demuxer, &ff_aptx_demuxer, &ff_aptx_hd_demuxer, &ff_aqtitle_demuxer, &ff_asf_demuxer, &ff_asf_o_demuxer, &ff_ass_demuxer, &ff_ast_demuxer, &ff_au_demuxer, &ff_avi_demuxer, &ff_avr_demuxer, &ff_avs_demuxer, &ff_bethsoftvid_demuxer, &ff_bfi_demuxer, &ff_bintext_demuxer, &ff_bink_demuxer, &ff_bit_demuxer, &ff_bmv_demuxer, &ff_bfstm_demuxer, &ff_brstm_demuxer, &ff_boa_demuxer, &ff_c93_demuxer, &ff_caf_demuxer, &ff_cavsvideo_demuxer, &ff_cdg_demuxer, &ff_cdxl_demuxer, &ff_cine_demuxer, &ff_codec2_demuxer, &ff_codec2raw_demuxer, &ff_concat_demuxer, &ff_data_demuxer, &ff_daud_demuxer, &ff_dcstr_demuxer, &ff_dfa_demuxer, &ff_dirac_demuxer, &ff_dnxhd_demuxer, &ff_dsf_demuxer, &ff_dsicin_demuxer, &ff_dss_demuxer, &ff_dts_demuxer, &ff_dtshd_demuxer, &ff_dv_demuxer, &ff_dvbsub_demuxer, &ff_dvbtxt_demuxer, &ff_dxa_demuxer, &ff_ea_demuxer, &ff_ea_cdata_demuxer, &ff_eac3_demuxer, &ff_epaf_demuxer, &ff_ffmetadata_demuxer, &ff_filmstrip_demuxer, &ff_fits_demuxer, &ff_flac_demuxer, &ff_flic_demuxer, &ff_flv_demuxer, &ff_live_flv_demuxer, &ff_fourxm_demuxer, &ff_frm_demuxer, &ff_fsb_demuxer, &ff_g722_demuxer, &ff_g723_1_demuxer, &ff_g726_demuxer, &ff_g726le_demuxer, &ff_g729_demuxer, &ff_gdv_demuxer, &ff_genh_demuxer, &ff_gif_demuxer, &ff_gsm_demuxer, &ff_gxf_demuxer, &ff_h261_demuxer, &ff_h263_demuxer, &ff_h264_demuxer, &ff_hevc_demuxer, &ff_hls_demuxer, &ff_hnm_demuxer, &ff_ico_demuxer, &ff_idcin_demuxer, &ff_idf_demuxer, &ff_iff_demuxer, &ff_ilbc_demuxer, &ff_image2_demuxer, &ff_image2pipe_demuxer, &ff_image2_alias_pix_demuxer, &ff_image2_brender_pix_demuxer, &ff_ingenient_demuxer, &ff_ipmovie_demuxer, &ff_ircam_demuxer, &ff_iss_demuxer, &ff_iv8_demuxer, &ff_ivf_demuxer, &ff_ivr_demuxer, &ff_jacosub_demuxer, &ff_jv_demuxer, &ff_lmlm4_demuxer, &ff_loas_demuxer, &ff_lrc_demuxer, &ff_lvf_demuxer, &ff_lxf_demuxer, &ff_m4v_demuxer, &ff_matroska_demuxer, &ff_mgsts_demuxer, &ff_microdvd_demuxer, &ff_mjpeg_demuxer, &ff_mjpeg_2000_demuxer, &ff_mlp_demuxer, &ff_mlv_demuxer, &ff_mm_demuxer, &ff_mmf_demuxer, &ff_mov_demuxer, &ff_mp3_demuxer, &ff_mpc_demuxer, &ff_mpc8_demuxer, &ff_mpegps_demuxer, &ff_mpegts_demuxer, &ff_mpegtsraw_demuxer, &ff_mpegvideo_demuxer, &ff_mpjpeg_demuxer, &ff_mpl2_demuxer, &ff_mpsub_demuxer, &ff_msf_demuxer, &ff_msnwc_tcp_demuxer, &ff_mtaf_demuxer, &ff_mtv_demuxer, &ff_musx_demuxer, &ff_mv_demuxer, &ff_mvi_demuxer, &ff_mxf_demuxer, &ff_mxg_demuxer, &ff_nc_demuxer, &ff_nistsphere_demuxer, &ff_nsp_demuxer, &ff_nsv_demuxer, &ff_nut_demuxer, &ff_nuv_demuxer, &ff_ogg_demuxer, &ff_oma_demuxer, &ff_paf_demuxer, &ff_pcm_alaw_demuxer, &ff_pcm_mulaw_demuxer, &ff_pcm_f64be_demuxer, &ff_pcm_f64le_demuxer, &ff_pcm_f32be_demuxer, &ff_pcm_f32le_demuxer, &ff_pcm_s32be_demuxer, &ff_pcm_s32le_demuxer, &ff_pcm_s24be_demuxer, &ff_pcm_s24le_demuxer, &ff_pcm_s16be_demuxer, &ff_pcm_s16le_demuxer, &ff_pcm_s8_demuxer, &ff_pcm_u32be_demuxer, &ff_pcm_u32le_demuxer, &ff_pcm_u24be_demuxer, &ff_pcm_u24le_demuxer, &ff_pcm_u16be_demuxer, &ff_pcm_u16le_demuxer, &ff_pcm_u8_demuxer, &ff_pjs_demuxer, &ff_pmp_demuxer, &ff_pva_demuxer, &ff_pvf_demuxer, &ff_qcp_demuxer, &ff_r3d_demuxer, &ff_rawvideo_demuxer, &ff_realtext_demuxer, &ff_redspark_demuxer, &ff_rl2_demuxer, &ff_rm_demuxer, &ff_roq_demuxer, &ff_rpl_demuxer, &ff_rsd_demuxer, &ff_rso_demuxer, &ff_rtp_demuxer, &ff_rtsp_demuxer, &ff_s337m_demuxer, &ff_sami_demuxer, &ff_sap_demuxer, &ff_sbc_demuxer, &ff_sbg_demuxer, &ff_scc_demuxer, &ff_sdp_demuxer, &ff_sdr2_demuxer, &ff_sds_demuxer, &ff_sdx_demuxer, &ff_segafilm_demuxer, &ff_shorten_demuxer, &ff_siff_demuxer, &ff_sln_demuxer, &ff_smacker_demuxer, &ff_smjpeg_demuxer, &ff_smush_demuxer, &ff_sol_demuxer, &ff_sox_demuxer, &ff_spdif_demuxer, &ff_srt_demuxer, &ff_str_demuxer, &ff_stl_demuxer, &ff_subviewer1_demuxer, &ff_subviewer_demuxer, &ff_sup_demuxer, &ff_svag_demuxer, &ff_swf_demuxer, &ff_tak_demuxer, &ff_tedcaptions_demuxer, &ff_thp_demuxer, &ff_threedostr_demuxer, &ff_tiertexseq_demuxer, &ff_tmv_demuxer, &ff_truehd_demuxer, &ff_tta_demuxer, &ff_txd_demuxer, &ff_tty_demuxer, &ff_ty_demuxer, &ff_v210_demuxer, &ff_v210x_demuxer, &ff_vag_demuxer, &ff_vc1_demuxer, &ff_vc1t_demuxer, &ff_vivo_demuxer, &ff_vmd_demuxer, &ff_vobsub_demuxer, &ff_voc_demuxer, &ff_vpk_demuxer, &ff_vplayer_demuxer, &ff_vqf_demuxer, &ff_w64_demuxer, &ff_wav_demuxer, &ff_wc3_demuxer, &ff_webm_dash_manifest_demuxer, &ff_webvtt_demuxer, &ff_wsaud_demuxer, &ff_wsd_demuxer, &ff_wsvqa_demuxer, &ff_wtv_demuxer, &ff_wve_demuxer, &ff_wv_demuxer, &ff_xa_demuxer, &ff_xbin_demuxer, &ff_xmv_demuxer, &ff_xvag_demuxer, &ff_xwma_demuxer, &ff_yop_demuxer, &ff_yuv4mpegpipe_demuxer, &ff_image_bmp_pipe_demuxer, &ff_image_dds_pipe_demuxer, &ff_image_dpx_pipe_demuxer, &ff_image_exr_pipe_demuxer, &ff_image_j2k_pipe_demuxer, &ff_image_jpeg_pipe_demuxer, &ff_image_jpegls_pipe_demuxer, &ff_image_pam_pipe_demuxer, &ff_image_pbm_pipe_demuxer, &ff_image_pcx_pipe_demuxer, &ff_image_pgmyuv_pipe_demuxer, &ff_image_pgm_pipe_demuxer, &ff_image_pictor_pipe_demuxer, &ff_image_png_pipe_demuxer, &ff_image_ppm_pipe_demuxer, &ff_image_psd_pipe_demuxer, &ff_image_qdraw_pipe_demuxer, &ff_image_sgi_pipe_demuxer, &ff_image_svg_pipe_demuxer, &ff_image_sunrast_pipe_demuxer, &ff_image_tiff_pipe_demuxer, &ff_image_webp_pipe_demuxer, &ff_image_xpm_pipe_demuxer, NULL };
解复用器:
static const AVInputFormat * const indev_list[] = { &ff_fbdev_demuxer, &ff_lavfi_demuxer, &ff_oss_demuxer, &ff_v4l2_demuxer, NULL };
复用器
static const AVOutputFormat * const outdev_list[] = { &ff_fbdev_muxer, &ff_oss_muxer, &ff_sdl2_muxer, &ff_v4l2_muxer, NULL };
随便找个复用器看看内容,比如AVI文件的复用器
AVOutputFormat ff_avi_muxer = { .name = "avi", .long_name = NULL_IF_CONFIG_SMALL("AVI (Audio Video Interleaved)"), .mime_type = "video/x-msvideo", .extensions = "avi", .priv_data_size = sizeof(AVIContext), .audio_codec = CONFIG_LIBMP3LAME ? AV_CODEC_ID_MP3 : AV_CODEC_ID_AC3, .video_codec = AV_CODEC_ID_MPEG4, .init = avi_init, .write_header = avi_write_header, .write_packet = avi_write_packet, .write_trailer = avi_write_trailer, .codec_tag = (const AVCodecTag * const []) { ff_codec_bmp_tags, ff_codec_wav_tags, 0 }, .priv_class = &avi_muxer_class, };
总结:
这个函数做ffmpegSDK开发之前必须要被调用的函数,主要是对资源的初始化,简单工厂模式的设计原理。Linux内核也大量采用如此设计方式,值得各位coder在做应用层项目时候学习。
关于本人更多信息,可以参考抖音:上官可编程 已培养众多海康,大华,中兴,华为等嵌入式工程师。
-
潜入式工程师成长路径
2022-04-02 19:33:20本人目前是大三学生,大二时在抖音上官可编程那报了嵌入式工程师的网课。当时花了3800,最近他的课程加全程辅导已经涨到6000,确实很多大学生感觉消费不起。 不过课程内容确实很全很实用,从最基础开始学起,针对...本人目前是大三学生,大二时在抖音上官可编程那报了嵌入式工程师的网课。当时花了3800,最近他的课程加全程辅导已经涨到6000,确实很多大学生感觉消费不起。
不过课程内容确实很全很实用,从最基础开始学起,针对计算机方向大学生或者跨专业改行学习嵌入式课程都非常有用。通过他的课程学习,很多学生都能找到对口且高薪的岗位。
目前我已经基本学习完毕,计划这学期完了也要踏入找工作大军。为了有些消费不起的同学考虑,我决定将课程分享给大家,希望能给大家带来帮助。
如有需要,请私我。 -
必备命令
2020-05-16 10:53:41Shell 简介 Shell 是运维和系统管理员操作Linux 系统的首选,简单说,它是一个命令解释器. 输入命令 解释执行 命令行相关: 行首“$” 或 “#” - 命令行提示符 行中 ## - 视为注释开始 注意: 命令行是区分大小... -
论文研究 - 黎巴嫩白鸡蛋和红鸡蛋的质量参数评估
2020-05-17 04:12:02评估了在冬季,秋季和夏季从黎巴嫩不同地方市场采集的新鲜可销售鸡蛋的质量特征,以了解鸡肉的繁殖适应性和收集日期之间的相关性。 对总共2000个棕色和白色鸡蛋进行了分析,并比较了它们的外部质量参数,例如蛋重,... -
Linux应用编程,网络编程练习--------ftp云盘(详细版)
2021-08-19 12:09:49本文章是前段时间学习linux编程的一个小总结,如果不总结的话我怕我学完就忘emmm(其实已经忘的差不多了),本文是跟着上官可编程老师与朱有鹏老师学习之后的练手作品,本人学疏才浅,暂时只能到这个地步 ... -
Linux网络编程
2020-12-30 21:58:54字节序 Little endian 小端字节序(低字节存储在起始地址) Big endian 大端字节序 网络字节序=大端字节序 4.socket编程步骤 服务器 ①创建套接字(通道) socket() ②添加信息(IP,端口号) bind() ③监听网络连接 listen... -
初识嵌入式之WeMos D1超声波感应开盖垃圾桶
2022-03-16 16:39:51目录 硬件平台介绍:WeMos D1 开发环境介绍:ARDUINO开发环境 WeMos的IO口测试:驱动蜂鸣器 蜂鸣器 接线 由于该芯片基于串口连接------安装串口驱动 开发环境配置 选择端口 让蜂鸣...关盖转180 } } --------上官可编程 -
树莓派学习笔记(七)带wiringpi库的交叉编译、软硬链接
2021-09-29 21:17:50观看学习上官可编程陈立臣老师的树莓派视频, 在其过程中所记录的学习笔记 所用到的Linux命令: cp -rf 拷贝文件夹(r表示文件夹,f表示强制执行) ls -l 显示文件详细信息 grep gcc * -nir 在所有文件中查找gcc... -
贪吃蛇项目(显示贪吃蛇的身子)
2021-03-12 14:18:571.显示贪吃蛇的身子要用到链表 (1)行坐标 (2)列坐标 (3)下一个节点的位置(指针,地址) 2.struct snake { int hang; int lie; struct snake *next; } 3.贪吃蛇身子显示 如何... } 运行效果: ——@上官可编程 -
socket开发步骤
2021-02-22 10:02:39一、开发步骤图 二、服务器的开发步骤 (1)创建套接字——socket (2) 为套接字添加信息——bind (3)监听网络连接——listen (4)接受连接——accept (5)数据交互——read和write ...——@上官可编程 ... -
网络OSI模型的简单总结
2021-01-01 21:07:43网络OSI模型的简单总结 1.什么是OSI? 2.七层模型 1.物理层 2....如下图 参考文章 此次网络模型的总结主要目的在于补充网络方面的基础知识,增加自己在面试时的资本 希望可以帮到您 师承上官可编程,陈立臣 -
贪吃蛇项目(用ncurse捕获键盘的上下左右键)
2021-03-12 11:42:041.使用ncurse的好处 ncurse封装了一些库,不需要通过按下回车来改变键盘的方向 。 2.如何使用ncurse 头文件:#include (1)initscr():是ncurse界面的初始化函数 (2)printw:是ncurse模式下的... ——@上官可编程 -
LP001电动车防盗报警器初级-陈立臣-专题视频课程
2018-06-19 09:32:44单片机入门基础项目,剖析市面常见电动车报警器的工作原理,并通过模块实现一个电动车报警器,作品真实可用 -
linux网络——ftp云盘
2021-01-06 12:11:32目录1、功能1.1服务端1.2客户端2、相关API2.1初始化变量memset2.2判断文件是否存在access2.3执行系统命令popen3、实现思路4、代码展示 1、功能 1.1服务端 1.接收客户端指令,实现如下的操作: ls,rm,cd,pwd ... -
Linux学习—TCP三次握手四次挥手
2021-01-01 21:45:12TCP三次握手四次挥手 1.TCP连接三次握手 第一次握手 第二次握手 第三次... 关于三次握手与四次挥手,我们会经常听接触到一些关于它们的问题,在面试时也会经常遇到,作此篇总结 希望可以到您 师承上官可编程,陈立臣 -
链表的初识
2021-02-18 14:24:35一、什么是链表 链表是一种数据结构,数据存放的思想。 链表的特点: (1)在一个连续的空间中,存放在某些特点的数据,把这些数据,集合在某个空间。 (2)链表的每一项都是一个结构体, 例如:有... ——@上官可编程 -
ftp云盘—配置文件
2020-12-24 09:33:06#define LLS 1 #define LPWD 2 #define LCD 3 #define CD 4 #define LS 5 #define PWD 6 #define PUT 7 #define GET 8 #define QUIT 9 struct Msg { char data[128]; char dataBuf[128];... -
WIFI小车APP远程控制,无线智能小车之ESP8266例程
2019-08-17 17:59:45WIFI小车无线远程控制,智能小车之ESP8266例程原理讲解小车改装ESP8266 例程代码WIFI配网程序测试安卓app制作 原理讲解 原理简述:利用发布订阅模式,即:利用ESP8266 订阅了一个主题,再利用app inventor 编写的app... -
Linux系统——文件编程
2021-11-17 23:52:29Linux系统——文件编程 文章目录Linux系统——文件编程一、文件编程概念目的:做法:window如何手动修改文件?Linux怎么做呢?步骤如下:计算机如何帮助我们自动化完成以上操作呢?二、文件打开及创建参数说明:... -
树莓派Linux源码配置 内核编译
2021-02-09 11:06:58虚拟机选择可移动设备Super Top Mass Storage Device,连接 4.输入指令dmesg,查看是否有下面打印,代表挂载成功 挂载到Ubuntu 1.在根目录创建2个文件夹:mkdir data1 data2 2.把sdb1 sdb2挂载到data1 data2: sudo ... -
人脸识别信息思路即例程(基本功能).zip
2021-04-19 15:45:55树莓派人脸识别基本功能实现 -
Linux嵌入式学习—网络编程
2020-12-12 18:02:13Linux中的网络编程是通过socket接口来进行的。socket是一种特殊的I/O接口,它也是一种文件描述符。它是一种常用的进程之间通信机制,通过它不仅能实现本地机器上的进程之间的通信,而且通过网络能够在不同机器上的... -
Erlang OTP 并发编程实战(高清中文版) pdf
2018-11-08 13:37:49建议学习实践: 1. 要坚持实践高性能大并发编程的实践 2. Erlang基础->OTP高并发编程实践PDF->Elixir ...3. 认真实践本书中的知识点, 动手练习, 高并发软件实时大容量的服务器开发可打败C++的大团队开发 -
树莓派学习笔记(四)外设开发编程使用
2021-09-26 21:52:38观看学习上官可编程陈立臣老师的树莓派视频, 在其过程中所记录的学习笔记 一、树莓派初始化函数 #include <wiringPi.h> int wiringPiSetup (void) 返回执行状态,0表示成功,-1表示失败 实例代码: #include ... -
C语言编程思路
2021-10-10 11:21:26一、用汉语编程 案例: (0)定义变量 (1)提示用户输入第一个加数 (2)获取用户输入 (3)提示用户输入第二个加数 (4)获取用户输入 (5)计算 (6)结果 #include <stdio.h> #include <... -
网络编程
2021-02-22 08:48:181.管道、消息队列、共享内存、信号、信号量,它们的特点依赖于内核,...3.做网络编程的时候,需要地址。地址是由IP地址和端口号构成。 IP地址:每个设备都有自己的IP地址,通过IP地址来标识自己。 端口号:在一台PC机 -
Linux系统编程---进程
2021-06-17 14:20:06Linux系统编程—进程 (师承上官可编程)