胡斌

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,132 +588,147 @@ int process_files(const char * output_dest_file) @@ -466,132 +588,147 @@ 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  
476 - sprintf(destfile, "%d_%s", nf, audio.name.c_str());  
477 - split_audio(audio.name.c_str(), video.start_time, video.end_time - video.start_time, destfile);  
478 - tmp_files.push_back(destfile); 600 + if (audio.end_time > video.end_time){ //this video finish, to next video
  601 + sprintf(destfile, "%d_%s", nf, audio.name.c_str());
  602 + split_audio(audio.name.c_str(), video.start_time, video.end_time - video.start_time, destfile);
  603 + tmp_files.push_back(destfile);
479 604
480 - audio_start = video.end_time;  
481 - sprintf(destfile, "%d.ts", nf);  
482 - megre_audio_video(audio, nf, video, destfile);  
483 - merged_files.push_back(destfile);  
484 - nf++;  
485 - }  
486 - else if (video.end_time - audio.end_time < 0.1){//just fine, this audio file finish  
487 - sprintf(destfile, "%d_%s", nf, audio.name.c_str());  
488 - split_audio(audio.name.c_str(), video.start_time, audio.end_time - video.start_time, destfile);  
489 - tmp_files.push_back(destfile); 605 + audio_start = video.end_time;
  606 + sprintf(destfile, "%d.ts", nf);
  607 + merge_audio_video(audio, nf, video, destfile);
  608 + merged_files.push_back(destfile);
  609 + nf++;
  610 + }
  611 + else if (video.end_time - audio.end_time < 0.1){//just fine, this audio file finish
  612 + sprintf(destfile, "%d_%s", nf, audio.name.c_str());
  613 + split_audio(audio.name.c_str(), video.start_time, audio.end_time - video.start_time, destfile);
  614 + tmp_files.push_back(destfile);
490 615
491 - sprintf(destfile, "%d.ts", nf);  
492 - megre_audio_video(audio, nf, video, destfile);  
493 - merged_files.push_back(destfile);  
494 - audio_start = audio.end_time + 0.1;//no audio left  
495 - nf++;  
496 - nv++;//this video is used  
497 - break;  
498 - }  
499 - else { // this audio finish,add silence and/or next audio  
500 - sprintf(destfile, "%d_%s", nf, audio.name.c_str());  
501 - split_audio(audio.name.c_str(), video.start_time, audio.end_time - video.start_time, destfile);  
502 - vector<std::string > merge_audio_files;  
503 - merge_audio_files.push_back(destfile);  
504 - tmp_files.push_back(destfile);  
505 -  
506 - double silence_audio_start = audio.end_time;  
507 - double silence_audio_end = video.end_time;  
508 -  
509 - bool need_slilence = true;  
510 - bool to_next_video = false;  
511 - for (; i + 1 < filesaudio.size(); i++){//since video is not finished,try find next audio  
512 - audio = filesaudio[i + 1];  
513 - if (audio.start_time < video.end_time) {//next audio should split to fit the video  
514 - silence_audio_end = audio.start_time;  
515 -  
516 - sprintf(destfile, "%d_%d_silence.aac", nf, i);  
517 - split_audio(silence_aac_file, 0, silence_audio_end - silence_audio_start, destfile);  
518 - merge_audio_files.push_back(destfile);  
519 - tmp_files.push_back(destfile); 616 + sprintf(destfile, "%d.ts", nf);
  617 + merge_audio_video(audio, nf, video, destfile);
  618 + merged_files.push_back(destfile);
  619 + audio_start = audio.end_time + 0.1;//no audio left
  620 + nf++;
  621 + nv++;//this video is used
  622 + break;
  623 + }
  624 + else { // this audio finish,add silence and/or next audio
  625 + sprintf(destfile, "%d_%s", nf, audio.name.c_str());
  626 + split_audio(audio.name.c_str(), video.start_time, audio.end_time - video.start_time, destfile);
  627 + vector<std::string > merge_audio_files;
  628 + merge_audio_files.push_back(destfile);
  629 + tmp_files.push_back(destfile);
520 630
521 - 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);  
523 - need_slilence = false;  
524 - i++;  
525 - break;  
526 - }  
527 - if (audio.end_time > video.end_time){  
528 - sprintf(destfile, "%d_%s", nf, audio.name.c_str()); 631 + audio_start = audio.end_time + 0.1;
  632 +
  633 + double silence_audio_start = audio.end_time;
  634 + double silence_audio_end = video.end_time;
  635 +
  636 + bool need_silence = true;
  637 + bool to_next_video = false;
  638 + for (; i + 1 < filesaudio.size(); i++){//since video is not finished,try find next audio
  639 + audio = filesaudio[i + 1];
  640 + if (audio.start_time < video.end_time) {//next audio should split to fit the video
  641 + silence_audio_end = audio.start_time;
  642 +
  643 + sprintf(destfile, "%d_%d_silence.aac", nf, i);
  644 + split_audio(silence_aac_file, 0, silence_audio_end - silence_audio_start, destfile);
529 merge_audio_files.push_back(destfile); 645 merge_audio_files.push_back(destfile);
530 tmp_files.push_back(destfile); 646 tmp_files.push_back(destfile);
531 - split_audio(audio.name.c_str(), 0, video.end_time - audio.start_time, destfile);  
532 - need_slilence = false;  
533 - //adjust timecode for the audio is part left  
534 - float cur_audio_start = video.end_time - audio.start_time;  
535 647
536 - audio_start = audio.start_time;  
537 -  
538 - for (int j = i + 1; j < filesaudio.size(); j++){  
539 - filesaudio[j].start_time -= audio_start;  
540 - filesaudio[j].end_time -= audio_start; 648 + if (audio.end_time > video.end_time - 0.1 && audio.end_time < video.end_time + 0.1) {//just match
  649 + merge_audio_files.push_back(audio.name);
  650 + need_silence = false;
  651 + audio_start = audio.end_time + 0.1;
  652 + i++;
  653 + break;
541 } 654 }
542 -  
543 - for (int j = nv; j < filesvideo.size(); j++) {  
544 - filesvideo[j].start_time -= audio_start;  
545 - filesvideo[j].end_time -= audio_start; 655 + if (audio.end_time > video.end_time){
  656 + sprintf(destfile, "%d_%s", nf, audio.name.c_str());
  657 + merge_audio_files.push_back(destfile);
  658 + tmp_files.push_back(destfile);
  659 + split_audio(audio.name.c_str(), 0, video.end_time - audio.start_time, destfile);
  660 + need_silence = false;
  661 + //adjust timecode for the audio is part left
  662 + float cur_audio_start = video.end_time - audio.start_time;
  663 +
  664 + audio_start = audio.start_time;
  665 +
  666 + for (int j = i + 1; j < filesaudio.size(); j++){
  667 + filesaudio[j].start_time -= audio_start;
  668 + filesaudio[j].end_time -= audio_start;
  669 + }
  670 +
  671 + for (int j = nv; j < filesvideo.size(); j++) {
  672 + filesvideo[j].start_time -= audio_start;
  673 + filesvideo[j].end_time -= audio_start;
  674 + }
  675 + i++;
  676 + audio = filesaudio[i];
  677 + audio_start = cur_audio_start;
  678 +
  679 + to_next_video = true;
  680 +
  681 + break;
546 } 682 }
547 - i++;  
548 - audio = filesaudio[i];  
549 - audio_start = cur_audio_start;  
550 -  
551 - to_next_video = true;  
552 -  
553 - break; 683 + merge_audio_files.push_back(audio.name);//whole audio should be appended
  684 + silence_audio_start = audio.end_time; //adjust the silence start
  685 + audio_start = audio.end_time + 0.1;
  686 + }
  687 + else {
  688 + break;//no need for next audio
554 } 689 }
555 - merge_audio_files.push_back(audio.name);//whole audio should be appended  
556 - silence_audio_start = audio.end_time; //adjust the silence start  
557 - }  
558 - else {  
559 - break;//no need for next audio  
560 } 690 }
561 - }  
562 691
563 - if (need_slilence) {  
564 - sprintf(destfile, "%d_silence.aac", nf);  
565 - split_audio(silence_aac_file, 0, silence_audio_end - silence_audio_start, destfile);  
566 - merge_audio_files.push_back(destfile);  
567 - tmp_files.push_back(destfile);  
568 - } 692 + if (need_silence) {
  693 + sprintf(destfile, "%d_silence.aac", nf);
  694 + split_audio(silence_aac_file, 0, silence_audio_end - silence_audio_start, destfile);
  695 + merge_audio_files.push_back(destfile);
  696 + tmp_files.push_back(destfile);
  697 + }
569 698
570 - sprintf(audio_file, "%d_merged.aac", nf);  
571 - merge_audio_file(merge_audio_files, audio_file); 699 + sprintf(audio_file, "%d_merged.aac", nf);
  700 + merge_audio_file(merge_audio_files, audio_file);
572 701
573 702
574 - sprintf(destfile, "%d.ts", nf);  
575 - megre_audio_video(audio_file, video.name.c_str(), destfile);  
576 - merged_files.push_back(destfile);  
577 - nf++; 703 + sprintf(destfile, "%d.ts", nf);
  704 + merge_audio_video(audio_file, video.name.c_str(), destfile);
  705 + merged_files.push_back(destfile);
  706 + nf++;
578 707
579 - if (!to_next_video){  
580 - nv++;  
581 - break; 708 + if (!to_next_video){
  709 + nv++;
  710 + break;
  711 + }
582 } 712 }
583 } 713 }
584 } 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 }