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