11pub mod parse {
2- use crate :: cmd:: cmd:: { combine, combine_ts} ;
2+ use crate :: cmd:: cmd:: { clear_temp_files , combine, combine_ts, get_video_info , transcode_video_to_spec_params } ;
33 use crate :: common:: now;
44 use crate :: m3u8:: HlsM3u8Method ;
55 use openssl:: symm:: { decrypt, Cipher } ;
66 use std:: fmt:: Error ;
77 use std:: fs:: File ;
88 use std:: io:: prelude:: * ;
9+ use clap:: builder:: TypedValueParser ;
10+ use reqwest:: header:: COOKIE ;
911 use tempfile:: tempdir;
1012
1113 pub fn get_reg_files (
@@ -59,18 +61,103 @@ pub mod parse {
5961 set_a_b : i32 ,
6062 set_v_b : i32 ,
6163 set_fps : i32 ,
64+ set_width : i32 ,
65+ set_height : i32 ,
6266 ) -> Result < bool , Error > {
63- white_to_files ( files. clone ( ) , file_name. clone ( ) ) . expect ( "写入文件失败" ) ;
64- if same_param_index == -1 && set_a_b == 0 && set_v_b == 0 && set_fps == 0 {
67+ if same_param_index == -1 && set_a_b == 0 && set_v_b == 0 && set_fps == 0
68+ && set_width == 0 && set_height == 0 {
69+ white_to_files ( files. clone ( ) , file_name. clone ( ) ) . expect ( "写入文件失败" ) ;
6570 return combine ( file_name. clone ( ) , target_file_name) ;
6671 }
67- let mut audit_b = set_a_b;
68- let mut video_b = set_v_b;
69- let mut fps = set_fps;
70- if same_param_index != -1 { }
72+ // 如果不指定视频参数相同的索引,那么就按照传过来的参数处理
73+ let mut a_b = 128000 ; // audio bitrate
74+ let mut v_b = 1200000 ; // video bitrate
75+ let mut fps = 30 ; // fps
76+ let mut width = 1280 ; // width
77+ let mut height = 720 ; // height
78+ if same_param_index != -1 {
79+ let info = get_video_info ( & files. get ( same_param_index as usize ) . unwrap ( ) . to_string ( ) ) ;
80+ match info {
81+ Some ( data_info) => {
82+ if data_info. audio_rate > 0 {
83+ a_b = data_info. audio_rate ;
84+ }
85+ if data_info. fps > 0.0 {
86+ fps = data_info. fps as i32 ;
87+ }
88+ if data_info. video_rate > 0 {
89+ v_b = data_info. video_rate ;
90+ }
91+ if data_info. width > 0 {
92+ width = data_info. width ;
93+ }
94+ if data_info. height > 0 {
95+ height = data_info. height ;
96+ }
97+ }
98+ None => {
99+ return Ok ( false )
100+ }
101+ }
102+ } else {
103+ if set_a_b > 0 {
104+ a_b = set_a_b;
105+ }
106+ if set_fps > 0 {
107+ fps = set_fps;
108+ }
109+ if set_v_b > 0 {
110+ v_b = set_v_b;
111+ }
112+ if set_width > 0 {
113+ width = set_width
114+ }
115+ if set_height > 0 {
116+ height = set_height
117+ }
118+ }
119+ println ! ( "ab {} vb {} fps {} width {} height {}" , a_b, v_b, fps, width, height) ;
120+ transcode_videos_to_same_params ( files. clone ( ) , file_name. clone ( ) , target_file_name, a_b, v_b, fps, width, height)
121+ }
122+
123+ // cargo run -- combine -r="/Users/meow.zang/RustroverProjects/ffmpeg-tool-rs/images/video/(.*).mp4" --reg-file-start=1 --reg-file-end=2 --same_param_index=1
124+ fn transcode_videos_to_same_params ( files : Vec < String > , file : String , target : String , a_b : i32 , v_b : i32 , fps : i32 , width : i32 , height : i32 ) -> Result < bool , Error > {
125+ let mut index: i32 = 0 ;
126+ let mut result_files = vec ! [ ] ;
127+ // 先将ts文件转成mp4
128+ for i in files. clone ( ) {
129+ let file_name = format ! ( "_temp_{}.mp4" , index) ;
130+ result_files. push ( file_name. clone ( ) ) ;
131+ let _ = transcode_video_to_spec_params ( i. clone ( ) , file_name. clone ( ) , a_b, v_b, fps, width, height) ;
132+ index += 1 ;
133+ }
134+ // 在将mp4文件合并成一个文件
135+ let combine_res = mp4_files_combine_one ( result_files. clone ( ) , file, target) ;
136+ match combine_res {
137+ Ok ( data) => {
138+ if data {
139+ // 清除文件
140+ let _ = clear_temp_video_files ( result_files. clone ( ) ) ;
141+ }
142+ Ok ( data)
143+ }
144+ Err ( e) => {
145+ Err ( e)
146+ }
147+ }
148+ }
149+
150+ // 清理_temp_.mp4开头的文件
151+ fn clear_temp_video_files ( files : Vec < String > ) -> Result < bool , Error > {
71152 Ok ( true )
72153 }
73154
155+ fn mp4_files_combine_one ( mp4_files : Vec < String > , file : String , target : String ) -> Result < bool , Error > {
156+ println ! ( "file {}, target {}" , file. clone( ) , target. clone( ) ) ;
157+ white_to_files ( mp4_files. clone ( ) , file. clone ( ) ) . expect ( "写入文件失败" ) ;
158+ combine ( file. clone ( ) , target)
159+ }
160+
74161 async fn combine_without_crypto (
75162 reg_name : String ,
76163 reg_start : i32 ,
@@ -149,7 +236,7 @@ pub mod parse {
149236 start_se as u8 ,
150237 & i,
151238 )
152- . await ;
239+ . await ;
153240 start_se += 1 ;
154241 }
155242 return combine_without_crypto (
@@ -158,7 +245,7 @@ pub mod parse {
158245 reg_end,
159246 target_name,
160247 )
161- . await ;
248+ . await ;
162249 }
163250
164251 pub async fn handle_combine_ts (
@@ -182,7 +269,7 @@ pub mod parse {
182269 iv. clone ( ) ,
183270 sequence,
184271 )
185- . await
272+ . await
186273 }
187274 Some ( HlsM3u8Method :: SampleAes ) => {
188275 println ! ( "simple aes" ) ;
@@ -195,7 +282,7 @@ pub mod parse {
195282 iv. clone ( ) ,
196283 sequence,
197284 )
198- . await
285+ . await
199286 }
200287 None => {
201288 println ! ( "no crypto" ) ;
0 commit comments