sách gpt4 ăn đã đi

Thực hành triển khai ffmpeg để xử lý video bằng php

In lại Tác giả: qq735679552 Thời gian cập nhật: 28-09-2022 22:32:09 24 4
mua khóa gpt4 giày nike

CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.

Bài viết trên blog CFSDN này Thực hành triển khai ffmpeg để xử lý video trong PHP được tác giả sưu tầm và biên soạn. Nếu các bạn quan tâm đến bài viết này thì nhớ like nhé.

Gần đây, có một dự án yêu cầu sử dụng ffmpeg để xử lý video. Ở đây tôi đã viết một bản demo để tạo điều kiện thuận lợi cho chúng tôi thực hiện các thao tác video.

bản demo hoạt động ffmpeg

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
 
không gian tên người trợ giúp chung;
 
sử dụng common\models\Config;
sử dụng common\models\VideoApiLog;
sử dụng Cái này;
sử dụng yii\helpers\ArrayHelper;
sử dụng common\helpers\Universal;
sử dụng yii\helpers\FileHelper;
sử dụng yii\httpclient\Khách hàng;
sử dụng yii\web\ServerErrorHttpException;
 
/**
  * xử lý video ffmpeg
  *
  * @tác giả wangjian
  * @kể từ 0.1
  */
lớp học VideoFfmpeg
{
 
     công cộng $ffmpeg = 'ffmpeg' ;
 
 
     công cộng chức năng __xây dựng( $ffmpeg = không có)
     {
         nếu như ( $ffmpeg ) {
             $cái này ->ffmpeg = $ffmpeg ;
         }
     }
 
 
     /**
      * Thêm cuộn văn bản video
      * @param $source video chuỗi
      * @param $saveFile tệp lưu chuỗi
      * @param $text chuỗi văn bản hình mờ
      * @param mảng $options kiểu hình mờ
      * @param int $kích thước bước bước mỗi giây
      * @param int $star thời gian xuất hiện
      */
     công cộng chức năng tiêu đềMod( $nguồn , $saveFile , $văn bản , $tùy chọn = [], $bước = 20, $sao = 0)
     {
         $lệnh = $cái này ->ffmpeg . '-y-tôi' . $nguồn . ' -async 1 -siêu dữ liệu:s:v:0 thời gian bắt đầu=0 -vf ' ;
 
         $phông chữ = Cái này::getAlias( '@webroot' ) . "/fonts/simsun.ttc" ;
         $phông chữ = str_replace ( '\\' , '/' , $phông chữ );
         $phông chữ = str_replace ( ':' , '\\:' , $phông chữ );
         $lệnh .= '"drawtext=fontfile=\'' . $phông chữ . '\': văn bản=\'' . $văn bản . ''\'' ;
 
         foreach ( $tùy chọn BẰNG $chìa khóa => $giá trị ) {
             $lệnh .= ':' . $chìa khóa . '=' . $giá trị ;
         }
 
         $lệnh .= ':x=\'nếu(gte(t,' . $sao . '),((t-' . $sao . ') * ' . $bước . '),NAN)\'' ;
 
         $lệnh .= "" ' ;
         $lệnh .= $saveFile ;
         thực hiện ( $lệnh , $đầu ra , $mã_kết_quả );
         nếu như ( $mã_kết_quả == 0) {
             trở lại ĐÚNG VẬY;
         }
         trở lại  SAI;
     }
 
 
     /**
      * Hình mờ hình ảnh
      * @param $source video chuỗi
      * @param $saveFile tệp lưu chuỗi
      * @param $waterImage hình ảnh hình mờ chuỗi
      * @param $left vị trí số nguyên nằm ngang của hình mờ
      * @param $top số nguyên vị trí dọc của hình mờ
      * @param null $ sao thời gian bắt đầu hình mờ
      * @param null $duration thời lượng hình mờ
      */
     công cộng chức năng hình ảnhNước( $nguồn , $saveFile , $waterHình ảnh , $trái , $đầu trang , $sao = rỗng, $thời gian = không có)
     {
         $waterHình ảnh = str_replace ( '\\' , '/' , $waterHình ảnh );
         $waterHình ảnh = str_replace ( ':' , '\\:' , $waterHình ảnh );
         $lệnh = $cái này ->ffmpeg . '-y-tôi' . $nguồn . ' -vf "phim=\'' . $waterHình ảnh . '\'[hình mờ];' ;
         $lệnh .= '[trong][hình mờ] lớp phủ=' . $trái . ':' . $đầu trang ;
         nếu như ( $sao ) {
             $kết thúc = ( $thời gian ) ? $sao + $thời gian : $sao ;
             $lệnh .= ':enable=\'giữa(t,' . $sao . ',' . $kết thúc . ')\'' ;
         }
         $lệnh .= '[ngoài] " ' . $saveFile ;
         thực hiện ( $lệnh , $đầu ra , $mã_kết_quả );
         nếu như ( $mã_kết_quả == 0) {
             trở lại ĐÚNG VẬY;
         }
         trở lại  SAI;
     }
 
 
     /**
      * Thêm hình mờ văn bản vào video
      * @param $source video chuỗi
      * @param $saveFile tệp lưu chuỗi
      * @param $text chuỗi văn bản hình mờ
      * @param mảng $options kiểu hình mờ
      * @param null $ sao thời gian bắt đầu hình mờ
      * @param null $duration thời lượng hình mờ
      */
     công cộng chức năng tiêu đềNước( $nguồn , $saveFile , $văn bản , $tùy chọn = [], $sao = rỗng, $thời gian = không có)
     {
         $lệnh = $cái này ->ffmpeg . '-y-tôi' . $nguồn . '-vf' ;
         $phông chữ = Cái này::getAlias( '@webroot' ) . "/phông chữ/STZHONGS.TTF" ;
         $phông chữ = str_replace ( '\\' , '/' , $phông chữ );
         $phông chữ = str_replace ( ':' , '\\:' , $phông chữ );
         $lệnh .= '"drawtext=fontfile=\'' . $phông chữ . '\': văn bản=\'' . $văn bản . ''\'' ;
 
         foreach ( $tùy chọn BẰNG $chìa khóa => $giá trị ) {
             $lệnh .= ':' . $chìa khóa . '=' . $giá trị ;
         }
         nếu như ( $sao ) {
             $kết thúc = ( $thời gian ) ? $sao + $thời gian : $sao ;
             $lệnh .= ':enable=\'giữa(t,' . $sao . ',' . $kết thúc . ')\'' ;
         }
         $lệnh .= "" ' ;
         $lệnh .= $saveFile ;
 
         thực hiện ( $lệnh , $đầu ra , $mã_kết_quả );
         nếu như ( $mã_kết_quả == 0) {
             trở lại ĐÚNG VẬY;
         }
         trở lại  SAI;
     }
 
     /**
      * Hợp nhất âm thanh vào video
      * @param $videoFile tệp video chuỗi
      * @param $audioFile tệp âm thanh chuỗi
      * @param $saveFile tệp lưu chuỗi
      * @param $delay số nguyên Giây trễ chèn âm thanh
      */
     công cộng chức năng hợp nhấtVideoÂm thanh( $videoTệp , $audioFile , $saveFile , $trì hoãn = không có)
     {
         $thời gian trễ = 0;
         nếu như ( $trì hoãn ) {
             $thời gian trễ = $trì hoãn * 1000;
         }
         $lệnh $cái này ->ffmpeg . '-y-tôi' . $audioFile . ' -Tôi ' . $videoTệp . ' -c:v sao chép -c:a aac -strict thử nghiệm -filter_complex "[0]adelay=' . $thời gian trễ . '|' . $thời gian trễ . '[del1],[1][del1]kết hợp" ' . $saveFile ;
         thực hiện ( $lệnh , $đầu ra , $mã_kết_quả );
         nếu như ( $mã_kết_quả == 0) {
             trở lại ĐÚNG VẬY;
         }
         trở lại  SAI;
     }
 
 
     /**
      * tắt tiếng
      */
     công cộng chức năng tắt tiếng âm thanh( $nguồn , $saveFile )
     {
         $lệnh $cái này ->ffmpeg . '-y-tôi' . $nguồn . ' -filter:a "khối lượng=0" ' . $saveFile ;
         thực hiện ( $lệnh , $đầu ra , $mã_kết_quả );
         nếu như ( $mã_kết_quả == 0) {
             trở lại ĐÚNG VẬY;
         }
         trở lại  SAI;
     }
 
 
     /**
      * Trích xuất âm thanh từ video
      * @param $source string Video có âm thanh cần được trích xuất
      * @param $saveFile âm thanh chuỗi được lưu sau khi trích xuất âm thanh
      * @return bool
      */
     công cộng chức năng thu thậpÂm thanh( $nguồn , $saveFile )
     {
         $lệnh $cái này ->ffmpeg . '-y-tôi' . $nguồn . ' -vn -acodec sao chép ' . $saveFile ;
         thực hiện ( $lệnh , $đầu ra , $mã_kết_quả );
         nếu như ( $mã_kết_quả == 0) {
             trở lại ĐÚNG VẬY;
         }
         trở lại  SAI;
     }
 
     /**
      * Loại bỏ âm thanh video
      * @param $source video chuỗi có âm thanh cần được loại bỏ
      * @param $saveFile string Video được lưu sau khi xóa âm thanh
      */
     công cộng chức năng xóaÂm thanh( $nguồn , $saveFile )
     {
         $lệnh $cái này ->ffmpeg . '-y-tôi' . $nguồn . ' -MỘT ' . $saveFile ;
 
         thực hiện ( $lệnh , $đầu ra , $mã_kết_quả );
         nếu như ( $mã_kết_quả == 0) {
             trở lại ĐÚNG VẬY;
         }
         trở lại  SAI;
     }
 
     /**
      * Ghép video
      * @param $sources mảng Video/âm thanh được ghép
      * @param $saveFile chuỗi video/âm thanh được ghép
      */
     công cộng chức năng ghépVideo( $nguồn , $saveFile )
     {
         $lệnh = [];
         $Tệp tạm thời = [];
         $baseĐường dẫn = sys_get_temp_dir();
         $chỉ số = 0;
         foreach ( $nguồn BẰNG $tôi => $nguồn ) {
             $tập tin = $baseĐường dẫn . '/' . $tôi . '.ts' ;
             $lệnh [ $chỉ số ] = $cái này ->ffmpeg . '-y-tôi' . $nguồn . ' -vcodec sao chép -acodec sao chép -vbsf h264_mp4toannexb ' . $tập tin ;
             $Tệp tạm thời [] = $tập tin ;
             $chỉ số ++;
         }
         $lệnh [ $chỉ số ] = $cái này ->ffmpeg . ' -y -i "gộp:' . nổ tung( '|' , $Tệp tạm thời ) . '" -acodec sao chép -vcodec sao chép -absf aac_adtstoasc ' . $saveFile ;
         foreach ( $lệnh BẰNG $lệnh ) {
             thực hiện ( $lệnh , $đầu ra , $mã_kết_quả );
         }
 
         foreach ( $Tệp tạm thời BẰNG $tập tin ) {
             @bỏ liên kết( $tập tin );
         }
         trở lại ĐÚNG VẬY;
 
     }
 
 
     /**
      * Cắt video
      * @param $source string cần cắt video/âm thanh
      * @param $saveChuỗi tệp Lưu video/âm thanh sau khi cắt
      * @param $star thời gian bắt đầu cắt chuỗi
      * @param null $duration thời lượng cắt chuỗi
      */
     công cộng chức năng clipVideo( $nguồn , $saveFile , $sao , $thời gian = không có)
     {
         $lệnh = $cái này ->ffmpeg . '-y-ss' . $sao ;
         nếu như ( $thời gian ) {
             $lệnh .= '-t' . $thời gian ;
         }
         $lệnh .= ' -Tôi ' . $nguồn . ' -acodec sao chép ' . $saveFile ;
         thực hiện ( $lệnh , $đầu ra , $mã_kết_quả );
         nếu như ( $mã_kết_quả == 0) {
             trở lại ĐÚNG VẬY;
         }
         trở lại  SAI;
     }
 
     hằng số XOAY_90 = 'chuyển vị=1' ;
     hằng số XOAY_180 = 'hflip, vflip' ;
     hằng số XOAY_270 = 'chuyển vị=2' ;
 
     /**
      * Xoay video
      * @param $source video chuỗi cần được xoay
      * @param $saveFile video được xoay chuỗi
      * @param $xoay góc xoay chuỗi
      */
     công cộng chức năng chuyển đoạnVideo( $nguồn , $saveFile , $xoay )
     {
 
         $lệnh = $cái này ->ffmpeg . '-y-tôi' . $nguồn . ' -vf ""chuyển vị=1"" ' . $saveFile ;
         thực hiện ( $lệnh , $đầu ra , $mã_kết_quả );
         nếu như ( $mã_kết_quả == 0) {
             trở lại ĐÚNG VẬY;
         }
         trở lại  SAI;
     }
 
     /**
      * Chuyển mã video
      * @param $source video/âm thanh chuỗi cần được chuyển mã
      * @param $saveFile chuỗi video/âm thanh được chuyển mã
      */
     công cộng chức năng acodecVideo( $nguồn , $saveFile )
     {
         $lệnh = $cái này ->ffmpeg . '-y-tôi' . $nguồn . ' -acodec sao chép -vcodec sao chép -f mp4 ' . $saveFile ;
         thực hiện ( $lệnh , $đầu ra , $mã_kết_quả );
         nếu như ( $mã_kết_quả == 0) {
             trở lại ĐÚNG VẬY;
         }
         trở lại  SAI;
     }
 
     /**
      * Ghép video
      * @param $sources mảng Video/âm thanh được ghép
      * @param $saveFile chuỗi video/âm thanh được ghép
      */
     công cộng chức năng nốiVideo( $nguồn , $saveFile )
     {
         $tập tin = $cái này ->createTemporaryFile();
         $fileStream = @ fopen ( $tập tin , 'TRONG' );
         nếu như ( $fileStream === sai) {
             ném mới ServerErrorHttpException( 'Không thể mở tệp tạm thời.' );
         }
 
         $đếm_video = 0;
         nếu như ( là_mảng ( $nguồn ) && ( đếm ( $nguồn ) > 0)) {
             foreach ( $nguồn BẰNG $videoĐường dẫn ) {
                 $dòng = "" ;
                 nếu như ( $đếm_video != 0)
                     $dòng .= "\N" ;
                 $dòng .= "tài liệu '" . str_replace ('\\ ',' / ',$videoPath) ."' ";
 
                 fwrite( $fileStream , $dòng );
                 $đếm_video ++;
             }
         }
         khác {
             ném mới ServerErrorHttpException( 'Danh sách video không phải là một mảng hợp lệ.' );
         }
 
         $lệnh = $cái này ->ffmpeg . ' -y -f nối -an toàn 0 -i ' . $tập tin . ' -c sao chép ' . $saveFile ;
         thực hiện ( $lệnh , $đầu ra , $mã_kết_quả );
         đóng( $fileStream );
         @bỏ liên kết( $tập tin ); //xóa tập tin
         nếu như ( $mã_kết_quả == 0) {
             trở lại ĐÚNG VẬY;
         }
         trở lại  SAI;
     }
 
     /**
      * Tạo một tập tin tạm thời
      */
     công cộng chức năng tạoTệpTạmThời()
     {
         $baseĐường dẫn = sys_get_temp_dir();
         nếu như (sai === $tập tin = @tempnam( $baseĐường dẫn , vô giá trị)) {
             ném mới ServerErrorHttpException( 'Không thể tạo tên tệp tạm thời' );
         }
         trở lại $tập tin ;
     }
 
     /**
      * Nhận thông tin video
      * @param $source string Tài nguyên cần lấy trong suốt thời gian
      */
     công cộng chức năng lấy Thuộc tính( $nguồn )
     {
         ob_start();
         $lệnh = $cái này ->ffmpeg . ' -Tôi "' . $nguồn . '" 2>&1' ;
         thông qua ( $lệnh );
         $getNội dung = ob_get_contents();
         ob_end_clean();
         $thời gian = 0;
         $chiều rộng = 0;
         $chiều cao = 0;
         nếu như (phù hợp với thai( "/Thời lượng: (.*?), bắt đầu: (.*?), tốc độ bit: (\d*) kb\/giây/" , $getNội dung , $phù hợp )) {
             $match = nổ tung ( ':' , $phù hợp [1]);
             $thời gian = $match [0] * 3600 + $match [1] * 60 + $match [2]; // Chuyển đổi thời gian phát lại thành giây
         }
 
         nếu như (phù hợp với thai( "/Video: (.*?), (.*?), (.*?)[,\s]/" , $getNội dung , $phù hợp )) {
             $match = nổ tung ( 'x' , $phù hợp [3]);
             $chiều rộng = $match [0];
             $chiều cao = $match [1];
         }
 
         trở lại [
             'khoảng thời gian' => lựa chọn ( $thời gian ),
             'chiều rộng' => lựa chọn ( $chiều rộng ),
             'chiều cao' => lựa chọn ( $chiều cao ),
         ];
     }
}

