Toggle navigation
Toggle navigation
此项目
正在载入...
Sign in
胡斌
/
merge_av
转到一个项目
Toggle navigation
项目
群组
代码片段
帮助
Toggle navigation pinning
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
胡斌
2017-12-28 23:22:20 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
ceaa6cade4e35f3fc30482a8cdcb5e0eefd3affa
ceaa6cad
1 parent
bc9a51a5
unfinished
显示空白字符变更
内嵌
并排对比
正在显示
1 个修改的文件
包含
106 行增加
和
10 行删除
merge_av/merge_av.cpp
merge_av/merge_av.cpp
查看文件 @
ceaa6ca
...
...
@@ -132,10 +132,10 @@ void split(string str, string separator, vector<string> &result, bool includeEmp
result
.
push_back
(
str
.
substr
(
lastPosition
,
string
::
npos
));
}
void
split_audio
(
fileinfo
audio
,
float
audio_start
,
float
duration
,
char
*
destfile
)
void
split_audio
(
const
char
*
audiofile
,
float
audio_start
,
float
duration
,
char
*
destfile
)
{
char
buf
[
2048
];
sprintf
(
buf
,
"ffmpeg -y -i %s -ss %.3f -t %.3f %s %s"
,
audio
.
name
.
c_str
()
,
audio_start
,
duration
,
acodec_param
,
destfile
);
sprintf
(
buf
,
"ffmpeg -y -i %s -ss %.3f -t %.3f %s %s"
,
audio
file
,
audio_start
,
duration
,
acodec_param
,
destfile
);
run_shell_cmd
(
buf
);
}
...
...
@@ -181,6 +181,13 @@ void megre_audio_video(fileinfo audio, int nf, fileinfo video, const char * dest
run_shell_cmd
(
buf
);
}
void
megre_audio_video
(
const
char
*
audio
,
const
char
*
video
,
const
char
*
destfile
)
{
char
buf
[
2048
];
sprintf
(
buf
,
"ffmpeg -y -i %s -i %s %s %s %s"
,
audio
,
video
,
acodec_param
,
vcodec_param
,
destfile
);
run_shell_cmd
(
buf
);
}
void
concate_files
(
vector
<
string
>
merged_files
,
const
char
*
destfile
)
{
char
buf
[
2048
];
...
...
@@ -359,6 +366,32 @@ void check_audio_duration()
only_print
=
tmp
;
}
int
merge_audio_file
(
vector
<
string
>
&
files
,
const
char
*
dest
)
{
char
buf
[
2048
],
tsfile
[
1024
];
vector
<
string
>
tsfiles
;
for
(
int
i
=
0
;
i
<
files
.
size
();
i
++
){
strcpy
(
tsfile
,
files
[
i
].
c_str
());
strcat
(
tsfile
,
".ts"
);
tsfiles
.
push_back
(
tsfile
);
sprintf
(
buf
,
"ffmpeg -y -i %s -acodec copy -vn %s"
,
files
[
i
].
c_str
(),
tsfile
);
run_shell_cmd
(
buf
);
}
sprintf
(
tsfile
,
"m_%s.ts"
,
dest
);
concate_files
(
tsfiles
,
tsfile
);
adjust_dest_timecode
(
tsfile
,
dest
);
if
(
!
keep_tmp_files
){
tsfiles
.
push_back
(
tsfile
);
removefiles
(
tsfiles
);
}
return
0
;
}
int
process_files
(
const
char
*
output_dest_file
)
{
vector
<
fileinfo
>
&
filesaudio
=
media_files
[
type_audio
];
...
...
@@ -367,7 +400,7 @@ int process_files(const char * output_dest_file)
vector
<
string
>
tmp_files
;
int
nv
=
0
;
int
nf
=
0
;
char
destfile
[
1024
];
char
destfile
[
1024
]
,
audio_file
[
1024
]
;
char
blank_pic_file
[
1024
];
char
silence_aac_file
[
1024
];
...
...
@@ -406,15 +439,14 @@ int process_files(const char * output_dest_file)
if
(
video
.
start_time
-
audio_start
>
0.100
)
{
sprintf
(
destfile
,
"%d_%s"
,
nf
,
audio
.
name
.
c_str
());
if
(
video
.
start_time
>
audio
.
end_time
){
split_audio
(
audio
,
audio_start
,
audio
.
end_time
-
audio_start
,
destfile
);
split_audio
(
audio
.
name
.
c_str
()
,
audio_start
,
audio
.
end_time
-
audio_start
,
destfile
);
}
else
{
split_audio
(
audio
,
audio_start
,
video
.
start_time
-
audio_start
,
destfile
);
split_audio
(
audio
.
name
.
c_str
()
,
audio_start
,
video
.
start_time
-
audio_start
,
destfile
);
audio_start
=
video
.
start_time
;
}
tmp_files
.
push_back
(
destfile
);
sprintf
(
destfile
,
"%s.jpg"
,
video
.
name
.
c_str
());
get_video_first_frame_jpeg
(
video
,
destfile
);
tmp_files
.
push_back
(
destfile
);
...
...
@@ -429,8 +461,9 @@ int process_files(const char * output_dest_file)
}
}
if
(
nv
!=
filesvideo
.
size
()
-
1
)
{
// not the last one
if
(
audio
.
end_time
>
video
.
end_time
){
sprintf
(
destfile
,
"%d_%s"
,
nf
,
audio
.
name
.
c_str
());
split_audio
(
audio
,
video
.
start_time
,
video
.
end_time
-
video
.
start_time
,
destfile
);
split_audio
(
audio
.
name
.
c_str
()
,
video
.
start_time
,
video
.
end_time
-
video
.
start_time
,
destfile
);
tmp_files
.
push_back
(
destfile
);
audio_start
=
video
.
end_time
;
...
...
@@ -439,12 +472,75 @@ int process_files(const char * output_dest_file)
merged_files
.
push_back
(
destfile
);
nf
++
;
}
else
if
(
video
.
end_time
-
audio
.
end_time
<
0.1
){
sprintf
(
destfile
,
"%d_%s"
,
nf
,
audio
.
name
.
c_str
());
split_audio
(
audio
.
name
.
c_str
(),
video
.
start_time
,
audio
.
end_time
-
video
.
start_time
,
destfile
);
tmp_files
.
push_back
(
destfile
);
sprintf
(
destfile
,
"%d.ts"
,
nf
);
megre_audio_video
(
audio
,
nf
,
video
,
destfile
);
merged_files
.
push_back
(
destfile
);
nf
++
;
break
;
}
else
{
sprintf
(
destfile
,
"%d_%s"
,
nf
,
audio
.
name
.
c_str
());
split_audio
(
audio
.
name
.
c_str
(),
video
.
start_time
,
audio
.
end_time
-
video
.
start_time
,
destfile
);
vector
<
std
::
string
>
merge_audio_files
;
merge_audio_files
.
push_back
(
destfile
);
tmp_files
.
push_back
(
destfile
);
double
silence_audio_start
=
audio
.
end_time
;
double
silence_audio_end
=
video
.
end_time
;
for
(;
i
+
1
<
filesaudio
.
size
();
i
++
){
audio
=
filesaudio
[
i
+
1
];
if
(
audio
.
start_time
<
video
.
end_time
)
{
silence_audio_end
=
audio
.
start_time
;
sprintf
(
destfile
,
"%d_%d_silence.aac"
,
nf
,
i
);
split_audio
(
silence_aac_file
,
0
,
silence_audio_end
-
audio
.
end_time
,
destfile
);
merge_audio_files
.
push_back
(
destfile
);
tmp_files
.
push_back
(
destfile
);
if
(
audio
.
end_time
>
video
.
end_time
-
0.1
&&
audio
.
end_time
<
video
.
end_time
+
0.1
)
{
merge_audio_files
.
push_back
(
audio
.
name
);
i
++
;
break
;
}
if
(
audio
.
end_time
>
video
.
end_time
){
sprintf
(
destfile
,
"%d_%s"
,
nf
,
audio
.
name
.
c_str
());
merge_audio_files
.
push_back
(
destfile
);
tmp_files
.
push_back
(
destfile
);
split_audio
(
audio
.
name
.
c_str
(),
0
,
video
.
end_time
-
audio
.
start_time
,
destfile
);
break
;
}
merge_audio_files
.
push_back
(
audio
.
name
);
}
else
{
break
;
}
}
sprintf
(
audio_file
,
"%d_merged.aac"
,
nf
);
merge_audio_file
(
merge_audio_files
,
audio_file
);
sprintf
(
destfile
,
"%d.ts"
,
nf
);
megre_audio_video
(
audio_file
,
video
.
name
.
c_str
(),
destfile
);
merged_files
.
push_back
(
destfile
);
nf
++
;
break
;
}
}
else
{
sprintf
(
destfile
,
"%d_%s"
,
nf
,
audio
.
name
.
c_str
());
if
(
audio
.
end_time
-
video
.
end_time
<
1.0
)
{
split_audio
(
audio
,
video
.
start_time
,
audio
.
end_time
-
video
.
start_time
,
destfile
);
split_audio
(
audio
.
name
.
c_str
()
,
video
.
start_time
,
audio
.
end_time
-
video
.
start_time
,
destfile
);
tmp_files
.
push_back
(
destfile
);
audio_start
=
video
.
end_time
;
...
...
@@ -455,7 +551,7 @@ int process_files(const char * output_dest_file)
nf
++
;
}
else
{
split_audio
(
audio
,
video
.
start_time
,
video
.
end_time
-
video
.
start_time
,
destfile
);
split_audio
(
audio
.
name
.
c_str
()
,
video
.
start_time
,
video
.
end_time
-
video
.
start_time
,
destfile
);
tmp_files
.
push_back
(
destfile
);
audio_start
=
video
.
end_time
;
...
...
@@ -466,7 +562,7 @@ int process_files(const char * output_dest_file)
nf
++
;
sprintf
(
destfile
,
"%d_%s"
,
nf
,
audio
.
name
.
c_str
());
split_audio
(
audio
,
video
.
end_time
,
audio
.
end_time
-
video
.
end_time
,
destfile
);
split_audio
(
audio
.
name
.
c_str
()
,
video
.
end_time
,
audio
.
end_time
-
video
.
end_time
,
destfile
);
tmp_files
.
push_back
(
destfile
);
sprintf
(
destfile
,
"%d.ts"
,
nf
);
...
...
请
注册
或
登录
后发表评论