正在显示
1 个修改的文件
包含
221 行增加
和
340 行删除
| @@ -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; |
-
请 注册 或 登录 后发表评论