Sử dụng ví dụ đơn giản

Ở đây lưu ý rằng nếu ffmpeg không thể được thực thi thì địa chỉ cài đặt của ffmpeg cần phải được chuyển khi khởi tạo. Ví dụ: địa chỉ cài đặt của ffmpeg trong Linux là /usr/local/ffmepg, sau đó là /usr/local/ffmpeg/bin/ffmpeg. cần phải được thông qua trong quá trình khởi tạo.

1: Thêm văn bản vào video

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ffmpeg = mới VideoFfmpeg();
$ffmpeg ->titleNước(
     'XXX' , //video gốc
     'XXX' , // Lưu video sau khi xử lý
     'XXX' , //tính cách
     [
         'x' => 30, // khoảng cách ngang
         'Và' => 30, // khoảng cách dọc
         'fontsize' => 20, // Kích thước văn bản
         'màu chữ' => 'màu đỏ' , // Màu văn bản
         'vong linh' => 2, // bóng văn bản
     ],
     200, // Di chuyển các bước mỗi giây
     2 // Thời gian xuất hiện văn bản (giây)
);

2: Tắt tiếng video

?
1
2
3
4
5
$ffmpeg = mới VideoFfmpeg();
$ffmpeg ->tắt tiếng(
     'XXX' , //video gốc
     'XXX' , // Lưu video sau khi xử lý
);

