胡斌

it is near to finish

@@ -6,6 +6,7 @@ @@ -6,6 +6,7 @@
6 #include <vector> 6 #include <vector>
7 #include <string.h> 7 #include <string.h>
8 #include <list> 8 #include <list>
  9 +#include <deque>
9 10
10 11
11 bool only_print = false; 12 bool only_print = false;
@@ -19,7 +20,7 @@ enum media_type{ @@ -19,7 +20,7 @@ enum media_type{
19 20
20 enum timestamp_type{ 21 enum timestamp_type{
21 tt_start = 0, 22 tt_start = 0,
22 - tt_end = 1; 23 + tt_end = 1,
23 }; 24 };
24 25
25 class fileinfo { 26 class fileinfo {
@@ -39,8 +40,6 @@ public: @@ -39,8 +40,6 @@ public:
39 string name; 40 string name;
40 41
41 float duration; 42 float duration;
42 - float cur_start;  
43 - float cur_end;  
44 int index; 43 int index;
45 media_type m_type; 44 media_type m_type;
46 timestamp_type t_type; 45 timestamp_type t_type;
@@ -163,10 +162,10 @@ void split_audio(const char * audiofile, float audio_start, float duration, char @@ -163,10 +162,10 @@ void split_audio(const char * audiofile, float audio_start, float duration, char
163 run_shell_cmd(buf); 162 run_shell_cmd(buf);
164 } 163 }
165 164
166 -void get_video_first_frame_jpeg(fileinfo video, char * destfile) 165 +void get_video_first_frame_jpeg(const char * video, const char * destfile)
167 { 166 {
168 char buf[2048]; 167 char buf[2048];
169 - sprintf(buf, "ffmpeg -y -i %s -vframes 1 -ss 0 -f mjpeg -an %s", video.name.c_str(), destfile); 168 + sprintf(buf, "ffmpeg -y -i %s -vframes 1 -ss 0 -f mjpeg -an %s", video, destfile);
170 run_shell_cmd(buf); 169 run_shell_cmd(buf);
171 } 170 }
172 171
@@ -425,17 +424,21 @@ public: @@ -425,17 +424,21 @@ public:
425 int process_files(const char * output_dest_file); 424 int process_files(const char * output_dest_file);
426 425
427 protected: 426 protected:
  427 + void add_media_info(media_info m);
428 void add_media_infos(); 428 void add_media_infos();
429 void init(); 429 void init();
430 - void adjust_va_timestamp();  
431 - void merge_left_audio();  
432 - int process_video_ahead_of_audio();  
433 - int process_video_behind_audio();  
434 - int process_video_align_audio();  
435 - int process_video_loop(); 430 + int merge_audio_video(vector<media_info> & files);
  431 + int merge_audio_pic(vector<media_info> & files);
  432 + int find_video_between_the_audio();
  433 + int find_video_end();
  434 + bool is_audio_start(int index);
  435 + int split_audio(int index_from, vector<media_info> & result);
  436 + void get_front_info(int index_to, vector<media_info> &cur_processing);
436 int process_va(); 437 int process_va();
437 438
438 protected: 439 protected:
  440 + list <media_info> sorted_media;
  441 + deque<media_info> sorted_infos;
439 vector<media_info> media_infos; 442 vector<media_info> media_infos;
440 vector<string > merged_files; 443 vector<string > merged_files;
441 vector<string> tmp_files; 444 vector<string> tmp_files;
@@ -448,20 +451,23 @@ protected: @@ -448,20 +451,23 @@ protected:
448 int audio_start; 451 int audio_start;
449 fileinfo audio; 452 fileinfo audio;
450 fileinfo video; 453 fileinfo video;
451 -private:  
452 -  
453 - void add_media_info(media_info m)  
454 - {  
455 - throw std::logic_error("The method or operation is not implemented.");  
456 - }  
457 -  
458 -  
459 }; 454 };
460 455
461 MergeProcess::MergeProcess(){ 456 MergeProcess::MergeProcess(){
462 init(); 457 init();
463 } 458 }
464 459
  460 +void MergeProcess::add_media_info(media_info m)
  461 +{
  462 + list<media_info>::iterator it = sorted_media.begin();
  463 + for (; it != sorted_media.end(); it++){
  464 + if (it->type_time > m.type_time){
  465 + break;
  466 + }
  467 + }
  468 + sorted_media.insert(it, m);
  469 +}
  470 +
465 void MergeProcess::add_media_infos() 471 void MergeProcess::add_media_infos()
466 { 472 {
467 for (int i = 0; i < media_files.size(); i++) { 473 for (int i = 0; i < media_files.size(); i++) {
@@ -474,14 +480,17 @@ void MergeProcess::add_media_infos() @@ -474,14 +480,17 @@ void MergeProcess::add_media_infos()
474 m.m_type = f.m_type; 480 m.m_type = f.m_type;
475 m.t_type = tt_start; 481 m.t_type = tt_start;
476 m.duration = f.end_time - f.start_time; 482 m.duration = f.end_time - f.start_time;
477 - m.cur_start = 0;  
478 - m.cur_end = m.duration;  
479 m.type_time = m.start_time; 483 m.type_time = m.start_time;
480 add_media_info(m); 484 add_media_info(m);
481 m.t_type = tt_end; 485 m.t_type = tt_end;
482 m.type_time = m.end_time; 486 m.type_time = m.end_time;
483 add_media_info(m); 487 add_media_info(m);
484 } 488 }
  489 +
  490 + list<media_info>::iterator it = sorted_media.begin();
  491 + for (; it != sorted_media.end(); it++){
  492 + sorted_infos.push_back(*it);
  493 + }
485 } 494 }
486 495
487 void MergeProcess::init() 496 void MergeProcess::init()
@@ -501,346 +510,206 @@ void MergeProcess::init() @@ -501,346 +510,206 @@ void MergeProcess::init()
501 audio_index = 0; 510 audio_index = 0;
502 } 511 }
503 512
504 -void MergeProcess::adjust_va_timestamp()  
505 -{  
506 - fileinfo audio = filesaudio[audio_index];  
507 - float audio_start = audio.start_time;  
508 513
509 - for (int j = audio_index; j < filesaudio.size(); j++){  
510 - filesaudio[j].start_time -= audio_start;  
511 - filesaudio[j].end_time -= audio_start;  
512 - } 514 +int MergeProcess::merge_audio_video(vector<media_info> & files)
  515 +{
  516 + vector<std::string > merge_audio_files;
  517 + int nsilence = 0;
513 518
514 - for (int j = nv; j < filesvideo.size(); j++) {  
515 - filesvideo[j].start_time -= audio_start;  
516 - filesvideo[j].end_time -= audio_start;  
517 - }  
518 -} 519 + media_info video = files[0];
  520 + float start_time = video.start_time;
519 521
  522 + for (int i = 1; i < files.size() - 1; i += 2){
  523 + media_info audio = files[i];
  524 + media_info audio_end = files[i + 1];
  525 + if (audio.type_time - start_time > 0.1){
  526 + sprintf(audio_file, "%d_%d_silence.aac", nf, nsilence++);//a duration of silence
  527 + ::split_audio(silence_aac_file, 0, audio.type_time - start_time, audio_file);
  528 + merge_audio_files.push_back(silence_aac_file);
  529 + tmp_files.push_back(silence_aac_file);
  530 + }
520 531
521 -void MergeProcess::merge_left_audio()  
522 -{  
523 - if (audio_start < audio.end_time){  
524 - sprintf(destfile, "%d_%s", nf, audio.name.c_str());  
525 - split_audio(audio.name.c_str(), audio_start, audio.end_time - audio_start, destfile);  
526 - tmp_files.push_back(destfile); 532 + if (audio.type_time - audio.start_time > 0.10 || audio_end.end_time - audio.type_time > 0.10) {
  533 + sprintf(audio_file, "%d_%s", nf, audio.name.c_str());
  534 + ::split_audio(audio.name.c_str(), audio.type_time - audio.start_time, audio_end.type_time - audio.start_time, audio_file);
  535 + tmp_files.push_back(audio_file);
527 536
528 - sprintf(destfile, "%d.ts", nf);  
529 - if (nv < filesvideo.size()) {  
530 - fileinfo video = filesvideo[nv];  
531 - sprintf(pic_file, "%s.jpg", video.name.c_str());  
532 - get_video_first_frame_jpeg(video, pic_file);  
533 - tmp_files.push_back(pic_file);  
534 } 537 }
535 - else {  
536 - strcpy(pic_file, blank_pic_file); 538 + else{
  539 + strcpy(audio_file, audio.name.c_str());
537 } 540 }
538 - merge_audio_pic(audio, nf, pic_file, destfile);  
539 - merged_files.push_back(destfile);  
540 - nf++;  
541 - }  
542 -}  
543 541
544 -int MergeProcess::process_video_ahead_of_audio()  
545 -{  
546 - if (video.end_time < audio_start + 0.1) {  
547 - sprintf(destfile, "%d_silence.aac", nf);  
548 - split_audio(silence_aac_file, 0, video.end_time - video.start_time, destfile);  
549 - tmp_files.push_back(destfile);  
550 - sprintf(destfile, "%d.ts", nf);  
551 - merge_audio_video(destfile, video.name.c_str(), destfile);  
552 - merged_files.push_back(destfile);  
553 - nf++;  
554 - return 0; //for next video  
555 - }  
556 - else {  
557 - // combine a audio file for the video  
558 - double silence_audio_start = audio.end_time;//maybe need append silence  
559 - double silence_audio_end = video.end_time;  
560 -  
561 - bool need_append_silence = true;  
562 - bool to_next_video = false;  
563 -  
564 - vector<std::string > merge_audio_files;  
565 - sprintf(destfile, "%d_0_silence.aac", nf);//a duration of silence  
566 - split_audio(silence_aac_file, 0, audio_start - video.start_time, destfile);  
567 - merge_audio_files.push_back(destfile);  
568 - tmp_files.push_back(destfile);  
569 -  
570 - if (audio.end_time < video.end_time + 0.1 && audio.end_time > video.end_time - 0.1) {  
571 - merge_audio_files.push_back(audio.name); //whole audio file,just fit  
572 - audio_start = audio.end_time + 0.1;  
573 - need_append_silence = false;  
574 - }  
575 - else if (audio.end_time > video.end_time){ //split part of audio file  
576 - sprintf(destfile, "%d_%s", nf, audio.name.c_str());  
577 - merge_audio_files.push_back(destfile);  
578 - tmp_files.push_back(destfile);  
579 - split_audio(audio.name.c_str(), audio_start, video.end_time - audio_start, destfile);  
580 - audio_start = video.end_time;  
581 - need_append_silence = false;  
582 - }  
583 - else {  
584 - merge_audio_files.push_back(audio.name);  
585 -  
586 - for (; audio_index + 1 < filesaudio.size(); audio_index++){//since video is not finished,try find next audio  
587 - audio = filesaudio[audio_index + 1];  
588 - if (audio.start_time < video.end_time) {//next audio should split to fit the video  
589 - silence_audio_end = audio.start_time;  
590 -  
591 - sprintf(destfile, "%d_%d_silence.aac", nf, audio_index);  
592 - split_audio(silence_aac_file, 0, silence_audio_end - silence_audio_start, destfile);  
593 - merge_audio_files.push_back(destfile);  
594 - tmp_files.push_back(destfile);  
595 -  
596 - if (audio.end_time > video.end_time - 0.1 && audio.end_time < video.end_time + 0.1) {//just match  
597 - merge_audio_files.push_back(audio.name);  
598 - need_append_silence = false;  
599 - audio_start = audio.end_time + 0.1;  
600 - audio_index++;//this audio is used  
601 - break;  
602 - }  
603 - if (audio.end_time > video.end_time){  
604 - sprintf(destfile, "%d_%s", nf, audio.name.c_str());  
605 - merge_audio_files.push_back(destfile);  
606 - tmp_files.push_back(destfile);  
607 - split_audio(audio.name.c_str(), 0, video.end_time - audio.start_time, destfile);  
608 - need_append_silence = false;  
609 - //adjust timecode for the audio is part left  
610 - float cur_audio_start = video.end_time - audio.start_time;  
611 -  
612 - audio_start = audio.start_time;  
613 -  
614 - for (int j = audio_index + 1; j < filesaudio.size(); j++){  
615 - filesaudio[j].start_time -= audio_start;  
616 - filesaudio[j].end_time -= audio_start;  
617 - }  
618 -  
619 - for (int j = nv; j < filesvideo.size(); j++) {  
620 - filesvideo[j].start_time -= audio_start;  
621 - filesvideo[j].end_time -= audio_start;  
622 - }  
623 - audio_index++;  
624 - audio = filesaudio[audio_index];  
625 - audio_start = cur_audio_start;  
626 -  
627 - to_next_video = true;  
628 -  
629 - break;  
630 - }  
631 - merge_audio_files.push_back(audio.name);//whole audio should be appended  
632 - silence_audio_start = audio.end_time; //adjust the silence start  
633 - }  
634 - else {  
635 - break;//no need for next audio  
636 - }  
637 - }//end audio find for the video  
638 - }//end else  
639 -  
640 - if (need_append_silence) {  
641 - sprintf(destfile, "%d_silence.aac", nf);  
642 - split_audio(silence_aac_file, 0, silence_audio_end - silence_audio_start, destfile);  
643 - merge_audio_files.push_back(destfile);  
644 - tmp_files.push_back(destfile); 542 + start_time = audio_end.type_time;
  543 + merge_audio_files.push_back(audio_file);
  544 +
  545 + if (i == files.size() - 2){
  546 + if (video.end_time - audio_end.type_time > 0.1){
  547 + sprintf(audio_file, "%d_%d_silence.aac", nf, nsilence++);//a duration of silence
  548 + ::split_audio(silence_aac_file, 0, video.end_time - audio_end.type_time, audio_file);
  549 + merge_audio_files.push_back(silence_aac_file);
  550 + tmp_files.push_back(silence_aac_file);
  551 + }
645 } 552 }
  553 + }
646 554
647 - sprintf(audio_file, "%d_merged.aac", nf);  
648 - merge_audio_file(merge_audio_files, audio_file); 555 + sprintf(audio_file, "%d_merged.aac", nf);
  556 + merge_audio_file(merge_audio_files, audio_file);
649 557
650 558
651 - sprintf(destfile, "%d.ts", nf);  
652 - merge_audio_video(audio_file, video.name.c_str(), destfile);  
653 - merged_files.push_back(destfile);  
654 - nf++; 559 + sprintf(destfile, "%d.ts", nf);
  560 + ::merge_audio_video(audio_file, video.name.c_str(), destfile);
  561 + merged_files.push_back(destfile);
  562 + nf++;
655 563
656 - if (!to_next_video){  
657 - nv++;//this video is processed  
658 - return 1;  
659 - }  
660 - }//end need combine  
661 return 0; 564 return 0;
662 } 565 }
663 566
664 -int MergeProcess::process_video_behind_audio() 567 +int MergeProcess::merge_audio_pic(vector<media_info> & files)
665 { 568 {
666 - sprintf(audio_file, "%d_%s", nf, audio.name.c_str());  
667 - if (video.start_time < audio.end_time - 0.1){  
668 - split_audio(audio.name.c_str(), audio_start, video.start_time - audio_start, audio_file);  
669 - audio_start = video.start_time; 569 + media_info audio = files[0];
  570 + media_info audio_end = files[1];
  571 +
  572 + if (audio.type_time - audio.start_time > 0.10 || audio_end.end_time - audio.type_time > 0.10) {
  573 + sprintf(audio_file, "%d_%s", nf, audio.name.c_str());
  574 + ::split_audio(audio.name.c_str(), audio.type_time - audio.start_time, audio_end.type_time - audio.start_time, audio_file);
  575 + tmp_files.push_back(audio_file);
670 } 576 }
671 - else {  
672 - split_audio(audio.name.c_str(), audio_start, audio.end_time - audio_start, audio_file); 577 + else{
  578 + strcpy(audio_file, audio.name.c_str());
673 } 579 }
674 - tmp_files.push_back(audio_file); 580 +
  581 + sprintf(destfile, "%d.ts", nf);
675 582
676 - sprintf(pic_file, "%s.jpg", video.name.c_str());  
677 - get_video_first_frame_jpeg(video, pic_file);  
678 - tmp_files.push_back(pic_file); 583 + int i = 0;
  584 + for (; i < sorted_infos.size(); i++){
  585 + if (sorted_infos[i].m_type == mt_video){
  586 + string name = sorted_infos[i].name;
  587 + sprintf(pic_file, "%s.jpg", name.c_str());
  588 + get_video_first_frame_jpeg(name.c_str(), pic_file);
  589 + tmp_files.push_back(pic_file);
  590 + break;
  591 + }
  592 + }
  593 + if (i == sorted_infos.size()){
  594 + strcpy(pic_file, blank_pic_file);
  595 + }
679 596
680 - sprintf(destfile, "%d.ts", nf);  
681 - merge_audio_pic(audio_file, pic_file, destfile); 597 + ::merge_audio_pic(audio_file, pic_file, destfile);
682 merged_files.push_back(destfile); 598 merged_files.push_back(destfile);
683 nf++; 599 nf++;
684 600
685 - if (video.start_time >= audio.end_time - 0.1){//all audio file no video, to next audio  
686 - audio_start = audio.end_time + 0.1;//no audio left  
687 - return 1;  
688 - }  
689 return 0; 601 return 0;
690 } 602 }
691 603
692 -int MergeProcess::process_video_align_audio()  
693 -{  
694 - if (audio.end_time > video.end_time){ //this video finish, to next video  
695 - sprintf(destfile, "%d_%s", nf, audio.name.c_str());  
696 - split_audio(audio.name.c_str(), video.start_time, video.end_time - video.start_time, destfile);  
697 - tmp_files.push_back(destfile);  
698 -  
699 - audio_start = video.end_time;  
700 - sprintf(destfile, "%d.ts", nf);  
701 - merge_audio_video(audio, nf, video, destfile);  
702 - merged_files.push_back(destfile);  
703 - nf++;  
704 - }  
705 - else if (video.end_time - audio.end_time < 0.1){//just fine, this audio file finish  
706 - sprintf(destfile, "%d_%s", nf, audio.name.c_str());  
707 - split_audio(audio.name.c_str(), video.start_time, audio.end_time - video.start_time, destfile);  
708 - tmp_files.push_back(destfile);  
709 -  
710 - sprintf(destfile, "%d.ts", nf);  
711 - merge_audio_video(audio, nf, video, destfile);  
712 - merged_files.push_back(destfile);  
713 - audio_start = audio.end_time + 0.1;//no audio left  
714 - nf++;  
715 - nv++;//this video is used  
716 - return 1;  
717 - }  
718 - else { // this audio finish,add silence and/or next audio  
719 - sprintf(destfile, "%d_%s", nf, audio.name.c_str());  
720 - split_audio(audio.name.c_str(), video.start_time, audio.end_time - video.start_time, destfile);  
721 - vector<std::string > merge_audio_files;  
722 - merge_audio_files.push_back(destfile);  
723 - tmp_files.push_back(destfile);  
724 -  
725 - audio_start = audio.end_time + 0.1;  
726 -  
727 - double silence_audio_start = audio.end_time;  
728 - double silence_audio_end = video.end_time;  
729 -  
730 - bool need_silence = true;  
731 - bool to_next_video = false;  
732 - for (; audio_index + 1 < filesaudio.size(); audio_index++){//since video is not finished,try find next audio  
733 - audio = filesaudio[audio_index + 1];  
734 - if (audio.start_time < video.end_time) {//next audio should split to fit the video  
735 - silence_audio_end = audio.start_time;  
736 -  
737 - sprintf(destfile, "%d_%d_silence.aac", nf, audio_index);  
738 - split_audio(silence_aac_file, 0, silence_audio_end - silence_audio_start, destfile);  
739 - merge_audio_files.push_back(destfile);  
740 - tmp_files.push_back(destfile);  
741 -  
742 - if (audio.end_time > video.end_time - 0.1 && audio.end_time < video.end_time + 0.1) {//just match  
743 - merge_audio_files.push_back(audio.name);  
744 - need_silence = false;  
745 - audio_start = audio.end_time + 0.1;  
746 - audio_index++;  
747 - break;  
748 - }  
749 - if (audio.end_time > video.end_time){  
750 - sprintf(destfile, "%d_%s", nf, audio.name.c_str());  
751 - merge_audio_files.push_back(destfile);  
752 - tmp_files.push_back(destfile);  
753 - split_audio(audio.name.c_str(), 0, video.end_time - audio.start_time, destfile);  
754 - need_silence = false;  
755 - //adjust timecode for the audio is part left  
756 - float cur_audio_start = video.end_time - audio.start_time;  
757 -  
758 - audio_start = audio.start_time;  
759 -  
760 - for (int j = audio_index + 1; j < filesaudio.size(); j++){  
761 - filesaudio[j].start_time -= audio_start;  
762 - filesaudio[j].end_time -= audio_start;  
763 - }  
764 -  
765 - for (int j = nv; j < filesvideo.size(); j++) {  
766 - filesvideo[j].start_time -= audio_start;  
767 - filesvideo[j].end_time -= audio_start;  
768 - }  
769 - audio_index++;  
770 - audio = filesaudio[audio_index];  
771 - audio_start = cur_audio_start;  
772 -  
773 - to_next_video = true;  
774 -  
775 - break;  
776 - }  
777 - merge_audio_files.push_back(audio.name);//whole audio should be appended  
778 - silence_audio_start = audio.end_time; //adjust the silence start  
779 - audio_start = audio.end_time + 0.1;  
780 - }  
781 - else {  
782 - break;//no need for next audio  
783 - } 604 +int MergeProcess::find_video_between_the_audio()
  605 +{
  606 + int index = sorted_infos[0].index;
  607 + int video_index = 0;
  608 + for (int i = 1; i < sorted_infos.size(); i++){
  609 + if (sorted_infos[i].index == index)
  610 + break;
  611 + if (sorted_infos[i].m_type == mt_video)
  612 + {
  613 + video_index = i;
  614 + break;
784 } 615 }
  616 + }
  617 + return video_index;
  618 +}
785 619
786 - if (need_silence) {  
787 - sprintf(destfile, "%d_silence.aac", nf);  
788 - split_audio(silence_aac_file, 0, silence_audio_end - silence_audio_start, destfile);  
789 - merge_audio_files.push_back(destfile);  
790 - tmp_files.push_back(destfile); 620 +int MergeProcess::find_video_end()
  621 +{
  622 + int index = sorted_infos[0].index;
  623 + int video_index = 0;
  624 + for (int i = 1; i < sorted_infos.size(); i++){
  625 + if (sorted_infos[i].index == index){
  626 + video_index = i;
  627 + break;
791 } 628 }
  629 + }
  630 + return video_index;
  631 +}
  632 +
  633 +bool MergeProcess::is_audio_start(int index)
  634 +{
  635 + return (sorted_infos[index].m_type == mt_audio && sorted_infos[index].t_type == tt_start);
  636 +}
792 637
793 - sprintf(audio_file, "%d_merged.aac", nf);  
794 - merge_audio_file(merge_audio_files, audio_file);  
795 638
  639 +int MergeProcess::split_audio(int index_from, vector<media_info> & result)
  640 +{
  641 + media_info audio = sorted_infos[index_from];
  642 + media_info video = sorted_infos[index_from + 1];
  643 +
  644 + result.clear();
796 645
797 - sprintf(destfile, "%d.ts", nf);  
798 - merge_audio_video(audio_file, video.name.c_str(), destfile);  
799 - merged_files.push_back(destfile);  
800 - nf++; 646 + for (int i = 0; i < index_from; i++){
  647 + result.push_back(sorted_infos[i]);
  648 + }
801 649
802 - if (!to_next_video){  
803 - nv++;  
804 - return 1; 650 + if (sorted_infos[index_from + 2].index == sorted_infos[index_from].index){
  651 + if (sorted_infos[index_from].end_time - sorted_infos[index_from + 1].start_time < 0.1){//no need to split
  652 + result.push_back(sorted_infos[index_from + 2]);//put the audio end to the result
  653 + for (int i = 0; i < index_from + 2; i++){
  654 + sorted_infos.pop_front();
  655 + }
  656 + sorted_infos.push_front(video);
  657 + return 0;
805 } 658 }
806 } 659 }
  660 +
  661 + audio.t_type = tt_end;
  662 + audio.type_time = video.start_time;
  663 + result.push_back(audio);
  664 +
  665 + for (int i = 0; i < index_from + 1; i++){
  666 + sorted_infos.pop_front();
  667 + }
  668 +
  669 + audio.t_type = tt_start;
  670 + sorted_infos.push_front(audio);
  671 + sorted_infos.push_front(video);
807 return 0; 672 return 0;
808 } 673 }
809 674
810 -int MergeProcess::process_video_loop() 675 +void MergeProcess::get_front_info(int index_to, vector<media_info> &cur_processing)
811 { 676 {
812 - for (; nv < filesvideo.size(); nv++) {  
813 - video = filesvideo[nv];  
814 -  
815 - if (video.start_time < audio_start - 0.1)  
816 - {//video is much more ahead of audio,try padding silence first  
817 - if (process_video_ahead_of_audio())  
818 - break;  
819 - }//end video is ahead of audio  
820 - if (video.start_time - audio_start > 0.1) {//video is behind audio too much  
821 - if (process_video_behind_audio())  
822 - break;  
823 - }  
824 - else if (audio_start - video.start_time < 0.1){  
825 - if (process_video_align_audio())  
826 - break;  
827 - } 677 + cur_processing.clear();
  678 + for (int i = 0; i <= index_to; i++){
  679 + cur_processing.push_back(sorted_infos[i]);
  680 + }
  681 + for (int i = 0; i <= index_to; i++){
  682 + sorted_infos.pop_front();
828 } 683 }
829 - return 0;  
830 } 684 }
831 685
832 int MergeProcess::process_va() 686 int MergeProcess::process_va()
833 { 687 {
834 - for (audio_index = 0; audio_index < filesaudio.size(); audio_index++){ //  
835 -  
836 - adjust_va_timestamp();  
837 -  
838 - audio = filesaudio[audio_index];  
839 - audio_start = 0;//for a new processing audio,the start is 0  
840 -  
841 - process_video_loop();  
842 -  
843 - merge_left_audio(); 688 + vector<media_info> cur_processing;
  689 + while (sorted_infos.size())
  690 + {
  691 + media_type mt = sorted_infos[0].m_type;
  692 + if (mt == mt_audio){
  693 + int index = find_video_between_the_audio();
  694 + if (index > 0) //have_video
  695 + {
  696 + split_audio(index, cur_processing);
  697 + }
  698 + else {
  699 + get_front_info(1, cur_processing);
  700 + }
  701 + merge_audio_pic(cur_processing);
  702 + }
  703 + else{
  704 + int index = find_video_end();
  705 + if (is_audio_start(index - 1)) {
  706 + split_audio(index - 1, cur_processing);
  707 + }
  708 + else {
  709 + get_front_info(index, cur_processing);
  710 + }
  711 + merge_audio_video(cur_processing);
  712 + }
844 } 713 }
845 return 0; 714 return 0;
846 } 715 }
@@ -850,20 +719,45 @@ int MergeProcess::process_files(const char * output_dest_file) @@ -850,20 +719,45 @@ int MergeProcess::process_files(const char * output_dest_file)
850 { 719 {
851 //don't split video, for a video, using merged audios to mix with it 720 //don't split video, for a video, using merged audios to mix with it
852 //for audio, mix with video or jpg 721 //for audio, mix with video or jpg
  722 + if (!media_files.size()){
  723 + return 0;
  724 + }
  725 +
  726 + // judge if it is only one type
  727 + media_type mt = media_files[0].m_type;
  728 + bool only_one_type = true;
  729 + for (int i = 1; i < media_files.size(); i++){
  730 + if (mt != media_files[i].m_type){
  731 + only_one_type = false;
  732 + break;
  733 + }
  734 + }
  735 +
  736 + if (only_one_type){
  737 + if (mt == mt_audio) {
  738 + if (media_files.size() == 1){
  739 + fileinfo audio = media_files[0];
  740 + ::merge_audio_pic(audio, blank_pic_file, "dest.ts");
  741 + return 0;
  742 + }
853 743
854 - if (filesvideo.size()) {//has video files  
855 - if (filesaudio.size()){  
856 - process_va(); //process the case both audio and video files exist 744 + for (int i = 0; i < media_files.size(); i++){
  745 + fileinfo audio = media_files[i];
  746 + sprintf(destfile, "%d.ts", nf);
  747 + ::merge_audio_pic(audio, blank_pic_file, destfile);
  748 + merged_files.push_back(destfile);
  749 + nf++;
  750 + }
857 } 751 }
858 - else{//only video  
859 - if (filesvideo.size() == 1){  
860 - fileinfo video = filesvideo[0]; 752 + else {
  753 + if (media_files.size() == 1){
  754 + fileinfo video = media_files[0];
861 merge_video_silence(video, silence_aac_file, "dest.ts"); 755 merge_video_silence(video, silence_aac_file, "dest.ts");
862 return 0; 756 return 0;
863 } 757 }
864 758
865 - for (int i = 0; i < filesvideo.size(); i++){  
866 - fileinfo video = filesvideo[i]; 759 + for (int i = 0; i < media_files.size(); i++){
  760 + fileinfo video = media_files[i];
867 sprintf(destfile, "%d.ts", nf); 761 sprintf(destfile, "%d.ts", nf);
868 merge_video_silence(video, silence_aac_file, destfile); 762 merge_video_silence(video, silence_aac_file, destfile);
869 merged_files.push_back(destfile); 763 merged_files.push_back(destfile);
@@ -871,21 +765,8 @@ int MergeProcess::process_files(const char * output_dest_file) @@ -871,21 +765,8 @@ int MergeProcess::process_files(const char * output_dest_file)
871 } 765 }
872 } 766 }
873 } 767 }
874 - else {//only audio  
875 -  
876 - if (filesaudio.size() == 1){  
877 - fileinfo audio = filesaudio[0];  
878 - merge_audio_pic(audio, blank_pic_file, "dest.ts");  
879 - return 0;  
880 - }  
881 -  
882 - for (int i = 0; i < filesaudio.size(); i++){  
883 - fileinfo audio = filesaudio[i];  
884 - sprintf(destfile, "%d.ts", nf);  
885 - merge_audio_pic(audio, blank_pic_file, destfile);  
886 - merged_files.push_back(destfile);  
887 - nf++;  
888 - } 768 + else {
  769 + process_va();
889 } 770 }
890 771
891 concate_files(merged_files, "m.ts"); 772 concate_files(merged_files, "m.ts");
@@ -986,7 +867,7 @@ int main(int argc, char * argv[]) @@ -986,7 +867,7 @@ int main(int argc, char * argv[])
986 867
987 load_codec_param(); 868 load_codec_param();
988 869
989 - MergeProcess mp(media_files[type_audio], media_files[type_video]); 870 + MergeProcess mp;
990 mp.process_files("dest.ts"); 871 mp.process_files("dest.ts");
991 872
992 return 0; 873 return 0;