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;
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
;
}
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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ô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'
;
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;
}
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;
}
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
);
nếu như
(
$mã_kết_quả
== 0) {
trở lại
ĐÚNG VẬY;
}
trở lại
SAI;
}
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
;
}
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];
}
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
),
];
}
}
Tôi là một lập trình viên xuất sắc, rất giỏi!