3: Cắt video

?
1
2
3
4
5
6
7
$ffmpeg = mới VideoFfmpeg();
$ffmpeg ->clipVideo(
     'XXX' , //video gốc
     'XXX' , // Lưu video sau khi xử lý
     0, // Thời gian bắt đầu cắt
     10 // Thời lượng cắt
);

4: Ghép video

?
1
2
3
4
5
$ffmpeg = mới VideoFfmpeg();
$ffmpeg ->gộpVideo(
     [ 'XXX' , 'XXX' ], //Các video cần ghép
     'XXX' , // Lưu video sau khi xử lý
);

5: Ghép âm thanh vào video

?
1
2
3
4
5
6
7
$ffmpeg = mới VideoFfmpeg();
$ffmpeg ->hợp nhấtVideoÂm thanh(
     'XXX' , //băng hình
     'XXX' , //Âm thanh
     'XXX' , // Lưu video sau khi xử lý
     0 // Thời gian trễ của video chèn âm thanh (giây)
);

6: Lấy thông tin video (dài, rộng, thời lượng)

?
1
2
3
4
$ffmpeg = mới VideoFfmpeg();
$ffmpeg ->lấyThuộc tính(
     'XXX' , //băng hình
);

Đến đây là kết thúc bài viết này về cách thực hành xử lý video ffmpeg trong PHP. Để biết thêm nội dung liên quan đến video xử lý ffmpeg của PHP, vui lòng tìm kiếm các bài viết trước của tôi hoặc tiếp tục duyệt các bài viết có liên quan bên dưới. Tôi hy vọng bạn sẽ ủng hộ tôi trong tương lai! .

Liên kết gốc: https://segmentfault.com/a/1190000041122598.

Cuối cùng, bài viết này về cách triển khai ffmpeg để xử lý video trong PHP kết thúc tại đây. Nếu bạn muốn biết thêm về cách triển khai ffmpeg để xử lý video trong PHP, vui lòng tìm kiếm các bài viết về CFSDN hoặc tiếp tục duyệt qua các bài viết liên quan. bạn sẽ ủng hộ tôi trong tương lai blog của tôi! .

24 4 0
qq735679552
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress