胡斌

need be improved

@@ -184,14 +184,14 @@ void merge_video_silence(fileinfo video, const char * aacfile, const char * dest @@ -184,14 +184,14 @@ void merge_video_silence(fileinfo video, const char * aacfile, const char * dest
184 run_shell_cmd(buf); 184 run_shell_cmd(buf);
185 } 185 }
186 186
187 -void megre_audio_video(fileinfo audio, int nf, fileinfo video, const char * destfile) 187 +void merge_audio_video(fileinfo audio, int nf, fileinfo video, const char * destfile)
188 { 188 {
189 char buf[2048]; 189 char buf[2048];
190 sprintf(buf, "ffmpeg -y -i %d_%s -i %s %s %s %s", nf, audio.name.c_str(), video.name.c_str(), acodec_param, vcodec_param, destfile); 190 sprintf(buf, "ffmpeg -y -i %d_%s -i %s %s %s %s", nf, audio.name.c_str(), video.name.c_str(), acodec_param, vcodec_param, destfile);
191 run_shell_cmd(buf); 191 run_shell_cmd(buf);
192 } 192 }
193 193
194 -void megre_audio_video(const char * audio, const char * video, const char * destfile) 194 +void merge_audio_video(const char * audio, const char * video, const char * destfile)
195 { 195 {
196 char buf[2048]; 196 char buf[2048];
197 sprintf(buf, "ffmpeg -y -i %s -i %s %s %s %s", audio, video, acodec_param, vcodec_param, destfile); 197 sprintf(buf, "ffmpeg -y -i %s -i %s %s %s %s", audio, video, acodec_param, vcodec_param, destfile);
@@ -422,6 +422,8 @@ int process_files(const char * output_dest_file) @@ -422,6 +422,8 @@ int process_files(const char * output_dest_file)
422 422
423 check_audio_duration(); 423 check_audio_duration();
424 get_duration_from_video_file(); 424 get_duration_from_video_file();
  425 + //don't split video, for a video, using merged audios to mix with it
  426 + //for audio, mix with video or jpg
425 427
426 if (filesvideo.size()) {//has video files 428 if (filesvideo.size()) {//has video files
427 if (filesaudio.size()){ 429 if (filesaudio.size()){
@@ -446,16 +448,136 @@ int process_files(const char * output_dest_file) @@ -446,16 +448,136 @@ int process_files(const char * output_dest_file)
446 for (; nv < filesvideo.size(); nv++) { 448 for (; nv < filesvideo.size(); nv++) {
447 fileinfo video = filesvideo[nv]; 449 fileinfo video = filesvideo[nv];
448 450
449 - if (video.start_time - audio_start > 0.1) {//video is behand audio too much 451 + if (video.start_time < audio_start - 0.1)
  452 + {//video is much more ahead of audio,try padding silence first
  453 + if (video.end_time < audio_start + 0.1) {
  454 + sprintf(destfile, "%d_silence.aac", nf);
  455 + split_audio(silence_aac_file, 0, video.end_time - video.start_time, destfile);
  456 + tmp_files.push_back(destfile);
  457 + sprintf(destfile, "%d.ts", nf);
  458 + merge_audio_video(destfile, video.name.c_str(), destfile);
  459 + merged_files.push_back(destfile);
  460 + nf++;
  461 + continue; //for next video
  462 + }
  463 + else {
  464 + // combine a audio file for the video
  465 + double silence_audio_start = audio.end_time;//maybe need append silence
  466 + double silence_audio_end = video.end_time;
  467 +
  468 + bool need_append_silence = true;
  469 + bool to_next_video = false;
  470 +
  471 + vector<std::string > merge_audio_files;
  472 + sprintf(destfile, "%d_0_silence.aac", nf);//a duration of silence
  473 + split_audio(silence_aac_file, 0, audio_start - video.start_time, destfile);
  474 + merge_audio_files.push_back(destfile);
  475 + tmp_files.push_back(destfile);
  476 +
  477 + if (audio.end_time < video.end_time + 0.1 && audio.end_time > video.end_time - 0.1) {
  478 + merge_audio_files.push_back(audio.name); //whole audio file,just fit
  479 + audio_start = audio.end_time + 0.1;
  480 + need_append_silence = false;
  481 + }
  482 + else if (audio.end_time > video.end_time){ //split part of audio file
  483 + sprintf(destfile, "%d_%s", nf, audio.name.c_str());
  484 + merge_audio_files.push_back(destfile);
  485 + tmp_files.push_back(destfile);
  486 + split_audio(audio.name.c_str(), audio_start, video.end_time - audio_start, destfile);
  487 + audio_start = video.end_time;
  488 + need_append_silence = false;
  489 + }
  490 + else {
  491 + merge_audio_files.push_back(audio.name);
  492 +
  493 + for (; i + 1 < filesaudio.size(); i++){//since video is not finished,try find next audio
  494 + audio = filesaudio[i + 1];
  495 + if (audio.start_time < video.end_time) {//next audio should split to fit the video
  496 + silence_audio_end = audio.start_time;
  497 +
  498 + sprintf(destfile, "%d_%d_silence.aac", nf, i);
  499 + split_audio(silence_aac_file, 0, silence_audio_end - silence_audio_start, destfile);
  500 + merge_audio_files.push_back(destfile);
  501 + tmp_files.push_back(destfile);
  502 +
  503 + if (audio.end_time > video.end_time - 0.1 && audio.end_time < video.end_time + 0.1) {//just match
  504 + merge_audio_files.push_back(audio.name);
  505 + need_append_silence = false;
  506 + audio_start = audio.end_time + 0.1;
  507 + i++;//this audio is used
  508 + break;
  509 + }
  510 + if (audio.end_time > video.end_time){
  511 + sprintf(destfile, "%d_%s", nf, audio.name.c_str());
  512 + merge_audio_files.push_back(destfile);
  513 + tmp_files.push_back(destfile);
  514 + split_audio(audio.name.c_str(), 0, video.end_time - audio.start_time, destfile);
  515 + need_append_silence = false;
  516 + //adjust timecode for the audio is part left
  517 + float cur_audio_start = video.end_time - audio.start_time;
  518 +
  519 + audio_start = audio.start_time;
  520 +
  521 + for (int j = i + 1; j < filesaudio.size(); j++){
  522 + filesaudio[j].start_time -= audio_start;
  523 + filesaudio[j].end_time -= audio_start;
  524 + }
  525 +
  526 + for (int j = nv; j < filesvideo.size(); j++) {
  527 + filesvideo[j].start_time -= audio_start;
  528 + filesvideo[j].end_time -= audio_start;
  529 + }
  530 + i++;
  531 + audio = filesaudio[i];
  532 + audio_start = cur_audio_start;
  533 +
  534 + to_next_video = true;
  535 +
  536 + break;
  537 + }
  538 + merge_audio_files.push_back(audio.name);//whole audio should be appended
  539 + silence_audio_start = audio.end_time; //adjust the silence start
  540 + }
  541 + else {
  542 + break;//no need for next audio
  543 + }
  544 + }//end audio find for the video
  545 + }//end else
  546 +
  547 + if (need_append_silence) {
  548 + sprintf(destfile, "%d_silence.aac", nf);
  549 + split_audio(silence_aac_file, 0, silence_audio_end - silence_audio_start, destfile);
  550 + merge_audio_files.push_back(destfile);
  551 + tmp_files.push_back(destfile);
  552 + }
  553 +
  554 + sprintf(audio_file, "%d_merged.aac", nf);
  555 + merge_audio_file(merge_audio_files, audio_file);
  556 +
  557 +
  558 + sprintf(destfile, "%d.ts", nf);
  559 + merge_audio_video(audio_file, video.name.c_str(), destfile);
  560 + merged_files.push_back(destfile);
  561 + nf++;
  562 +
  563 + if (!to_next_video){
  564 + nv++;//this video is processed
  565 + break;
  566 + }
  567 + }//end need combine
  568 + }//end video is ahead of audio
  569 + //-----VS-----
  570 + //AS----------
  571 + if (video.start_time - audio_start > 0.1) {//video is behind audio too much
450 sprintf(audio_file, "%d_%s", nf, audio.name.c_str()); 572 sprintf(audio_file, "%d_%s", nf, audio.name.c_str());
451 if (video.start_time < audio.end_time - 0.1){ 573 if (video.start_time < audio.end_time - 0.1){
452 split_audio(audio.name.c_str(), audio_start, video.start_time - audio_start, audio_file); 574 split_audio(audio.name.c_str(), audio_start, video.start_time - audio_start, audio_file);
453 audio_start = video.start_time; 575 audio_start = video.start_time;
454 - tmp_files.push_back(audio_file);  
455 } 576 }
456 else { 577 else {
457 - strcpy(audio_file, audio.name.c_str()); 578 + split_audio(audio.name.c_str(), audio_start, audio.end_time - audio_start, audio_file);
458 } 579 }
  580 + tmp_files.push_back(audio_file);
459 581
460 sprintf(pic_file, "%s.jpg", video.name.c_str()); 582 sprintf(pic_file, "%s.jpg", video.name.c_str());
461 get_video_first_frame_jpeg(video, pic_file); 583 get_video_first_frame_jpeg(video, pic_file);
@@ -466,11 +588,14 @@ int process_files(const char * output_dest_file) @@ -466,11 +588,14 @@ int process_files(const char * output_dest_file)
466 merged_files.push_back(destfile); 588 merged_files.push_back(destfile);
467 nf++; 589 nf++;
468 590
469 - if (video.start_time > audio.end_time){//all audio file no video, to next audio 591 + if (video.start_time >= audio.end_time - 0.1){//all audio file no video, to next audio
470 audio_start = audio.end_time + 0.1;//no audio left 592 audio_start = audio.end_time + 0.1;//no audio left
471 break; 593 break;
472 } 594 }
473 } 595 }
  596 + //----AS--------
  597 + //----VS--------
  598 + else if (audio_start - video.start_time < 0.1){
474 599
475 if (audio.end_time > video.end_time){ //this video finish, to next video 600 if (audio.end_time > video.end_time){ //this video finish, to next video
476 sprintf(destfile, "%d_%s", nf, audio.name.c_str()); 601 sprintf(destfile, "%d_%s", nf, audio.name.c_str());
@@ -479,7 +604,7 @@ int process_files(const char * output_dest_file) @@ -479,7 +604,7 @@ int process_files(const char * output_dest_file)
479 604
480 audio_start = video.end_time; 605 audio_start = video.end_time;
481 sprintf(destfile, "%d.ts", nf); 606 sprintf(destfile, "%d.ts", nf);
482 - megre_audio_video(audio, nf, video, destfile); 607 + merge_audio_video(audio, nf, video, destfile);
483 merged_files.push_back(destfile); 608 merged_files.push_back(destfile);
484 nf++; 609 nf++;
485 } 610 }
@@ -489,7 +614,7 @@ int process_files(const char * output_dest_file) @@ -489,7 +614,7 @@ int process_files(const char * output_dest_file)
489 tmp_files.push_back(destfile); 614 tmp_files.push_back(destfile);
490 615
491 sprintf(destfile, "%d.ts", nf); 616 sprintf(destfile, "%d.ts", nf);
492 - megre_audio_video(audio, nf, video, destfile); 617 + merge_audio_video(audio, nf, video, destfile);
493 merged_files.push_back(destfile); 618 merged_files.push_back(destfile);
494 audio_start = audio.end_time + 0.1;//no audio left 619 audio_start = audio.end_time + 0.1;//no audio left
495 nf++; 620 nf++;
@@ -503,10 +628,12 @@ int process_files(const char * output_dest_file) @@ -503,10 +628,12 @@ int process_files(const char * output_dest_file)
503 merge_audio_files.push_back(destfile); 628 merge_audio_files.push_back(destfile);
504 tmp_files.push_back(destfile); 629 tmp_files.push_back(destfile);
505 630
  631 + audio_start = audio.end_time + 0.1;
  632 +
506 double silence_audio_start = audio.end_time; 633 double silence_audio_start = audio.end_time;
507 double silence_audio_end = video.end_time; 634 double silence_audio_end = video.end_time;
508 635
509 - bool need_slilence = true; 636 + bool need_silence = true;
510 bool to_next_video = false; 637 bool to_next_video = false;
511 for (; i + 1 < filesaudio.size(); i++){//since video is not finished,try find next audio 638 for (; i + 1 < filesaudio.size(); i++){//since video is not finished,try find next audio
512 audio = filesaudio[i + 1]; 639 audio = filesaudio[i + 1];
@@ -520,7 +647,8 @@ int process_files(const char * output_dest_file) @@ -520,7 +647,8 @@ int process_files(const char * output_dest_file)
520 647
521 if (audio.end_time > video.end_time - 0.1 && audio.end_time < video.end_time + 0.1) {//just match 648 if (audio.end_time > video.end_time - 0.1 && audio.end_time < video.end_time + 0.1) {//just match
522 merge_audio_files.push_back(audio.name); 649 merge_audio_files.push_back(audio.name);
523 - need_slilence = false; 650 + need_silence = false;
  651 + audio_start = audio.end_time + 0.1;
524 i++; 652 i++;
525 break; 653 break;
526 } 654 }
@@ -529,7 +657,7 @@ int process_files(const char * output_dest_file) @@ -529,7 +657,7 @@ int process_files(const char * output_dest_file)
529 merge_audio_files.push_back(destfile); 657 merge_audio_files.push_back(destfile);
530 tmp_files.push_back(destfile); 658 tmp_files.push_back(destfile);
531 split_audio(audio.name.c_str(), 0, video.end_time - audio.start_time, destfile); 659 split_audio(audio.name.c_str(), 0, video.end_time - audio.start_time, destfile);
532 - need_slilence = false; 660 + need_silence = false;
533 //adjust timecode for the audio is part left 661 //adjust timecode for the audio is part left
534 float cur_audio_start = video.end_time - audio.start_time; 662 float cur_audio_start = video.end_time - audio.start_time;
535 663
@@ -554,13 +682,14 @@ int process_files(const char * output_dest_file) @@ -554,13 +682,14 @@ int process_files(const char * output_dest_file)
554 } 682 }
555 merge_audio_files.push_back(audio.name);//whole audio should be appended 683 merge_audio_files.push_back(audio.name);//whole audio should be appended
556 silence_audio_start = audio.end_time; //adjust the silence start 684 silence_audio_start = audio.end_time; //adjust the silence start
  685 + audio_start = audio.end_time + 0.1;
557 } 686 }
558 else { 687 else {
559 break;//no need for next audio 688 break;//no need for next audio
560 } 689 }
561 } 690 }
562 691
563 - if (need_slilence) { 692 + if (need_silence) {
564 sprintf(destfile, "%d_silence.aac", nf); 693 sprintf(destfile, "%d_silence.aac", nf);
565 split_audio(silence_aac_file, 0, silence_audio_end - silence_audio_start, destfile); 694 split_audio(silence_aac_file, 0, silence_audio_end - silence_audio_start, destfile);
566 merge_audio_files.push_back(destfile); 695 merge_audio_files.push_back(destfile);
@@ -572,7 +701,7 @@ int process_files(const char * output_dest_file) @@ -572,7 +701,7 @@ int process_files(const char * output_dest_file)
572 701
573 702
574 sprintf(destfile, "%d.ts", nf); 703 sprintf(destfile, "%d.ts", nf);
575 - megre_audio_video(audio_file, video.name.c_str(), destfile); 704 + merge_audio_video(audio_file, video.name.c_str(), destfile);
576 merged_files.push_back(destfile); 705 merged_files.push_back(destfile);
577 nf++; 706 nf++;
578 707
@@ -582,16 +711,24 @@ int process_files(const char * output_dest_file) @@ -582,16 +711,24 @@ int process_files(const char * output_dest_file)
582 } 711 }
583 } 712 }
584 } 713 }
  714 + }
585 715
586 if (audio_start < audio.end_time){ 716 if (audio_start < audio.end_time){
587 -  
588 sprintf(destfile, "%d_%s", nf, audio.name.c_str()); 717 sprintf(destfile, "%d_%s", nf, audio.name.c_str());
589 -  
590 split_audio(audio.name.c_str(), audio_start, audio.end_time - audio_start, destfile); 718 split_audio(audio.name.c_str(), audio_start, audio.end_time - audio_start, destfile);
591 tmp_files.push_back(destfile); 719 tmp_files.push_back(destfile);
592 720
593 sprintf(destfile, "%d.ts", nf); 721 sprintf(destfile, "%d.ts", nf);
594 - merge_audio_pic(audio, nf, blank_pic_file, destfile); 722 + if (nv < filesvideo.size()) {
  723 + fileinfo video = filesvideo[nv];
  724 + sprintf(pic_file, "%s.jpg", video.name.c_str());
  725 + get_video_first_frame_jpeg(video, pic_file);
  726 + tmp_files.push_back(pic_file);
  727 + }
  728 + else {
  729 + strcpy(pic_file, blank_pic_file);
  730 + }
  731 + merge_audio_pic(audio, nf, pic_file, destfile);
595 merged_files.push_back(destfile); 732 merged_files.push_back(destfile);
596 nf++; 733 nf++;
597 } 734 }