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-30 07:49:57 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
dfc70fc0e814d73abb61c19f85872abc692b5554
dfc70fc0
1 parent
b1638b9c
part of sort
隐藏空白字符变更
内嵌
并排对比
正在显示
1 个修改的文件
包含
98 行增加
和
50 行删除
merge_av/merge_av.cpp
merge_av/merge_av.cpp
查看文件 @
dfc70fc
...
...
@@ -5,26 +5,50 @@
#include <fstream>
#include <vector>
#include <string.h>
#include <list>
bool
only_print
=
false
;
bool
keep_tmp_files
=
false
;
using
namespace
std
;
enum
media_type
{
mt_audio
=
0
,
mt_video
=
1
,
};
enum
timestamp_type
{
tt_start
=
0
,
tt_end
=
1
;
};
class
fileinfo
{
public
:
float
start_time
;
float
end_time
;
string
start_time_str
;
string
end_time_str
;
string
name
;
int
index
;
media_type
m_type
;
};
enum
media_type
{
type_audio
=
0
,
type_video
=
1
,
class
media_info
{
public
:
float
type_time
;
//the time for start or end according to the m_type
float
start_time
;
float
end_time
;
string
name
;
float
duration
;
float
cur_start
;
float
cur_end
;
int
index
;
media_type
m_type
;
timestamp_type
t_type
;
};
vector
<
fileinfo
>
media_files
[
2
];
vector
<
fileinfo
>
media_files
;
void
run_shell_cmd
(
const
char
*
cmd
)
{
...
...
@@ -82,14 +106,13 @@ bool first_time_set = false;
float
start_time
=
0.0
f
;
void
addinfo
(
string
t
,
string
name
,
bool
bstart
){
media_type
mtype
=
name
.
substr
(
name
.
length
()
-
4
,
name
.
length
())
==
".aac"
?
type_audio
:
type
_video
;
media_type
mtype
=
name
.
substr
(
name
.
length
()
-
4
,
name
.
length
())
==
".aac"
?
mt_audio
:
mt
_video
;
if
(
bstart
)
{
fileinfo
f
;
f
.
start_time
=
atof
(
t
.
c_str
());
f
.
end_time
=
f
.
start_time
;
f
.
start_time_str
=
t
;
f
.
end_time_str
=
t
;
f
.
name
=
name
;
f
.
m_type
=
mtype
;
if
(
!
first_time_set
)
{
first_time_set
=
true
;
...
...
@@ -98,23 +121,21 @@ void addinfo(string t, string name, bool bstart){
f
.
start_time
-=
start_time
;
media_files
[
mtype
]
.
push_back
(
f
);
media_files
.
push_back
(
f
);
}
else
{
vector
<
fileinfo
>
&
files
=
media_files
[
mtype
];
int
i
;
for
(
i
=
0
;
i
<
files
.
size
();
i
++
)
{
if
(
files
[
i
].
name
==
name
)
{
files
[
i
].
end_time
=
atof
(
t
.
c_str
());
files
[
i
].
end_time_str
=
t
;
files
[
i
].
end_time
-=
start_time
;
for
(
i
=
0
;
i
<
media_files
.
size
();
i
++
)
{
if
(
media_files
[
i
].
name
==
name
)
{
media_files
[
i
].
end_time
=
atof
(
t
.
c_str
());
media_files
[
i
].
end_time
-=
start_time
;
break
;
}
}
if
(
i
==
files
.
size
())
if
(
i
==
media_
files
.
size
())
{
cout
<<
"
\n
error ,file : "
<<
name
<<
" close but not started!"
;
printf
(
"
\n
error ,file : %s close but not started!"
,
name
.
c_str
())
;
}
}
}
...
...
@@ -336,18 +357,16 @@ float get_file_duration(const char *mediafile, bool bVideo)
void
get_duration_from_video_file
()
{
vector
<
fileinfo
>
&
filesvideo
=
media_files
[
type_video
];
vector
<
string
>
tmp_files
;
bool
tmp
=
only_print
;
only_print
=
false
;
for
(
int
i
=
0
;
i
<
filesvideo
.
size
();
i
++
){
float
duration
=
get_file_duration
(
filesvideo
[
i
].
name
.
c_str
(),
true
);
if
(
duration
>=
0.10
)
{
printf
(
"file:%s , duration in recording file: %.3f, duration parsed from file: %.3f
\n
"
,
filesvideo
[
i
].
name
.
c_str
(),
filesvideo
[
i
].
end_time
-
filesvideo
[
i
].
start_time
,
duration
);
filesvideo
[
i
].
end_time
=
filesvideo
[
i
].
start_time
+
duration
;
for
(
int
i
=
0
;
i
<
media_files
.
size
();
i
++
){
if
(
media_files
[
i
].
m_type
==
mt_video
)
{
float
duration
=
get_file_duration
(
media_files
[
i
].
name
.
c_str
(),
true
);
if
(
duration
>=
0.1
)
{
printf
(
"file:%s , duration in recording file: %.3f, duration parsed from file: %.3f
\n
"
,
media_files
[
i
].
name
.
c_str
(),
media_files
[
i
].
end_time
-
media_files
[
i
].
start_time
,
duration
);
media_files
[
i
].
end_time
=
media_files
[
i
].
start_time
+
duration
;
}
}
}
...
...
@@ -357,19 +376,17 @@ void get_duration_from_video_file()
void
check_audio_duration
()
{
vector
<
fileinfo
>
&
filesaudio
=
media_files
[
type_audio
];
vector
<
string
>
tmp_files
;
bool
tmp
=
only_print
;
only_print
=
false
;
for
(
int
i
=
0
;
i
<
filesaudio
.
size
();
i
++
){
fileinfo
f
=
filesaudio
[
i
];
if
(
f
.
end_time
-
f
.
start_time
<
0.1
){
float
duration
=
get_file_duration
(
f
.
name
.
c_str
(),
false
);
filesaudio
[
i
].
end_time
=
f
.
start_time
+
duration
;
printf
(
"file:%s , duration in recording file maybe is not set, duration parsed from file: %.3f
\n
"
,
f
.
name
.
c_str
(),
duration
);
for
(
int
i
=
0
;
i
<
media_files
.
size
();
i
++
){
if
(
media_files
[
i
].
m_type
==
mt_audio
)
{
fileinfo
f
=
media_files
[
i
];
if
(
f
.
end_time
-
f
.
start_time
<
0.1
){
//avoid no close
float
duration
=
get_file_duration
(
f
.
name
.
c_str
(),
false
);
media_files
[
i
].
end_time
=
f
.
start_time
+
duration
;
printf
(
"file:%s , duration in recording file maybe is not set, duration parsed from file: %.3f
\n
"
,
f
.
name
.
c_str
(),
duration
);
}
}
}
...
...
@@ -404,22 +421,22 @@ int merge_audio_file(vector<string> & files, const char * dest)
class
MergeProcess
{
public
:
MergeProcess
(
vector
<
fileinfo
>
&
a
,
vector
<
fileinfo
>
&
v
);
MergeProcess
();
int
process_files
(
const
char
*
output_dest_file
);
protected
:
void
init
();
void
adjust_va_timestamp
();
void
merge_left_audio
();
int
process_video_ahead_of_audio
();
int
process_video_behind_audio
();
int
process_video_align_audio
();
int
process_video_loop
();
int
process_va
();
void
add_media_infos
();
void
init
();
void
adjust_va_timestamp
();
void
merge_left_audio
();
int
process_video_ahead_of_audio
();
int
process_video_behind_audio
();
int
process_video_align_audio
();
int
process_video_loop
();
int
process_va
();
protected
:
vector
<
fileinfo
>
&
filesaudio
;
vector
<
fileinfo
>
&
filesvideo
;
vector
<
media_info
>
media_infos
;
vector
<
string
>
merged_files
;
vector
<
string
>
tmp_files
;
int
nv
;
// the index of processing video file
...
...
@@ -431,13 +448,42 @@ protected:
int
audio_start
;
fileinfo
audio
;
fileinfo
video
;
private
:
void
add_media_info
(
media_info
m
)
{
throw
std
::
logic_error
(
"The method or operation is not implemented."
);
}
};
MergeProcess
::
MergeProcess
(
vector
<
fileinfo
>
&
a
,
vector
<
fileinfo
>
&
v
)
:
filesaudio
(
a
),
filesvideo
(
v
)
{
MergeProcess
::
MergeProcess
(){
init
();
}
void
MergeProcess
::
add_media_infos
()
{
for
(
int
i
=
0
;
i
<
media_files
.
size
();
i
++
)
{
fileinfo
f
=
media_files
[
i
];
media_info
m
;
m
.
index
=
i
;
m
.
name
=
f
.
name
;
m
.
start_time
=
f
.
start_time
;
m
.
end_time
=
f
.
end_time
;
m
.
m_type
=
f
.
m_type
;
m
.
t_type
=
tt_start
;
m
.
duration
=
f
.
end_time
-
f
.
start_time
;
m
.
cur_start
=
0
;
m
.
cur_end
=
m
.
duration
;
m
.
type_time
=
m
.
start_time
;
add_media_info
(
m
);
m
.
t_type
=
tt_end
;
m
.
type_time
=
m
.
end_time
;
add_media_info
(
m
);
}
}
void
MergeProcess
::
init
()
{
strcpy
(
blank_pic_file
,
cfg_path
);
...
...
@@ -448,6 +494,8 @@ void MergeProcess::init()
check_audio_duration
();
get_duration_from_video_file
();
add_media_infos
();
nv
=
0
;
nf
=
0
;
audio_index
=
0
;
...
...
请
注册
或
登录
后发表评论