胡斌

unfinished

... ... @@ -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", audiofile, 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);
... ...