From 02af2a61602dcaaef22dc52f9729d14316abd47e Mon Sep 17 00:00:00 2001 From: Killer-Queue <1179868384@qq.com> Date: Tue, 23 Apr 2024 19:46:29 -0700 Subject: [PATCH 1/4] =?UTF-8?q?2024.4.24=20=E5=AD=A6=E4=B9=A0FFmpeg.5.15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/c_cpp_properties.json | 17 ++++++ .vscode/launch.json | 36 +++++++++++ .vscode/settings.json | 7 +++ .vscode/tasks.json | 57 ++++++++++++++++++ audio.c | 1 + demux.c | 2 + output/test_log | Bin 0 -> 41600 bytes resources/clock.aac | 0 resources/clock.h264 | 0 study_ffmpeg/extra_audio | Bin 0 -> 57144 bytes study_ffmpeg/extra_audio.c | 109 +++++++++++++++++++++++++++++++++ study_ffmpeg/extra_video | Bin 0 -> 57144 bytes study_ffmpeg/extra_video.c | 110 ++++++++++++++++++++++++++++++++++ study_ffmpeg/test_log | Bin 0 -> 19440 bytes study_ffmpeg/test_log.c | 8 +++ 15 files changed, 347 insertions(+) create mode 100644 .vscode/c_cpp_properties.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100755 output/test_log create mode 100644 resources/clock.aac create mode 100644 resources/clock.h264 create mode 100755 study_ffmpeg/extra_audio create mode 100644 study_ffmpeg/extra_audio.c create mode 100755 study_ffmpeg/extra_video create mode 100644 study_ffmpeg/extra_video.c create mode 100755 study_ffmpeg/test_log create mode 100644 study_ffmpeg/test_log.c diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..9930a2f --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,17 @@ +{ + "configurations": [ + { + "name": "Linux", + "includePath": [ + "${workspaceFolder}/**", + "/usr/local/ffmpeg/include" + ], + "defines": [], + "compilerPath": "/usr/bin/gcc", + "cStandard": "c17", + "cppStandard": "c++98", + "intelliSenseMode": "linux-gcc-x64" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..6080328 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,36 @@ +{ + // 使用 IntelliSense 了解相关属性。 + // 悬停以查看现有属性的描述。 + // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + + {//包含Debug配置 + "name": "(gdb) 启动",//配置名称 + "type": "cppdbg",//配置类型,对应cpptools提供的调试功能 + "request": "launch",//请求配置类型,可以是启动/附加类型[launch/attach] + "program": "${workspaceFolder}/${fileBasenameNoExtension}",//待调试程序本地路径 + "args": [//程序调试时传递给程序的命令行参数,设为空值 + "resources/clock.avi", + "resources/clock.h264" + ], + "stopAtEntry": false,//改为true时程序暂停在程序入口位置,即main处打上断点 + "cwd": "${fileDirname}",//调试程序时的工作目录,这里表示源码目录 + "environment": [],//环境变量,设为空值 + "externalConsole": false,//true:cmd窗口; false:Vscode的内置终端输出 + "MIMode": "gdb",//指定连接的调试器,minGW64中调试程序->gdb + "setupCommands": [ + { + "description": "为 gdb 启用整齐打印", + "text": "-enable-pretty-printing", + "ignoreFailures": true + }, + { + "description": "将反汇编风格设置为 Intel", + "text": "-gdb-set disassembly-flavor intel", + "ignoreFailures": true + } + ] + }, + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..9376a6d --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "C_Cpp.errorSquiggles": "enabled", + "files.associations": { + "stdio.h": "c", + "log.h": "c" + } +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..f446f51 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,57 @@ +{ + "tasks": [ + {//构建配置项 + "type": "cppbuild", //任务类型,Vscode将预定义变量转义解析后直接传给command;shell->先打开shell再输入命令,因此args会经过shell再次解析 + "label": "C/C++: gcc 生成活动文件", //任务名称 + "command": "/usr/bin/gcc",//本地编译器路径 + "args": [//包含传给gcc命令的参数,用于实现特定功能 + "-g",//生成和调试有关的信息 + "${file}",//指定编译文件为当前文件 + "-o",//指定输出文件的路径和名称 + "${fileDirname}/${fileBasenameNoExtension}",//修改.exe文件生成位置 + "-I/usr/local/ffmpeg/include", + "-L/usr/local/ffmpeg/lib", + "-lavutil", + "-lavformat", + "-lavcodec" + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": {//包含很多task,归为group + "kind": "build",//表名该组任务类型是构建 + "isDefault": true//表明此任务为此组任务中的默认任务 + }, + "detail": "调试器生成的任务。" + }, + // { + // "type": "cppbuild", + // "label": "C/C++: gcc 生成活动文件", + // "command": "/usr/bin/gcc", + // "args": [ + // "-g", + // "${file}", + // "-o", + // "${fileDirname}/${fileBasenameNoExtension}", + // "-I/usr/local/ffmpeg/include", + // "-L/usr/local/ffmpeg/lib", + // "-lavutil" + // ], + // "options": { + // "cwd": "${fileDirname}" + // }, + // "problemMatcher": [ + // "$gcc" + // ], + // "group": { + // "kind": "build", + // "isDefault": true + // }, + // "detail": "调试器生成的任务。" + // } + ], + "version": "2.0.0" +} \ No newline at end of file diff --git a/audio.c b/audio.c index d5c66ac..2ce3564 100644 --- a/audio.c +++ b/audio.c @@ -1,6 +1,7 @@ #include "player.h" #include "packet.h" #include "frame.h" +#include "SDL_audio.h" static void sdl_audio_callback(void *opaque, Uint8 *stream, int len); diff --git a/demux.c b/demux.c index 0d97b0a..c03ac57 100644 --- a/demux.c +++ b/demux.c @@ -1,5 +1,7 @@ #include "demux.h" #include "packet.h" +#include "SDL_events.h" +#include "SDL_mutex.h" static int decode_interrupt_cb(void *ctx) { diff --git a/output/test_log b/output/test_log new file mode 100755 index 0000000000000000000000000000000000000000..23a1fb986f86fbf847044ed6acf65cf336becdac GIT binary patch literal 41600 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 J1uCM}{{?P;M&1Ab literal 0 HcmV?d00001 diff --git a/resources/clock.aac b/resources/clock.aac new file mode 100644 index 0000000..e69de29 diff --git a/resources/clock.h264 b/resources/clock.h264 new file mode 100644 index 0000000..e69de29 diff --git a/study_ffmpeg/extra_audio b/study_ffmpeg/extra_audio new file mode 100755 index 0000000000000000000000000000000000000000..0a59fe2cbf9c77deafd8bbc00e948ea00facc95b GIT binary patch literal 57144 zcmeFad3YPu)jvMkY$1np6845#B=VQyPSK@x#ymH?wOejf-Ox}i$zj@Ht7_Jr;0>QgL0$(CAEYkHAwZ+ zbo{N5j+JtdZO8ux<+l0yvQ^wruTG_$4OgmHO28ynkI0tPtBN6Asoqq-_Iz9y6yYn3wYdgZFtBXUu_ zLrT3vN3);!``L$esm;ZuAFyk- zUSHE4c2x#)ZKSsrwliXU2Jntm= zuTN2a&lLGNKyb45T~n0*2l||>JevZa@D%OTPLY4c6z$VA^5VbwM`~>{e6~-~{tu@p z|Hu^OADNyRMzH5s7bEjx$e2Vg)Ab&pUO!#3wrOz23 z>+7dEv}~m$hm#SxD>IVm=^Gu(j3gue{-ME4GQFukBgt~lz|f#PI+h+8lVwqK(t_!8 z<5ucFCJE zqhs0IO7la*nL%^w-6NUI#KyOb^o?cY-b@Arqm7N}4^HFU3MJTp2fi{2?cf(B(#lT)E{s4LT{5kVeKcWwp|#|K9;-6+oQB9nST z_oF~_cpH&VRFN`U`^LaH@T_yQ+}XQX?gkFX=-iqnBBcBK&LzfD1u6u_4y5}ArIv7` zFV&U|x5$tQo@k23Bfg{zPBbI!mur^PX;96QWulNj8VLHSjL?=gtbO#KG%EcitxQ)t zbSb6ie-6Kjlnwfn{s|rK#dYN+7tSDUUaBZxx_hne{&O|M`PAkD?Y>p|0~(+;pbGzs z`}(GnhOWbX${R25bCEVbMJsQSZdA(Swsi9m8LHkYtx@i)_JO)Czoyt<2bA?+&EKo! zI~%B#>^iQdUp`gj(^{c4%`;xp<#Rho6q63<^3^`*)*)R!2Cn^%=m+A7K)#aD#^1lSXq`;RH`2RlzKAdsPe?k|( z>kRF3JiSzsLOb@2S&u#&y7&p_;~e>;%MLG*q{BxSe2B}8xe}G{r8|cYzJB!R(LFp( z3jgrI=d?5}JckcHs-;QsA3k`GmL`RN_~6Z2niizP2d~u9r1%dXyiiM%!ascQY%NU- z)!~C_ElrC5@WFLjniT%wgFY=yivIAyYAsC*+Tnxqv@|LF!v~p`CPjbvphZiQf1C$$VpDp7DLu!Oo@Gi;H>Dk>^yeoU$N!Nj z{hlfPmMQ%gQ~LM%boG1TozI;a+WAK4;x`Y)k}bO(FF^uByQjwL6v{) z3GF`lj{riu9naHc<&m*jm^wESjH%-~`r3@S+fiJ4T)CqB4|w@yx6tLdFG4#Hg&uwX z)X<|xY$3~&q36CBD@Fqur2*&B*Sa~M)%rBQwx3M5rSTKmLKmOhNMLB^TVwg5T_-mo zap39Cj~+eH1z~;CaWc}DGf-FSpXwjnf}3rqgNg19?L6;DXy^E$oo(-icC{S}?TQ@P z6?`|e^O>Fd4;)2HpL4&l-j+GSr*$*~9?souAL zhlJ+o_Xrun2UelT#k{=rf(4=7vu?rcd)SLRkKn)b0R1`eF*KFIm9{NVDx$md z)$UMIQ1T8GKez}A_P{p*fmns86T0{zx=7<*)HzG7qeJl=s`XE(X*5mLRp|F5FLIz% zv{Xqg?Gg>{x|*kU#tN03hk-7~_mxk1w^gDr4G?^++I2PI9_oBP^ynLq^Jhc5P zfM_4^Irt_>wQENgXuFaN?2H|^5b<{H2yvcWEm#r<19l7co$Ytrrb|yP~AH z?A#IK^@7_&yC&8Rd!cWr=9#=^aQlAVGdd(HT!xxp_SFr%1;KhD9;g1BZtUPUQ2Vtb zNQz0N78m8-#*H2OX6!sc-vY{0b)`I%bvc^i@`|RG(Jj4-QN+H%OKQDHVId?NnD0OE zed<`5V`xSZPuv(3&5*RxV1&MbhV2T~=5v)f<~VRX$~+AfeF>G|>$`7#%kGmC$4Zhf z72f%huPwauBVW?D^Ru?l?!^IQCt8mCoNTlM(T~yZqo3Qx=2pL=tS>D)54Y@mKd|#{ z-_hc~hAw{G5?c9}@qdv0cG?-f(|u?7&h*KTcXuz*_xHHcFSq+NOOK=T<)1Gp@FfMl zq`;RH_`ie#7R5`P9_bk$$PA8+dI!cw$Gn>|-hrW!jCZUzJ?O2SCM_7HJvDv-oQZe` zhsL~pgPr~3T^VnBysK}>OUEzifqB!U)~GjtSptaNYgk(W5Wo`U_nDg=+;?$zoVVSK)d(uBxxoa&BC*Y%R37^K+ea zCQ11o{I5ql@L!R#zR?J5(uYWqO zmmNBKlvkuo{HWbA{NIlJjZ|OxQD0xj|9j9M_UKr%3kttx^-s^~142mB{X6jg5!_Fc zUn8j8x3xQ{L;zX8!G9-Ahzzb$Q$gVs)^I`TH*CQI?{0grpz`aEKta{lazX|57w0w? zGz=Eh`wFUj1(l5j-o}E`#)87e0w+IXAo^6H9lbxFn*8$jB?Z2uz?T&Gk^)~+;7ba8 zNr5jZ@FfNQZ>4}5N2A8gsHVL6daXhrHJ@U2=%=PB)`x!i;v#~408dxaN0gulH8w(x z=TT#1Xm3D2HAX^>>!JMu{nYy(eQ|V%(tF|3r=M!u_bS0K%0+rgxvy-?q;_(H$A%BHRXCpxk^fKP@!`5D%UFI+Mrxx%5|f19agT} zm8%*5|5Mu8AWAg*{j0o{ZJWji$Hu)Ym((q(T3kKOQ`P6!R4u8hTT*kJ$d^t;4Iwpx zHwTqCr7KjKHT8K5_Tz%BPD{KAQ|XVG90yzQf0ByU*XKi6pDS63Mr_X9WCRy`ZU-)Q zr_JI#2)VRbbFH@WcF+MZENK+z}LB{Xs+`~s$j`EjP7y>c0S;fq?aAl z&JNJQ<*Y}SwYk)rLbW z6P2z!XcoswJW=IZ*?`1qo~U)+2F|s~=O*5p|xA)-HCv4gKI)H{%;fT;|H520Ety6vg(q##bY8TFG^| zbFC}45sA~wZbf3R>w9R_aRx`{c2^4W;5gIOj5>F_w!&NDkf$w1;sMtlBGpEY+dkKo z$Z~9Q{tyj3Az7E44u<5GJ&(+3`=NOpClusaRuRVrP$1VyH}Z*Lgx7T9G392E$QuD# zxz4Kyv^NrX6F^>;4ivqDTD2it!#+F?#~mCH_;hnCoXW}pS;g3wQ6(;;n@?7uOv@)#KS^ zSQSoSk0Sp>wgW5JVirX&OC)Q>I#gR~EkVc5F3>mRYAienUARuGz@KKumkZZRXx0@e zisFXTRhL8}>5-8rbp03j)e39GpQ45TP>8KOhWKl%H)5jdJ#2NMER(ABW~q7Z^hrdwRHrZOO>b? z;lf)|oBJ`{c^QA`f6=S>gW^Q8Tql*!bv_N)O0;x+%SKq|`~w-qrE9=9J9SsEKc^lF za#k0V-UaMgh>^r%7^{VS2n}Ur&x7YSRs$trXR`o1B&!v=X_~ueCyH91wgAb}qB8;K z1kjH4�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 E0v9+er2qf` literal 0 HcmV?d00001 diff --git a/study_ffmpeg/extra_audio.c b/study_ffmpeg/extra_audio.c new file mode 100644 index 0000000..31ab2e5 --- /dev/null +++ b/study_ffmpeg/extra_audio.c @@ -0,0 +1,109 @@ +#include +#include +#include +#include + +int main(int argc, char* argv[]) +{ + // 1.处理一些参数; + int ret = -1; + char* src; + char* dst; + + av_log_set_level(AV_LOG_DEBUG); + if( argc < 3 ) { + av_log(NULL, AV_LOG_INFO, "arguments must be more than 3\n"); + exit(-1); + } + + src = argv[1]; + dst = argv[2]; + + // 2.打开多媒体文件; + + AVFormatContext *pFmtCtx = NULL; + if( (ret = avformat_open_input(&pFmtCtx, src, NULL, NULL)) < 0 ){ + av_log(NULL, AV_LOG_ERROR, "%s\n", av_err2str(ret)); + exit(-1); + } + + // 3.从多媒体文件中找到视频流 + + int idx = -1; + idx = av_find_best_stream(pFmtCtx, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0); + if( idx < 0 ){ + av_log(pFmtCtx, AV_LOG_ERROR, "Dose not include audio stream!\n"); + goto _ERROR; + } + + // 4.打开目的文件的上下文 + AVFormatContext *oFmtCtx = avformat_alloc_context(); + if( !oFmtCtx ){ + av_log(NULL, AV_LOG_ERROR, "NO Memory!\n"); + goto _ERROR; + } + const AVOutputFormat *outFmt = av_guess_format(NULL, dst, NULL); + oFmtCtx->oformat = outFmt; + + + // 5.创建一个新的视频流 + AVStream *outStream = avformat_new_stream(oFmtCtx, NULL); + + + // 6.设置输出音频参数 + + AVStream *inStream = pFmtCtx->streams[idx]; + avcodec_parameters_copy(outStream->codecpar, inStream->codecpar); + outStream->codecpar->codec_tag = 0; + + + // 绑定 + ret = avio_open2(&oFmtCtx->pb, dst, AVIO_FLAG_WRITE, NULL, NULL); + if( ret < 0 ){ + av_log(oFmtCtx, AV_LOG_ERROR, "%s\n", av_err2str(ret)); + goto _ERROR; + } + + // 7.写多媒体文件头到目的文件 + + ret = avformat_write_header(oFmtCtx, NULL); + if( ret < 0 ){ + av_log(oFmtCtx, AV_LOG_ERROR, "%s\n", av_err2str(ret)); + goto _ERROR; + } + + // 8.从源多媒体文件中读到音频数据到目的文件中 + + AVPacket pkt; + while( av_read_frame(pFmtCtx, &pkt) >= 0) { + if( pkt.stream_index == idx ){ + pkt.pts = av_rescale_q_rnd(pkt.pts, inStream->time_base, outStream->time_base, (AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)); + pkt.dts = pkt.pts; + pkt.duration = av_rescale_q(pkt.duration, inStream->time_base, outStream->time_base); + pkt.stream_index = 0; + pkt.pos = -1; + av_interleaved_write_frame(oFmtCtx, &pkt); + av_packet_unref(&pkt); + } + } + + // 9.写多媒体文件尾到文件中 + + av_write_trailer(oFmtCtx); + + // 10.将申请的资源释放掉 + +_ERROR: + if( pFmtCtx ){ + avformat_close_input(&pFmtCtx); + pFmtCtx = NULL; + } + if( oFmtCtx->pb ){ + avio_close(oFmtCtx->pb); + } + if( oFmtCtx ){ + avformat_free_context(oFmtCtx); + oFmtCtx = NULL; + } + return 0; +} \ No newline at end of file diff --git a/study_ffmpeg/extra_video b/study_ffmpeg/extra_video new file mode 100755 index 0000000000000000000000000000000000000000..b0bcd3ac874976574f51170a87d9dbdf425bf48c GIT binary patch literal 57144 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 F;Q()MDH8wy literal 0 HcmV?d00001 diff --git a/study_ffmpeg/extra_video.c b/study_ffmpeg/extra_video.c new file mode 100644 index 0000000..13751ff --- /dev/null +++ b/study_ffmpeg/extra_video.c @@ -0,0 +1,110 @@ +#include +#include +#include +#include + +int main(int argc, char* argv[]) +{ + // 1.处理一些参数; + int ret = -1; + char* src; + char* dst; + + av_log_set_level(AV_LOG_DEBUG); + if( argc < 3 ) { + av_log(NULL, AV_LOG_INFO, "arguments must be more than 3\n"); + exit(-1); + } + + src = argv[1]; + dst = argv[2]; + + // 2.打开多媒体文件; + + AVFormatContext *pFmtCtx = NULL; + if( (ret = avformat_open_input(&pFmtCtx, src, NULL, NULL)) < 0 ){ + av_log(NULL, AV_LOG_ERROR, "%s\n", av_err2str(ret)); + exit(-1); + } + + // 3.从多媒体文件中找到音频流 + + int idx = -1; + idx = av_find_best_stream(pFmtCtx, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0); + if( idx < 0 ){ + av_log(pFmtCtx, AV_LOG_ERROR, "Dose not include audio stream!\n"); + goto _ERROR; + } + + // 4.打开目的文件的上下文 + AVFormatContext *oFmtCtx = avformat_alloc_context(); + if( !oFmtCtx ){ + av_log(NULL, AV_LOG_ERROR, "NO Memory!\n"); + goto _ERROR; + } + const AVOutputFormat *outFmt = av_guess_format(NULL, dst, NULL); + oFmtCtx->oformat = outFmt; + + + // 5.创建一个新的音频流 + AVStream *outStream = avformat_new_stream(oFmtCtx, NULL); + + + // 6.设置输出音频参数 + + AVStream *inStream = pFmtCtx->streams[idx]; + avcodec_parameters_copy(outStream->codecpar, inStream->codecpar); + outStream->codecpar->codec_tag = 0; + + + // 绑定 + ret = avio_open2(&oFmtCtx->pb, dst, AVIO_FLAG_WRITE, NULL, NULL); + if( ret < 0 ){ + av_log(oFmtCtx, AV_LOG_ERROR, "%s\n", av_err2str(ret)); + goto _ERROR; + } + + // 7.写多媒体文件头到目的文件 + + ret = avformat_write_header(oFmtCtx, NULL); + if( ret < 0 ){ + av_log(oFmtCtx, AV_LOG_ERROR, "%s\n", av_err2str(ret)); + goto _ERROR; + } + + // 8.从源多媒体文件中读到音频数据到目的文件中 + + AVPacket pkt; + while( av_read_frame(pFmtCtx, &pkt) >= 0) { + if( pkt.stream_index == idx ){ + pkt.pts = av_rescale_q_rnd(pkt.pts, inStream->time_base, outStream->time_base, (AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)); + pkt.dts = av_rescale_q_rnd(pkt.dts, inStream->time_base, outStream->time_base, (AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)); + + pkt.duration = av_rescale_q(pkt.duration, inStream->time_base, outStream->time_base); + pkt.stream_index = 0; + pkt.pos = -1; + av_interleaved_write_frame(oFmtCtx, &pkt); + av_packet_unref(&pkt); + } + } + + // 9.写多媒体文件尾到文件中 + + av_write_trailer(oFmtCtx); + + // 10.将申请的资源释放掉 + +_ERROR: + if( pFmtCtx ){ + avformat_close_input(&pFmtCtx); + pFmtCtx = NULL; + } + if( oFmtCtx->pb ){ + avio_close(oFmtCtx->pb); + } + if( oFmtCtx ){ + avformat_free_context(oFmtCtx); + oFmtCtx = NULL; + } + return 0; +} \ No newline at end of file diff --git a/study_ffmpeg/test_log b/study_ffmpeg/test_log new file mode 100755 index 0000000000000000000000000000000000000000..78c01ebae99822aae3c4591a50ab0d74975ab674 GIT binary patch literal 19440 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 TZJ%o4zZkYGe$fGNu;PCK;@gZ* literal 0 HcmV?d00001 diff --git a/study_ffmpeg/test_log.c b/study_ffmpeg/test_log.c new file mode 100644 index 0000000..76d4e2f --- /dev/null +++ b/study_ffmpeg/test_log.c @@ -0,0 +1,8 @@ +#include +#include +int main(int argc, char* argv[]){ + printf("\n__())()___\n"); + av_log_set_level(AV_LOG_DEBUG); + av_log(NULL, AV_LOG_INFO,"hello world!\n"); + return 0; +} \ No newline at end of file From 2f6d368732574b42e5e07bea1c6d0b2db209cdf7 Mon Sep 17 00:00:00 2001 From: Killer-Queue <1179868384@qq.com> Date: Thu, 25 Apr 2024 05:33:35 -0700 Subject: [PATCH 2/4] =?UTF-8?q?=E8=AF=B7=E4=B8=BA=E6=82=A8=E7=9A=84?= =?UTF-8?q?=E5=8F=98=E6=9B=B4=E8=BE=93=E5=85=A5=E6=8F=90=E4=BA=A4=E8=AF=B4?= =?UTF-8?q?=E6=98=8E=E3=80=82=E4=BB=A5=20'#'=20=E5=BC=80=E5=A7=8B=E7=9A=84?= =?UTF-8?q?=E8=A1=8C=E5=B0=86=E8=A2=AB=E5=BF=BD=E7=95=A5=EF=BC=8C=E8=80=8C?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E7=A9=BA=E7=9A=84=E6=8F=90=E4=BA=A4=20?= =?UTF-8?q?=E8=AF=B4=E6=98=8E=E5=B0=86=E4=BC=9A=E7=BB=88=E6=AD=A2=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 位于分支 master 您的分支领先 'origin/master' 共 1 个提交。 (使用 "git push" 来发布您的本地提交) 要提交的变更: 修改: .vscode/launch.json 修改: .vscode/tasks.json 新文件: study_ffmpeg/5_/cut_avdio 新文件: study_ffmpeg/5_/cut_avdio.c 重命名: study_ffmpeg/extra_audio -> study_ffmpeg/5_/extra_audio 重命名: study_ffmpeg/extra_audio.c -> study_ffmpeg/5_/extra_audio.c 重命名: study_ffmpeg/extra_video -> study_ffmpeg/5_/extra_video 重命名: study_ffmpeg/extra_video.c -> study_ffmpeg/5_/extra_video.c 新文件: study_ffmpeg/5_/remux 新文件: study_ffmpeg/5_/remux.c 重命名: study_ffmpeg/test_log -> study_ffmpeg/5_/test_log 重命名: study_ffmpeg/test_log.c -> study_ffmpeg/5_/test_log.c 新文件: study_ffmpeg/6_/build_avdio.h264 新文件: study_ffmpeg/6_/encode_audio 新文件: study_ffmpeg/6_/encode_audio.c 新文件: study_ffmpeg/6_/encode_video 新文件: study_ffmpeg/6_/encode_video.c --- .vscode/launch.json | 6 +- .vscode/tasks.json | 1 + study_ffmpeg/5_/cut_avdio | Bin 0 -> 57896 bytes study_ffmpeg/5_/cut_avdio.c | 195 ++++++++++++++++++++++++++++ study_ffmpeg/{ => 5_}/extra_audio | Bin study_ffmpeg/{ => 5_}/extra_audio.c | 0 study_ffmpeg/{ => 5_}/extra_video | Bin study_ffmpeg/{ => 5_}/extra_video.c | 4 +- study_ffmpeg/5_/remux | Bin 0 -> 57216 bytes study_ffmpeg/5_/remux.c | 143 ++++++++++++++++++++ study_ffmpeg/{ => 5_}/test_log | Bin study_ffmpeg/{ => 5_}/test_log.c | 0 study_ffmpeg/6_/build_avdio.h264 | Bin 0 -> 39482 bytes study_ffmpeg/6_/encode_audio | Bin 0 -> 60008 bytes study_ffmpeg/6_/encode_audio.c | 195 ++++++++++++++++++++++++++++ study_ffmpeg/6_/encode_video | Bin 0 -> 59864 bytes study_ffmpeg/6_/encode_video.c | 180 +++++++++++++++++++++++++ 17 files changed, 719 insertions(+), 5 deletions(-) create mode 100755 study_ffmpeg/5_/cut_avdio create mode 100644 study_ffmpeg/5_/cut_avdio.c rename study_ffmpeg/{ => 5_}/extra_audio (100%) rename study_ffmpeg/{ => 5_}/extra_audio.c (100%) rename study_ffmpeg/{ => 5_}/extra_video (100%) rename study_ffmpeg/{ => 5_}/extra_video.c (97%) create mode 100755 study_ffmpeg/5_/remux create mode 100644 study_ffmpeg/5_/remux.c rename study_ffmpeg/{ => 5_}/test_log (100%) rename study_ffmpeg/{ => 5_}/test_log.c (100%) create mode 100644 study_ffmpeg/6_/build_avdio.h264 create mode 100755 study_ffmpeg/6_/encode_audio create mode 100644 study_ffmpeg/6_/encode_audio.c create mode 100755 study_ffmpeg/6_/encode_video create mode 100644 study_ffmpeg/6_/encode_video.c diff --git a/.vscode/launch.json b/.vscode/launch.json index 6080328..3bcd62c 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -9,10 +9,10 @@ "name": "(gdb) 启动",//配置名称 "type": "cppdbg",//配置类型,对应cpptools提供的调试功能 "request": "launch",//请求配置类型,可以是启动/附加类型[launch/attach] - "program": "${workspaceFolder}/${fileBasenameNoExtension}",//待调试程序本地路径 + "program": "${workspaceFolder}/study_ffmpeg/6_/${fileBasenameNoExtension}",//待调试程序本地路径 "args": [//程序调试时传递给程序的命令行参数,设为空值 - "resources/clock.avi", - "resources/clock.h264" + "build_avdio.h264", + "libx264" ], "stopAtEntry": false,//改为true时程序暂停在程序入口位置,即main处打上断点 "cwd": "${fileDirname}",//调试程序时的工作目录,这里表示源码目录 diff --git a/.vscode/tasks.json b/.vscode/tasks.json index f446f51..2c58a75 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -9,6 +9,7 @@ "${file}",//指定编译文件为当前文件 "-o",//指定输出文件的路径和名称 "${fileDirname}/${fileBasenameNoExtension}",//修改.exe文件生成位置 + "-lm", "-I/usr/local/ffmpeg/include", "-L/usr/local/ffmpeg/lib", "-lavutil", diff --git a/study_ffmpeg/5_/cut_avdio b/study_ffmpeg/5_/cut_avdio new file mode 100755 index 0000000000000000000000000000000000000000..d76212cf2d13f094018a89dae352437b7dfc8cdd GIT binary patch literal 57896 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 Vv`g7u9HjKm|KufJj1;1z`4^5aUP}M~ literal 0 HcmV?d00001 diff --git a/study_ffmpeg/5_/cut_avdio.c b/study_ffmpeg/5_/cut_avdio.c new file mode 100644 index 0000000..5f8d698 --- /dev/null +++ b/study_ffmpeg/5_/cut_avdio.c @@ -0,0 +1,195 @@ +#include +#include +#include +#include +#include + +int main(int argc, char* argv[]) +{ + // 1.处理一些参数; + int ret = -1; + char* src; + char* dst; + double starttime; + double endtime; + + av_log_set_level(AV_LOG_DEBUG); + // cut src dst start end + if( argc < 5 ) { + av_log(NULL, AV_LOG_INFO, "arguments must be more than 3\n"); + exit(-1); + } + + src = argv[1]; + dst = argv[2]; + starttime = atof(argv[3]); + endtime = atof(argv[4]); + + + // 2.打开多媒体文件; + + AVFormatContext *pFmtCtx = NULL; + if( (ret = avformat_open_input(&pFmtCtx, src, NULL, NULL)) < 0 ){ + av_log(NULL, AV_LOG_ERROR, "%s\n", av_err2str(ret)); + exit(-1); + } + + // 4.打开目的文件的上下文 + // AVFormatContext *oFmtCtx = avformat_alloc_context(); + // if( !oFmtCtx ){ + // av_log(NULL, AV_LOG_ERROR, "NO Memory!\n"); + // goto _ERROR; + // } + // const AVOutputFormat *outFmt = av_guess_format(NULL, dst, NULL); + // oFmtCtx->oformat = outFmt; + AVFormatContext *oFmtCtx = NULL; + avformat_alloc_output_context2(&oFmtCtx, NULL, NULL, dst); + if( !oFmtCtx ){ + av_log(NULL, AV_LOG_ERROR, "NO MEMORT!\n"); + goto _ERROR; + } + + int *stream_map = NULL; + int stream_idx = 0; + stream_map = av_calloc(pFmtCtx->nb_streams, sizeof(int)); + if( !stream_map ){ + av_log(NULL, AV_LOG_ERROR, "NO MEMORT!\n"); + goto _ERROR; + } + for( int i=0 ; i < pFmtCtx->nb_streams ; i++ ){ + AVStream *inStream = pFmtCtx->streams[i]; + AVStream *outStream = NULL; + AVCodecParameters *inCodecPar = inStream->codecpar; + if( inCodecPar->codec_type != AVMEDIA_TYPE_AUDIO && + inCodecPar->codec_type != AVMEDIA_TYPE_VIDEO && + inCodecPar->codec_type != AVMEDIA_TYPE_SUBTITLE){ + stream_map[i] = -1; + continue; + } + else{ + stream_map[i] = stream_idx++ ; + outStream = avformat_new_stream(oFmtCtx, NULL); + if( !outStream ){ + av_log(oFmtCtx, AV_LOG_ERROR, "NO MEMORT!\n"); + goto _ERROR; + } + avcodec_parameters_copy(outStream->codecpar, inStream->codecpar); + outStream->codecpar->codec_tag = 0; + } + } + + + // 绑定 + ret = avio_open2(&oFmtCtx->pb, dst, AVIO_FLAG_WRITE, NULL, NULL); + if( ret < 0 ){ + av_log(oFmtCtx, AV_LOG_ERROR, "%s\n", av_err2str(ret)); + goto _ERROR; + } + + // 7.写多媒体文件头到目的文件 + + ret = avformat_write_header(oFmtCtx, NULL); + if( ret < 0 ){ + av_log(oFmtCtx, AV_LOG_ERROR, "%s\n", av_err2str(ret)); + goto _ERROR; + } + + + // cut起作用的地方 + // 很多视频的裁剪不准确,是因为视频有IPB帧,我们很有可能裁剪到了B帧(没有I帧无法解析),那么就必须向前或者向后来裁剪 + // 这个函数表示,从流的哪个时间点截取文件 + ret = av_seek_frame(pFmtCtx, -1, starttime * AV_TIME_BASE, AVSEEK_FLAG_BACKWARD); + + if( ret < 0 ){ + av_log(oFmtCtx, AV_LOG_ERROR, "%s", av_err2str(ret)); + goto _ERROR; + } + + + int64_t *dts_start_time = av_calloc(pFmtCtx->nb_streams, sizeof(int64_t)); + int64_t *pts_start_time = av_calloc(pFmtCtx->nb_streams, sizeof(int64_t)); + for( int i = 0 ; i < pFmtCtx->nb_streams ; i++ ){ + dts_start_time[i] = -1; + pts_start_time[i] = -1; + } + // 8.从源多媒体文件中读到音频/视频/字幕数据到目的文件中 + +// 0 1 2 3 4 5 +// -1 1 -1 1 -1 1 + +// 0 1 2 3 4 5 +// -1 0 -1 1 -1 2 + + AVPacket pkt; + while( av_read_frame(pFmtCtx, &pkt) >= 0) { + AVStream *inStream, *outStream; + + if( dts_start_time[pkt.stream_index] == -1 && pkt.dts > 0 ){ + dts_start_time[pkt.stream_index] = pkt.dts; + } + + if( pts_start_time[pkt.stream_index] == -1 && pkt.pts > 0 ){ + pts_start_time[pkt.stream_index] = pkt.pts; + } + + inStream = pFmtCtx->streams[pkt.stream_index]; + if( av_q2d(inStream->time_base) * pkt.pts > endtime ){ + av_log(oFmtCtx, AV_LOG_INFO, "success!\n"); + break; + } + + if( stream_map[pkt.stream_index] < 0 ){ + av_packet_unref(&pkt); + continue; + } + + pkt.pts = pkt.pts - pts_start_time[pkt.stream_index]; + pkt.dts = pkt.dts - dts_start_time[pkt.stream_index]; + if( pkt.pts > pkt.dts ){ + pkt.pts = pkt.dts; + } + + pkt.stream_index = stream_map[pkt.stream_index]; + + outStream = oFmtCtx->streams[pkt.stream_index]; + av_packet_rescale_ts(&pkt, inStream->time_base, outStream->time_base); + // pkt.pts = av_rescale_q_rnd(pkt.pts, inStream->time_base, outStream->time_base, (AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)); + // pkt.dts = av_rescale_q_rnd(pkt.dts, inStream->time_base, outStream->time_base, (AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)); + // pkt.duration = av_rescale_q(pkt.duration, inStream->time_base, outStream->time_base); + // pkt.stream_index = 0; + pkt.pos = -1; + av_interleaved_write_frame(oFmtCtx, &pkt); + av_packet_unref(&pkt); + } + + // 9.写多媒体文件尾到文件中 + + av_write_trailer(oFmtCtx); + + // 10.将申请的资源释放掉 + +_ERROR: + if( pFmtCtx ){ + avformat_close_input(&pFmtCtx); + pFmtCtx = NULL; + } + if( oFmtCtx->pb ){ + avio_close(oFmtCtx->pb); + } + if( oFmtCtx ){ + avformat_free_context(oFmtCtx); + oFmtCtx = NULL; + } + if( stream_map ){ + av_free(stream_map); + } + if( dts_start_time ){ + av_free(dts_start_time); + + } + if( pts_start_time ){ + av_free(pts_start_time); + } + return 0; +} + diff --git a/study_ffmpeg/extra_audio b/study_ffmpeg/5_/extra_audio similarity index 100% rename from study_ffmpeg/extra_audio rename to study_ffmpeg/5_/extra_audio diff --git a/study_ffmpeg/extra_audio.c b/study_ffmpeg/5_/extra_audio.c similarity index 100% rename from study_ffmpeg/extra_audio.c rename to study_ffmpeg/5_/extra_audio.c diff --git a/study_ffmpeg/extra_video b/study_ffmpeg/5_/extra_video similarity index 100% rename from study_ffmpeg/extra_video rename to study_ffmpeg/5_/extra_video diff --git a/study_ffmpeg/extra_video.c b/study_ffmpeg/5_/extra_video.c similarity index 97% rename from study_ffmpeg/extra_video.c rename to study_ffmpeg/5_/extra_video.c index 13751ff..53a83f7 100644 --- a/study_ffmpeg/extra_video.c +++ b/study_ffmpeg/5_/extra_video.c @@ -46,11 +46,11 @@ int main(int argc, char* argv[]) oFmtCtx->oformat = outFmt; - // 5.创建一个新的音频流 + // 5.创建一个新的视频流 AVStream *outStream = avformat_new_stream(oFmtCtx, NULL); - // 6.设置输出音频参数 + // 6.设置输出视频参数 AVStream *inStream = pFmtCtx->streams[idx]; avcodec_parameters_copy(outStream->codecpar, inStream->codecpar); diff --git a/study_ffmpeg/5_/remux b/study_ffmpeg/5_/remux new file mode 100755 index 0000000000000000000000000000000000000000..8c04ce83aca0b937d2096843c813709440f6c39a GIT binary patch literal 57216 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 +#include +#include +#include + +int main(int argc, char* argv[]) +{ + // 1.处理一些参数; + int ret = -1; + char* src; + char* dst; + + av_log_set_level(AV_LOG_DEBUG); + if( argc < 3 ) { + av_log(NULL, AV_LOG_INFO, "arguments must be more than 3\n"); + exit(-1); + } + + src = argv[1]; + dst = argv[2]; + + // 2.打开多媒体文件; + + AVFormatContext *pFmtCtx = NULL; + if( (ret = avformat_open_input(&pFmtCtx, src, NULL, NULL)) < 0 ){ + av_log(NULL, AV_LOG_ERROR, "%s\n", av_err2str(ret)); + exit(-1); + } + + // 4.打开目的文件的上下文 + // AVFormatContext *oFmtCtx = avformat_alloc_context(); + // if( !oFmtCtx ){ + // av_log(NULL, AV_LOG_ERROR, "NO Memory!\n"); + // goto _ERROR; + // } + // const AVOutputFormat *outFmt = av_guess_format(NULL, dst, NULL); + // oFmtCtx->oformat = outFmt; + AVFormatContext *oFmtCtx = NULL; + avformat_alloc_output_context2(&oFmtCtx, NULL, NULL, dst); + if( !oFmtCtx ){ + av_log(NULL, AV_LOG_ERROR, "NO MEMORT!\n"); + goto _ERROR; + } + + int *stream_map = NULL; + int stream_idx = 0; + stream_map = av_calloc(pFmtCtx->nb_streams, sizeof(int)); + if( !stream_map ){ + av_log(NULL, AV_LOG_ERROR, "NO MEMORT!\n"); + goto _ERROR; + } + for( int i=0 ; i < pFmtCtx->nb_streams ; i++ ){ + AVStream *inStream = pFmtCtx->streams[i]; + AVStream *outStream = NULL; + AVCodecParameters *inCodecPar = inStream->codecpar; + if( inCodecPar->codec_type != AVMEDIA_TYPE_AUDIO && + inCodecPar->codec_type != AVMEDIA_TYPE_VIDEO && + inCodecPar->codec_type != AVMEDIA_TYPE_SUBTITLE){ + stream_map[i] = -1; + continue; + } + else{ + stream_map[i] = stream_idx++ ; + outStream = avformat_new_stream(oFmtCtx, NULL); + if( !outStream ){ + av_log(oFmtCtx, AV_LOG_ERROR, "NO MEMORT!\n"); + goto _ERROR; + } + avcodec_parameters_copy(outStream->codecpar, inStream->codecpar); + outStream->codecpar->codec_tag = 0; + } + } + + + // 绑定 + ret = avio_open2(&oFmtCtx->pb, dst, AVIO_FLAG_WRITE, NULL, NULL); + if( ret < 0 ){ + av_log(oFmtCtx, AV_LOG_ERROR, "%s\n", av_err2str(ret)); + goto _ERROR; + } + + // 7.写多媒体文件头到目的文件 + + ret = avformat_write_header(oFmtCtx, NULL); + if( ret < 0 ){ + av_log(oFmtCtx, AV_LOG_ERROR, "%s\n", av_err2str(ret)); + goto _ERROR; + } + + // 8.从源多媒体文件中读到音频/视频/字幕数据到目的文件中 + +// 0 1 2 3 4 5 +// -1 1 -1 1 -1 1 + +// 0 1 2 3 4 5 +// -1 0 -1 1 -1 2 + + AVPacket pkt; + while( av_read_frame(pFmtCtx, &pkt) >= 0) { + AVStream *inStream, *outStream; + inStream = pFmtCtx->streams[pkt.stream_index]; + if( stream_map[pkt.stream_index] < 0 ){ + av_packet_unref(&pkt); + continue; + } + + pkt.stream_index = stream_map[pkt.stream_index]; + + outStream = oFmtCtx->streams[pkt.stream_index]; + av_packet_rescale_ts(&pkt, inStream->time_base, outStream->time_base); + // pkt.pts = av_rescale_q_rnd(pkt.pts, inStream->time_base, outStream->time_base, (AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)); + // pkt.dts = av_rescale_q_rnd(pkt.dts, inStream->time_base, outStream->time_base, (AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)); + // pkt.duration = av_rescale_q(pkt.duration, inStream->time_base, outStream->time_base); + // pkt.stream_index = 0; + pkt.pos = -1; + av_interleaved_write_frame(oFmtCtx, &pkt); + av_packet_unref(&pkt); + } + + // 9.写多媒体文件尾到文件中 + + av_write_trailer(oFmtCtx); + + // 10.将申请的资源释放掉 + +_ERROR: + if( pFmtCtx ){ + avformat_close_input(&pFmtCtx); + pFmtCtx = NULL; + } + if( oFmtCtx->pb ){ + avio_close(oFmtCtx->pb); + } + if( oFmtCtx ){ + avformat_free_context(oFmtCtx); + oFmtCtx = NULL; + } + if( stream_map ){ + av_free(stream_map); + } + return 0; +} + diff --git a/study_ffmpeg/test_log b/study_ffmpeg/5_/test_log similarity index 100% rename from study_ffmpeg/test_log rename to study_ffmpeg/5_/test_log diff --git a/study_ffmpeg/test_log.c b/study_ffmpeg/5_/test_log.c similarity index 100% rename from study_ffmpeg/test_log.c rename to study_ffmpeg/5_/test_log.c diff --git a/study_ffmpeg/6_/build_avdio.h264 b/study_ffmpeg/6_/build_avdio.h264 new file mode 100644 index 0000000000000000000000000000000000000000..a2bf5857e001893a1da0031e3d48197e82d0ab92 GIT binary patch literal 39482 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̨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

$0 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 literal 0 HcmV?d00001 diff --git a/study_ffmpeg/6_/encode_audio.c b/study_ffmpeg/6_/encode_audio.c new file mode 100644 index 0000000..1477394 --- /dev/null +++ b/study_ffmpeg/6_/encode_audio.c @@ -0,0 +1,195 @@ +#include +#include +#include +#include + +static int check_sample_fmt(const AVCodec *codec, enum AVSampleFormat sample_fmt){ + const enum AVSampleFormat *p = codec->sample_fmts; + while( *p != AV_SAMPLE_FMT_NONE ){ + if( *p == sample_fmt ){ + return 1; + } + p++; + } + return 0; +} + + +static int select_best_sample_rate(const AVCodec *codec){ + const int *p; + int best_samplerate = 0; + + if( !codec->supported_samplerates){ + return 44100; + } + p = codec->supported_samplerates; + while( *p ){ + if( !best_samplerate || abs(44100 - *p )= 0 ){ + ret = avcodec_receive_packet(ctx, pkt); + if( ret == AVERROR(EAGAIN) || ret == AVERROR_EOF ){ + return 0; + } + else if( ret < 0 ){ + return -1; + } + fwrite(pkt->data, 1, pkt->size, out); + av_packet_unref(pkt); + } + +_END: + return 0; +} + + +int main(int argc, char *argv[]) +{ + + av_log_set_level(AV_LOG_DEBUG); + // 1.输入参数 + if( argc<3 ){ + av_log(NULL, AV_LOG_ERROR, "arguments must be more than 2\n"); + goto _ERROR; + + } + char *dst = NULL; + char *codecName = NULL; + dst = argv[1]; + + + // 2.查找编码器 + const AVCodec *codec = NULL; + // codec = avcodec_find_encoder_by_name(codecName); + // avcodec_find_encoder_by_name("libfdk_acc"); // 第三方的 + codec = avcodec_find_encoder(AV_CODEC_ID_AAC); // ffmpeg内部的 + if( !codec ){ + av_log(NULL, AV_LOG_ERROR, "don't find Codec: %s\n", codecName); + goto _ERROR; + } + + // 3.创建编码器上下文 + AVCodecContext *ctx = avcodec_alloc_context3(codec); + if( !ctx ){ + av_log(NULL, AV_LOG_ERROR, "NO MEMRORY\n"); + goto _ERROR; + } + + // 4.设置编码器参数 + + ctx->bit_rate = 64000; // 一般在64k\128k\之间 + ctx->sample_fmt = AV_SAMPLE_FMT_S16; + if( !check_sample_fmt(codec, ctx->sample_fmt) ) + { + av_log(NULL, AV_LOG_ERROR, "Encoder does not support sample format!\n"); + goto _ERROR; + } + + ctx->sample_rate = select_best_sample_rate(codec); + av_channel_layout_copy(&ctx->ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO); + + // 5.编码器与编码器上下文绑定到一起 + + int ret; + ret = avcodec_open2(ctx, codec, NULL); + if( ret < 0 ){ + av_log(ctx, AV_LOG_ERROR, "Don't open codec: %s\n", av_err2str(ret)); + goto _ERROR; + } + + // 6.创建输出文件 + FILE *f = fopen(dst, "wb"); + if( !f ){ + av_log(NULL, AV_LOG_ERROR, "Don't open file: %s\n", dst); + goto _ERROR; + } + + // 7.创建AVFrame (保存原始音频帧 + + AVFrame *frame = av_frame_alloc(); + if( !frame ){ + av_log(NULL, AV_LOG_ERROR, "NO MEMORY!\n"); + goto _ERROR; + } + + frame->nb_samples = ctx->frame_size; + frame->format = ctx->sample_fmt; + av_channel_layout_copy(&frame->ch_layout, &ctx->ch_layout); + ret = av_frame_get_buffer(frame, 0); + if( ret < 0 ){ + av_log(NULL, AV_LOG_ERROR, "Could not allocate the video frame. \n"); + goto _ERROR; + } + + // 8.创建AVPacket (保存编码后的音频帧 / 一个packet中可能含有多个 + + AVPacket *pkt = av_packet_alloc(); + if( !pkt ){ + av_log(NULL, AV_LOG_ERROR, "NO MEMORY!\n"); + goto _ERROR; + } + + + // 9.生成音频内容 + uint16_t *samples = NULL; + float t = 0 ; + float tincr = 2 * M_PI * 440 / ctx->sample_rate; + for( int i=0 ; i<200 ; i++ ){ + ret = av_frame_make_writable(frame); + if( ret < 0 ){ + av_log(NULL, AV_LOG_ERROR, "Could not allocate space!\n"); + goto _ERROR; + } + samples = (uint16_t*)frame->data[0]; + for(int j=0 ; jframe_size ; j++ ) + { + samples[2*j] = (int)(sin(t) * 10000 ); // 因为每个采样大小是两字节 + for( int k=1 ; kch_layout.nb_channels ; k++ ){ + samples[2*j+ k] = samples[2*j]; + } + t += tincr; + } + encode(ctx, NULL, pkt, f); + } + + // 10.编码 + encode(ctx, NULL, pkt, f); + +_ERROR: + // ctx + if( ctx ){ + avcodec_free_context(&ctx); + } + // // avframe + // if( frame ){ + // av_frame_free(&frame); + // } + // // avpacket + // if( pkt ){ + // av_packet_free(&pkt); + // } + // // dst + // if( f ){ + // fclose(f); + // } + + return 0; +} + diff --git a/study_ffmpeg/6_/encode_video b/study_ffmpeg/6_/encode_video new file mode 100755 index 0000000000000000000000000000000000000000..963c1535d4f982e98b20babad2f1f56c4ec4fc71 GIT binary patch literal 59864 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 +#include +#include + + +static int encode(AVCodecContext *ctx, AVFrame *frame, AVPacket *pkt, FILE *out){ + int ret = -1; + + + ret = avcodec_send_frame(ctx, frame); + if( ret < 0 ) + { + av_log(NULL, AV_LOG_ERROR, "Failed to send frame to encoder!\n"); + goto _END; + } + + while( ret >= 0 ){ + ret = avcodec_receive_packet(ctx, pkt); + if( ret == AVERROR(EAGAIN) || ret == AVERROR_EOF ){ + return 0; + } + else if( ret < 0 ){ + return -1; + } + fwrite(pkt->data, 1, pkt->size, out); + av_packet_unref(pkt); + } + +_END: + return 0; +} + + +int main(int argc, char *argv[]) +{ + + av_log_set_level(AV_LOG_DEBUG); + // 1.输入参数 + if( argc<3 ){ + av_log(NULL, AV_LOG_ERROR, "arguments must be more than 3\n"); + goto _ERROR; + + } + char *dst = NULL; + char *codecName = NULL; + dst = argv[1]; + codecName = argv[2]; + + + // 2.查找编码器 + const AVCodec *codec = NULL; + codec = avcodec_find_encoder_by_name(codecName); + if( !codec ){ + av_log(NULL, AV_LOG_ERROR, "don't find Codec: %s\n", codecName); + goto _ERROR; + } + + // 3.创建编码器上下文 + AVCodecContext *ctx = avcodec_alloc_context3(codec); + if( !ctx ){ + av_log(NULL, AV_LOG_ERROR, "NO MEMRORY\n"); + goto _ERROR; + } + + // 4.设置编码器参数 + + ctx->width = 640; + ctx->height = 480; + ctx->bit_rate = 500000; // 一般在500~600之间 + + ctx->time_base = (AVRational){1, 25}; + ctx->framerate = (AVRational){25, 1}; + + ctx->gop_size = 10; + ctx->max_b_frames = 1; // 一般情况下不超过三帧 + ctx->pix_fmt = AV_PIX_FMT_YUV420P; + + if( codec->id == AV_CODEC_ID_H264 ){ // 设置私有属性 + av_opt_set(ctx->priv_data, "preset", "slow", 0); + } + + // 5.编码器与编码器上下文绑定到一起 + + int ret; + ret = avcodec_open2(ctx, codec, NULL); + if( ret < 0 ){ + av_log(ctx, AV_LOG_ERROR, "Don't open codec: %s\n", av_err2str(ret)); + goto _ERROR; + } + + // 6.创建输出文件 + FILE *f = fopen(dst, "wb"); + if( !f ){ + av_log(NULL, AV_LOG_ERROR, "Don't open file: %s\n", dst); + goto _ERROR; + } + + // 7.创建AVFrame (保存原始音频帧 + + AVFrame *frame = av_frame_alloc(); + if( !frame ){ + av_log(NULL, AV_LOG_ERROR, "NO MEMORY!\n"); + goto _ERROR; + } + + frame->width = ctx->width; + frame->height = ctx->height; + frame->format = ctx->pix_fmt; + ret = av_frame_get_buffer(frame, 0); + if( ret < 0 ){ + av_log(NULL, AV_LOG_ERROR, "Could not allocate the video frame. \n"); + goto _ERROR; + } + + // 8.创建AVPacket (保存编码后的音频帧 / 一个packet中可能含有多个 + + AVPacket *pkt = av_packet_alloc(); + if( !pkt ){ + av_log(NULL, AV_LOG_ERROR, "NO MEMORY!\n"); + goto _ERROR; + } + + + // 9.生成视频内容 + for( int i=0 ; i<25 ; i++ ){ + ret =av_frame_make_writable(frame); + if( ret < 0 ){ + break; + } + + // Y分量 + for( int y=0 ; yheight ; y++ ){ + for( int x=0 ; xwidth ; x++ ){ + frame->data[0][y*frame->linesize[0] + x] = x + y + i * 3; + } + } + + // UV分量 + for( int y=0 ; yheight/2 ; y++ ){ + for( int x=0 ; xwidth/2 ; x++ ){ + frame->data[1][y*frame->linesize[1] + x] = 128 + y + i * 2; + frame->data[2][y*frame->linesize[2] + x] = 64 + x + i * 5; + } + } + + frame->pts = i; + + + + // 10.编码 + ret = encode(ctx, frame, pkt, f); + if( ret == -1 ){ + goto _ERROR; + } + } + + // 10.编码 + encode(ctx, NULL, pkt, f); + +_ERROR: + // ctx + if( ctx ){ + avcodec_free_context(&ctx); + } + // // avframe + // if( frame ){ + // av_frame_free(&frame); + // } + // // avpacket + // if( pkt ){ + // av_packet_free(&pkt); + // } + // // dst + // if( f ){ + // fclose(f); + // } + + return 0; +} + From aa062c7245d1597a96573d405b015e29fc651489 Mon Sep 17 00:00:00 2001 From: Killer-Queue <1179868384@qq.com> Date: Thu, 25 Apr 2024 22:05:23 -0700 Subject: [PATCH 3/4] =?UTF-8?q?=E8=AF=B7=E4=B8=BA=E6=82=A8=E7=9A=84?= =?UTF-8?q?=E5=8F=98=E6=9B=B4=E8=BE=93=E5=85=A5=E6=8F=90=E4=BA=A4=E8=AF=B4?= =?UTF-8?q?=E6=98=8E=E3=80=82=E4=BB=A5=20'#'=20=E5=BC=80=E5=A7=8B=E7=9A=84?= =?UTF-8?q?=E8=A1=8C=E5=B0=86=E8=A2=AB=E5=BF=BD=E7=95=A5=EF=BC=8C=E8=80=8C?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E7=A9=BA=E7=9A=84=E6=8F=90=E4=BA=A4=20?= =?UTF-8?q?=E8=AF=B4=E6=98=8E=E5=B0=86=E4=BC=9A=E7=BB=88=E6=AD=A2=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 位于分支 master 您的分支领先 'origin/master' 共 2 个提交。 (使用 "git push" 来发布您的本地提交) 要提交的变更: 修改: .vscode/settings.json 修改: .vscode/tasks.json 新文件: study_ffmpeg/6_/gen_pic 新文件: study_ffmpeg/6_/gen_pic.c 新文件: study_ffmpeg/6_/gen_pic_rgb 新文件: study_ffmpeg/6_/gen_pic_rgb.c --- .vscode/settings.json | 3 +- .vscode/tasks.json | 3 +- study_ffmpeg/6_/gen_pic | Bin 0 -> 65032 bytes study_ffmpeg/6_/gen_pic.c | 163 ++++++++++++++++++++++ study_ffmpeg/6_/gen_pic_rgb | Bin 0 -> 66296 bytes study_ffmpeg/6_/gen_pic_rgb.c | 246 ++++++++++++++++++++++++++++++++++ 6 files changed, 413 insertions(+), 2 deletions(-) create mode 100755 study_ffmpeg/6_/gen_pic create mode 100644 study_ffmpeg/6_/gen_pic.c create mode 100755 study_ffmpeg/6_/gen_pic_rgb create mode 100644 study_ffmpeg/6_/gen_pic_rgb.c diff --git a/.vscode/settings.json b/.vscode/settings.json index 9376a6d..0df7f03 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,6 +2,7 @@ "C_Cpp.errorSquiggles": "enabled", "files.associations": { "stdio.h": "c", - "log.h": "c" + "log.h": "c", + "gen_pic_rgb": "c" } } \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 2c58a75..69485e1 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -14,7 +14,8 @@ "-L/usr/local/ffmpeg/lib", "-lavutil", "-lavformat", - "-lavcodec" + "-lavcodec", + "-lswscale" ], "options": { "cwd": "${fileDirname}" diff --git a/study_ffmpeg/6_/gen_pic b/study_ffmpeg/6_/gen_pic new file mode 100755 index 0000000000000000000000000000000000000000..b1453a1eb5cea3fc2b7964c35f03db6b581468aa GIT binary patch literal 65032 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 literal 0 HcmV?d00001 diff --git a/study_ffmpeg/6_/gen_pic.c b/study_ffmpeg/6_/gen_pic.c new file mode 100644 index 0000000..77b5cff --- /dev/null +++ b/study_ffmpeg/6_/gen_pic.c @@ -0,0 +1,163 @@ +#include +#include +#include +#include +#include +#include + +static void savePic(unsigned char *buf, int linesize, int width, int height, char *name){ + FILE *f; + f = fopen(name, "wb"); + fprintf(f, "P5\n%d %d\n%d\n", width, height, 255); + for( int i=0 ; i= 0 ){ + ret = avcodec_receive_frame(ctx, frame); + if( ret == AVERROR(EAGAIN) || ret == AVERROR_EOF ){ + return 0; + } + else if( ret < 0 ){ + return -1; + } + snprintf(buf, sizeof(buf), "%s-%ld", out, ctx->frame_num); + savePic(frame->data[0], + frame->linesize[0], + frame->width, + frame->height, + buf + ); + if( pkt ){ + av_packet_unref(pkt); + } + } + +_END: + return 0; +} + +int main(int argc, char* argv[]) +{ + // 1.处理一些参数; + int ret = -1; + char* src; + char* dst; + + struct SwsContext *swsCtx = NULL; + + av_log_set_level(AV_LOG_DEBUG); + if( argc < 3 ) { + av_log(NULL, AV_LOG_INFO, "arguments must be more than 3\n"); + exit(-1); + } + + src = argv[1]; + dst = argv[2]; + + // 2.打开多媒体文件; + + AVFormatContext *pFmtCtx = NULL; + if( (ret = avformat_open_input(&pFmtCtx, src, NULL, NULL)) < 0 ){ + av_log(NULL, AV_LOG_ERROR, "%s\n", av_err2str(ret)); + exit(-1); + } + + // 3.从多媒体文件中找到视频流 + + int idx = -1; + idx = av_find_best_stream(pFmtCtx, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0); + if( idx < 0 ){ + av_log(pFmtCtx, AV_LOG_ERROR, "Dose not include audio stream!\n"); + goto _ERROR; + } + + AVStream *inStream = NULL; + inStream = pFmtCtx->streams[idx]; + + // 4.查找解码器 + const AVCodec *codec = NULL; + codec = avcodec_find_decoder(inStream->codecpar->codec_id); + if( !codec ){ + av_log(NULL, AV_LOG_ERROR, "Could not find libx264 Codec\n"); + goto _ERROR; + } + + // 5.创建解码器上下文 + AVCodecContext *ctx = NULL; + ctx = avcodec_alloc_context3(codec); + if( !ctx ){ + av_log(NULL, AV_LOG_ERROR, "NO MEMRORY\n"); + goto _ERROR; + } + avcodec_parameters_to_context(ctx, inStream->codecpar); + + + // 6.解码器与解码器上下文绑定到一起 + ret = avcodec_open2(ctx, codec, NULL); + if( ret < 0 ){ + av_log(ctx, AV_LOG_ERROR, "Don't open codec: %s\n", av_err2str(ret)); + goto _ERROR; + } + + // 7.创建AVFrame (保存原始音频帧 + + AVFrame *frame = NULL; + frame = av_frame_alloc(); + if( !frame ){ + av_log(NULL, AV_LOG_ERROR, "NO MEMORY!\n"); + goto _ERROR; + } + + // 8.创建AVPacket (保存编码后的音频帧 / 一个packet中可能含有多个 + + AVPacket *pkt = NULL; + pkt = av_packet_alloc(); + if( !pkt ){ + av_log(NULL, AV_LOG_ERROR, "NO MEMORY!\n"); + goto _ERROR; + } + + // 9.从源多媒体文件中读到视频数据到目的文件中 + + while( av_read_frame(pFmtCtx, pkt) >= 0) { + if( pkt->stream_index == idx ){ + decode(ctx, frame, pkt, dst); + } + } + decode(ctx, frame, NULL, dst); + + // 10.将申请的资源释放掉 +_ERROR: + if( pFmtCtx ){ + avformat_close_input(&pFmtCtx); + pFmtCtx = NULL; + } + if( ctx ){ + avcodec_free_context(&ctx); + ctx = NULL; + } + if( frame ){ + av_frame_free(&frame); + frame = NULL; + } + if( pkt ){ + av_packet_free(&pkt); + pkt = NULL; + } + return 0; +} \ No newline at end of file diff --git a/study_ffmpeg/6_/gen_pic_rgb b/study_ffmpeg/6_/gen_pic_rgb new file mode 100755 index 0000000000000000000000000000000000000000..1cc21b1712c6200d066041525994cdee69b9652c GIT binary patch literal 66296 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 literal 0 HcmV?d00001 diff --git a/study_ffmpeg/6_/gen_pic_rgb.c b/study_ffmpeg/6_/gen_pic_rgb.c new file mode 100644 index 0000000..07ab530 --- /dev/null +++ b/study_ffmpeg/6_/gen_pic_rgb.c @@ -0,0 +1,246 @@ +#include +#include +#include +#include +#include +#include + +#define WORD uint16_t +#define DWORD uint32_t +#define LONG int32_t + +static void savePic(unsigned char *buf, int linesize, int width, int height, char *name){ + FILE *f; + f = fopen(name, "wb"); + fprintf(f, "P5\n%d %d\n%d\n", width, height, 255); + for( int i=0 ; iwidth = width; + frameBGR->height = height; + frameBGR->format = AV_PIX_FMT_BGR24; + + av_frame_get_buffer(frameBGR, 0); + + sws_scale(swsCtx, (const uint8_t * const *)frame->data, frame->linesize, 0, frame->height, frameBGR->data, frameBGR->linesize); + + // 2.BITMAPINFOHEADER + BITMAPINFOHEADER infoHeader; + infoHeader.biSize = sizeof(BITMAPINFOHEADER); + infoHeader.biWidth = width ; + infoHeader.biHeight = height * (-1); // 因为坐标正好与我们正常坐标相反 + infoHeader.biCompression = 0; + infoHeader.biSizeImage = 0; + infoHeader.biClrImportant = 0; + infoHeader.biClrUsed = 0; + infoHeader.biXPelsPerMeter = 0; + infoHeader.biYPelsPerMeter = 0; + infoHeader.biPlanes = 0; + + // 3.BITMAPFILEHEADER + int datasize = width * height * 3; + + BITMAPFILEHEADER fileHeader; + fileHeader.bfType = 0x4d42 ; // "BM" + fileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + datasize; + fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); + + // 4.将数据写到文件中 + FILE *f = NULL; + f = fopen(name, "wb"); + fwrite(&fileHeader, sizeof(BITMAPFILEHEADER), 1, f); + fwrite(&infoHeader, sizeof(BITMAPINFOHEADER), 1, f); + fwrite(frame->data[0], 1, datasize, f); + + // 5.释放资源 + fclose(f); + av_freep(&frameBGR->data[0]); + av_free(frameBGR); + + +} + +static int decode(AVCodecContext *ctx, struct SwsContext *swsCtx, AVFrame *frame, AVPacket *pkt, char *out){ + + int ret = -1; + + ret = avcodec_send_packet(ctx, pkt); + if( ret < 0 ) + { + av_log(NULL, AV_LOG_ERROR, "Failed to send frame to decoder!\n"); + goto _END; + } + + char buf[1024]; + while( ret >= 0 ){ + ret = avcodec_receive_frame(ctx, frame); + if( ret == AVERROR(EAGAIN) || ret == AVERROR_EOF ){ + return 0; + } + else if( ret < 0 ){ + return -1; + } + snprintf(buf, sizeof(buf), "%s-%ld", out, ctx->frame_num); + /* + savePic(frame->data[0], + frame->linesize[0], + frame->width, + frame->height, + buf); + */ + saveBMP(swsCtx, frame, frame->width, frame->height, buf); + if( pkt ){ + av_packet_unref(pkt); + } + } + +_END: + return 0; +} + +int main(int argc, char* argv[]) +{ + // 1.处理一些参数; + int ret = -1; + char* src; + char* dst; + + struct SwsContext *swsCtx = NULL; + + av_log_set_level(AV_LOG_DEBUG); + if( argc < 3 ) { + av_log(NULL, AV_LOG_INFO, "arguments must be more than 3\n"); + exit(-1); + } + + src = argv[1]; + dst = argv[2]; + + // 2.打开多媒体文件; + + AVFormatContext *pFmtCtx = NULL; + if( (ret = avformat_open_input(&pFmtCtx, src, NULL, NULL)) < 0 ){ + av_log(NULL, AV_LOG_ERROR, "%s\n", av_err2str(ret)); + exit(-1); + } + + // 3.从多媒体文件中找到视频流 + + int idx = -1; + idx = av_find_best_stream(pFmtCtx, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0); + if( idx < 0 ){ + av_log(pFmtCtx, AV_LOG_ERROR, "Dose not include audio stream!\n"); + goto _ERROR; + } + + AVStream *inStream = NULL; + inStream = pFmtCtx->streams[idx]; + + // 4.查找解码器 + const AVCodec *codec = NULL; + codec = avcodec_find_decoder(inStream->codecpar->codec_id); + if( !codec ){ + av_log(NULL, AV_LOG_ERROR, "Could not find libx264 Codec\n"); + goto _ERROR; + } + + // 5.创建解码器上下文 + AVCodecContext *ctx = NULL; + ctx = avcodec_alloc_context3(codec); + if( !ctx ){ + av_log(NULL, AV_LOG_ERROR, "NO MEMRORY\n"); + goto _ERROR; + } + avcodec_parameters_to_context(ctx, inStream->codecpar); + + + // 6.解码器与解码器上下文绑定到一起 + ret = avcodec_open2(ctx, codec, NULL); + if( ret < 0 ){ + av_log(ctx, AV_LOG_ERROR, "Don't open codec: %s\n", av_err2str(ret)); + goto _ERROR; + } + + // 6.1获得SWS上下文 + swsCtx = sws_getContext(ctx->width, ctx->height, AV_PIX_FMT_YUV420P, // src的 + 640, 360, AV_PIX_FMT_BGR24, // dst的 + SWS_BICUBIC, NULL, NULL, NULL); + + // 7.创建AVFrame (保存原始音频帧 + + AVFrame *frame = NULL; + frame = av_frame_alloc(); + if( !frame ){ + av_log(NULL, AV_LOG_ERROR, "NO MEMORY!\n"); + goto _ERROR; + } + + // 8.创建AVPacket (保存编码后的音频帧 / 一个packet中可能含有多个 + + AVPacket *pkt = NULL; + pkt = av_packet_alloc(); + if( !pkt ){ + av_log(NULL, AV_LOG_ERROR, "NO MEMORY!\n"); + goto _ERROR; + } + + // 9.从源多媒体文件中读到视频数据到目的文件中 + + while( av_read_frame(pFmtCtx, pkt) >= 0) { + if( pkt->stream_index == idx ){ + decode(ctx, swsCtx, frame, pkt, dst); + } + } + decode(ctx, swsCtx, frame, NULL, dst); + + // 10.将申请的资源释放掉 +_ERROR: + if( pFmtCtx ){ + avformat_close_input(&pFmtCtx); + pFmtCtx = NULL; + } + if( ctx ){ + avcodec_free_context(&ctx); + ctx = NULL; + } + if( frame ){ + av_frame_free(&frame); + frame = NULL; + } + if( pkt ){ + av_packet_free(&pkt); + pkt = NULL; + } + return 0; +} \ No newline at end of file From d74c83663ce970f0608e30ce22a8d2757ed93eab Mon Sep 17 00:00:00 2001 From: Killer-Queue <1179868384@qq.com> Date: Sun, 5 May 2024 18:42:09 -0700 Subject: [PATCH 4/4] =?UTF-8?q?=E8=AF=B7=E4=B8=BA=E6=82=A8=E7=9A=84?= =?UTF-8?q?=E5=8F=98=E6=9B=B4=E8=BE=93=E5=85=A5=E6=8F=90=E4=BA=A4=E8=AF=B4?= =?UTF-8?q?=E6=98=8E=E3=80=82=E4=BB=A5=20'#'=20=E5=BC=80=E5=A7=8B=E7=9A=84?= =?UTF-8?q?=E8=A1=8C=E5=B0=86=E8=A2=AB=E5=BF=BD=E7=95=A5=EF=BC=8C=E8=80=8C?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E7=A9=BA=E7=9A=84=E6=8F=90=E4=BA=A4=20?= =?UTF-8?q?=E8=AF=B4=E6=98=8E=E5=B0=86=E4=BC=9A=E7=BB=88=E6=AD=A2=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 位于分支 master 您的分支领先 'origin/master' 共 3 个提交。 (使用 "git push" 来发布您的本地提交) 要提交的变更: 修改: .vscode/c_cpp_properties.json 修改: .vscode/launch.json 修改: .vscode/settings.json 修改: .vscode/tasks.json 新文件: study_ffmpeg/7_/SDL_Event 新文件: study_ffmpeg/7_/SDL_Event.c 新文件: study_ffmpeg/7_/SDL_PCM.c 新文件: study_ffmpeg/7_/first_sdl 新文件: study_ffmpeg/7_/first_sdl.c 新文件: study_ffmpeg/8_/simpleplayer.c --- .vscode/c_cpp_properties.json | 3 +- .vscode/launch.json | 2 +- .vscode/settings.json | 5 +- .vscode/tasks.json | 30 ++-------- study_ffmpeg/7_/SDL_Event | Bin 0 -> 36136 bytes study_ffmpeg/7_/SDL_Event.c | 97 +++++++++++++++++++++++++++++++++ study_ffmpeg/7_/SDL_PCM.c | 88 ++++++++++++++++++++++++++++++ study_ffmpeg/7_/first_sdl | Bin 0 -> 20800 bytes study_ffmpeg/7_/first_sdl.c | 39 +++++++++++++ study_ffmpeg/8_/simpleplayer.c | 9 +++ 10 files changed, 244 insertions(+), 29 deletions(-) create mode 100755 study_ffmpeg/7_/SDL_Event create mode 100644 study_ffmpeg/7_/SDL_Event.c create mode 100644 study_ffmpeg/7_/SDL_PCM.c create mode 100755 study_ffmpeg/7_/first_sdl create mode 100644 study_ffmpeg/7_/first_sdl.c create mode 100644 study_ffmpeg/8_/simpleplayer.c diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 9930a2f..f197b45 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -4,7 +4,8 @@ "name": "Linux", "includePath": [ "${workspaceFolder}/**", - "/usr/local/ffmpeg/include" + "/usr/local/ffmpeg/include", + "${workspaceFolder}/libs_win/develop/SDL2-2.0.9/include" ], "defines": [], "compilerPath": "/usr/bin/gcc", diff --git a/.vscode/launch.json b/.vscode/launch.json index 3bcd62c..fbf1eb8 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -9,7 +9,7 @@ "name": "(gdb) 启动",//配置名称 "type": "cppdbg",//配置类型,对应cpptools提供的调试功能 "request": "launch",//请求配置类型,可以是启动/附加类型[launch/attach] - "program": "${workspaceFolder}/study_ffmpeg/6_/${fileBasenameNoExtension}",//待调试程序本地路径 + "program": "${workspaceFolder}/study_ffmpeg/7_/${fileBasenameNoExtension}",//待调试程序本地路径 "args": [//程序调试时传递给程序的命令行参数,设为空值 "build_avdio.h264", "libx264" diff --git a/.vscode/settings.json b/.vscode/settings.json index 0df7f03..2a0bda3 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,6 +3,9 @@ "files.associations": { "stdio.h": "c", "log.h": "c", - "gen_pic_rgb": "c" + "gen_pic_rgb": "c", + "sdl.h": "c", + "avcodec.h": "c", + "avutil.h": "c" } } \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 69485e1..5a1d0bc 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -12,10 +12,13 @@ "-lm", "-I/usr/local/ffmpeg/include", "-L/usr/local/ffmpeg/lib", + "-I/${workspaceFolder}/libs_win/develop/SDL2-2.0.9/include", + "-L/${workspaceFolder}/libs_win/develop/SDL2-2.0.9/lib", "-lavutil", "-lavformat", "-lavcodec", - "-lswscale" + "-lswscale", + "-lSDL2" ], "options": { "cwd": "${fileDirname}" @@ -29,31 +32,6 @@ }, "detail": "调试器生成的任务。" }, - // { - // "type": "cppbuild", - // "label": "C/C++: gcc 生成活动文件", - // "command": "/usr/bin/gcc", - // "args": [ - // "-g", - // "${file}", - // "-o", - // "${fileDirname}/${fileBasenameNoExtension}", - // "-I/usr/local/ffmpeg/include", - // "-L/usr/local/ffmpeg/lib", - // "-lavutil" - // ], - // "options": { - // "cwd": "${fileDirname}" - // }, - // "problemMatcher": [ - // "$gcc" - // ], - // "group": { - // "kind": "build", - // "isDefault": true - // }, - // "detail": "调试器生成的任务。" - // } ], "version": "2.0.0" } \ No newline at end of file diff --git a/study_ffmpeg/7_/SDL_Event b/study_ffmpeg/7_/SDL_Event new file mode 100755 index 0000000000000000000000000000000000000000..9718c221eb2e1b22ff3320490d6ccb21f2d8dcdc GIT binary patch literal 36136 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 FKLKsCj&T40 literal 0 HcmV?d00001 diff --git a/study_ffmpeg/7_/SDL_Event.c b/study_ffmpeg/7_/SDL_Event.c new file mode 100644 index 0000000..3ab2f57 --- /dev/null +++ b/study_ffmpeg/7_/SDL_Event.c @@ -0,0 +1,97 @@ +#include +#include + +int main(int argc, char* argv[]) +{ + int quit = 1; + + + + + + SDL_Init(SDL_INIT_VIDEO); + + + SDL_Window* window = NULL; + window = SDL_CreateWindow("SDL2 Window", + 200, // 窗口初始位置x + 200, // 窗口初始位置y + 640, // 窗口宽度 + 480, // 窗口高度 + SDL_WINDOW_SHOWN + ); + if (!window) { + printf("Failed to create window."); + goto __EXIT; + } + + + SDL_Renderer* render = NULL; + render = SDL_CreateRenderer(window, -1, 0); + if (!render) { + SDL_Log("Failed to create render."); + goto __DWINDOW; + } + +/* + SDL_SetRenderDrawColor(render, 255, 0, 0, 255); + + SDL_RenderClear(render); + + SDL_RenderPresent(render); + */ + + SDL_Texture* texture = NULL; + texture = SDL_CreateTexture(render, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, 600, 480); + if (!texture) { + SDL_Log("Failed to create texture!"); + goto __RENDER; + } + + + + SDL_Event event; + SDL_Rect rect; + rect.w = 30; + rect.h = 30; + do { + // SDL_WaitEvent(&event); 没有事件的时候,代码会阻塞在这里,等待事件。 + SDL_PollEvent(&event); + switch(event.type) { + case SDL_QUIT: + quit = 0; + break; + default: + SDL_Log("event type is: %d", event.type); + } + + + rect.x = rand() % 600; + rect.y = rand() % 480; + + SDL_SetRenderTarget(render, texture); + SDL_SetRenderDrawColor(render, 0, 0, 0, 0); + SDL_RenderClear(render); + + SDL_RenderDrawRect(render, &rect); + SDL_SetRenderDrawColor(render, 255, 0, 0, 0); + SDL_RenderFillRect(render, &rect); // 方块是特殊的,不是完整的,不能用SDL_RenderClear + + SDL_SetRenderTarget(render, NULL); // 恢复成默认的渲染目标 + SDL_RenderCopy(render, texture, NULL, NULL); + + SDL_RenderPresent(render); + } while(quit); + + SDL_DestroyTexture(texture); + +__RENDER: + SDL_DestroyRenderer(render); + +__DWINDOW: + SDL_DestroyWindow(window); + +__EXIT: + SDL_Quit(); + return 0; +} \ No newline at end of file diff --git a/study_ffmpeg/7_/SDL_PCM.c b/study_ffmpeg/7_/SDL_PCM.c new file mode 100644 index 0000000..5c0e70d --- /dev/null +++ b/study_ffmpeg/7_/SDL_PCM.c @@ -0,0 +1,88 @@ +#include +#include + +#define BLOCK_SIZE 4096000 + +static size_t buffer_len = 0; +static Uint8* audio_buf = NULL; +static Uint8* audio_pos = NULL; + +// udata 是 spec.userdata。 stream 是声卡的缓冲区指针。len 是声卡缓冲区的长度。 +void read_audio_data(void* udata, Uint8* stream, int len) +{ + if (0 == buffer_len) { + return; + } + + SDL_memset(stream, 0, len); + + len = (len < buffer_len) ? len : buffer_len; + SDL_MixAudio(stream, audio_pos, len, SDL_MIX_MAXVOLUME); + + audio_pos += len; + buffer_len -= len; +} + +int main(int argc, char* argv[]) +{ + int ret = -1; + char* path = "./1.pcm"; + FILE* audio_fd = NULL; + + if (SDL_Init(SDL_INIT_AUDIO)) { + SDL_Log("Failed to initial!"); + return ret; + } + + audio_fd = fopen(path, "r"); + if (!audio_fd) { + SDL_Log("Failed to open pcm file!"); + goto __FAIL; + } + + audio_buf = (Uint8*)malloc(BLOCK_SIZE); + if (!audio_buf) { + SDL_Log("Failed to alloc memory"); + goto __FAIL; + } + + SDL_AudioSpec spec; + spec.freq = 44100; + spec.channels = 2; + spec.format = AUDIO_S16SYS; + spec.silence = 0; + spec.callback = read_audio_data; + spec.userdata = NULL; + + if(SDL_OpenAudio(&spec, NULL)) { + SDL_Log("Failed to open audio device!"); + goto __FAIL; + } + + SDL_PauseAudio(0); + + do { + buffer_len = fread(audio_buf, 1, BLOCK_SIZE, audio_fd); + audio_pos = audio_buf; + while (audio_pos < (audio_buf + buffer_len)) { + SDL_Delay(1); + } + } while(buffer_len != 0); + + SDL_CloseAudio(); + + ret = 0; + +__FAIL: + if (audio_buf) { + free(audio_buf); + } + + if (audio_fd) { + fclose(audio_fd); + } + + SDL_Quit(); + + return 0; +} \ No newline at end of file diff --git a/study_ffmpeg/7_/first_sdl b/study_ffmpeg/7_/first_sdl new file mode 100755 index 0000000000000000000000000000000000000000..c443fa2aa95bfe3ab035e769e744fa993410104a GIT binary patch literal 20800 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 +#include + +int main(int argc, char *argv[]) +{ + SDL_Window *window = NULL; + + SDL_Init(SDL_INIT_VIDEO); + + window = SDL_CreateWindow("SDL2 Window", 200, 200, 640, 480, SDL_WINDOW_SHOWN); + + if( !window ){ + printf("Failed to Create window!\n"); + goto __EXIT; + } + + SDL_Renderer *render = NULL; + render = SDL_CreateRenderer(window, -1, 0); + + if( !render ){ + SDL_Log("Failed ot Create Render!"); + goto __DWINDOWN; + } + + SDL_SetRenderDrawColor(render, 255, 0, 0, 255); + + SDL_RenderClear(render); + + SDL_RenderPresent(render); + + SDL_Delay(30000); + +__DWINDOWN: + SDL_DestroyWindow(window); + +__EXIT: + SDL_Quit(); + return 0; +} diff --git a/study_ffmpeg/8_/simpleplayer.c b/study_ffmpeg/8_/simpleplayer.c new file mode 100644 index 0000000..9cf755a --- /dev/null +++ b/study_ffmpeg/8_/simpleplayer.c @@ -0,0 +1,9 @@ +#include +#include +#include +#include + +int main() +{ + +} \ No newline at end of file