胡斌

part of sort

... ... @@ -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.0f;
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 << "\nerror ,file : " << name << " close but not started!";
printf("\nerror ,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){
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);
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);
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,10 +421,11 @@ 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 add_media_infos();
void init();
void adjust_va_timestamp();
void merge_left_audio();
... ... @@ -418,8 +436,7 @@ protected:
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;
... ...