1 /*
2 * Copyright (C) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "avmuxer_demo.h"
17 #include <iostream>
18 #include <fstream>
19 #include <cstdio>
20 #include <unistd.h>
21 #include <fcntl.h>
22 #include "securec.h"
23 #include "media_errors.h"
24
25 namespace {
26 constexpr uint32_t VIDEO_AUDIO_MODE = 0;
27 constexpr uint32_t VIDEO_MODE = 1;
28 constexpr uint32_t AUDIO_MODE = 2;
29 constexpr uint32_t SLEEP_UTIME = 50000;
30 constexpr uint32_t H264_WIDTH = 480;
31 constexpr uint32_t H264_HEIGHT = 640;
32 constexpr uint32_t H264_FRAME_RATE = 30;
33 constexpr uint32_t MPEG4_WIDTH = 720;
34 constexpr uint32_t MPEG4_HEIGHT = 480;
35 constexpr uint32_t MPEG4_FRAME_RATE = 60;
36 constexpr uint32_t AAC_SAMPLE_RATE = 44100;
37 constexpr uint32_t AAC_CHANNEL = 2;
38 constexpr uint32_t MP3_SAMPLE_RATE = 48000;
39 constexpr uint32_t MP3_CHANNEL = 2;
40 constexpr float LATITUDE = 30.1111;
41 constexpr float LONGITUDE = 150.2222;
42 constexpr int32_t ROTATION = 90;
43 constexpr uint32_t H264_FRAME_DURATION = 33333;
44 constexpr uint32_t MPEG4_FRAME_DURATION = 16666;
45 constexpr uint32_t AAC_FRAME_DURATION = 23220;
46 constexpr uint32_t MP3_FRAME_DURATION = 23220;
47
48 const int32_t H264_FRAME_SIZE[] = {
49 646, 5855, 3185, 3797, 3055, 5204, 2620, 6262, 2272, 3702, 4108, 4356, 4975, 4590, 3083, 1930, 1801, 1945,
50 3475, 4028, 1415, 1930, 2802, 2176, 1727, 2287, 2274, 2033, 2432, 4447, 4130, 5229, 5792, 4217, 5804,
51 6586, 7506, 5128, 5549, 6685, 5248, 4819, 5385, 4818, 5239, 4148, 6980, 5124, 4255, 5666, 4756, 4975,
52 3840, 4913, 3649, 4002, 4926, 4284, 5329, 4305, 3750, 4770, 4090, 4767, 3995, 5039, 3820, 4566, 5556,
53 4029, 3755, 5059, 3888, 3572, 4680, 4662, 4259, 3869, 4306, 3519, 3160, 4400, 4426, 4370, 3489, 4907,
54 4102, 3723, 4420, 4347, 4117, 4578, 4470, 4579, 4128, 4157, 4226, 4742, 3616, 4476, 4084, 4623, 3736,
55 4207, 3644, 4349, 4948, 4009, 3583, 4658, 3974, 5441, 4049, 3786, 4093, 3375, 4207, 3787, 4365, 2905,
56 4371, 4132, 3633, 3652, 2977, 4387, 3368, 3887, 3464, 4198, 4690, 4467, 2931, 3573, 4652, 3901, 4403,
57 3120, 3494, 4666, 3898, 3607, 3272, 4070, 3151, 3237, 3936, 3962, 3637, 3716, 3735, 4371, 3141, 3322,
58 4401, 3579, 4006, 2720, 3526, 4796, 3737, 3824, 3257, 4310, 2992, 3537, 3209, 3453, 3819, 3212, 4384,
59 3571, 3682, 3344, 3017, 3960, 2737, 1970, 2433, 1442, 1560, 4710, 1070, 877, 833, 838, 776, 735, 1184,
60 1172, 699, 723, 2828, 4257, 4329, 3567, 5365, 4213, 3612, 4833, 3388, 3553, 3535, 4937, 4057, 3990,
61 5047, 4197, 4656, 3219, 3661, 3666, 3908, 4385, 4350, 3636, 4038, 5213, 3677, 3789, 4221, 4137, 4440,
62 3447, 3836, 3912, 4806, 3100, 2963, 5204, 2394, 2391, 1772, 1586, 1598, 2558, 2663, 4537, 3530, 4045,
63 4641, 5723, 3688, 4231, 3420, 3462, 3828, 4764, 3944, 4499, 4375, 4597, 4305, 3872, 3969, 2805, 4398,
64 3480, 4105, 3890, 3761, 3652, 4356, 2771, 3972, 2930, 3456, 3236, 4648, 3627, 2689, 3827, 2254, 3492,
65 2988, 4408, 3007, 4611, 3018, 4783, 2556, 3263, 4536, 4159, 3818, 5093, 3539, 4336, 3400, 3871, 4019,
66 4619, 5520, 3781, 4026, 4864, 3340, 4153, 4641, 4292, 4071, 4144, 5109, 3695, 4512, 3882, 3943, 4152,
67 4133, 3862, 4717, 3431, 4984, 4164, 4359, 3401, 3727, 4256, 3563, 4694, 3225, 3984, 2432, 3790, 2827,
68 3595, 4124, 3854, 2890, 3477, 3989, 3251, 3714, 3345, 4742, 1967, 3931, 1985, 1737, 1854, 2192, 2370,
69 2083, 3265, 3312, 3071, 4255, 3994, 4563, 4650, 4885, 3868, 4698, 3103, 3682, 4197, 5532, 3963, 4756,
70 4067, 3917, 3667, 3812, 4793, 3260, 3763, 4670, 3184, 2930, 3558, 3245, 4120, 4700, 3671, 4442, 3406,
71 4862, 4331, 5064, 4058, 4075, 3160, 3930, 5187, 3816, 3795, 3085, 3564, 3856, 3948, 4474, 3511, 4108,
72 4789, 2944, 3323, 2162, 2657, 2219, 1653, 2824, 2716, 3523, 2760, 3328, 3042, 3828, 3759, 3950, 3830,
73 3336, 4457, 3193, 3706, 4314, 3937, 3422, 4067, 5328, 3693, 4567, 3444, 4317, 4929, 3838, 4129, 2975,
74 4227, 4639, 4348, 2935, 3999, 4745, 3919, 3694, 2602, 4538, 4637, 4250, 3716, 3513, 3856, 4916, 4460,
75 4263, 4153, 4299, 3577, 5527, 2486, 3332, 4133, 4145, 3369, 3576, 3940, 4304, 3179, 5266, 3536, 3622,
76 2684, 3449, 3621, 4363, 4216, 4913, 5026, 3336, 3057, 2782, 3716, 3036, 4438, 3904, 4823, 1761, 2045,
77 1446, 3210, 1625, 2400, 3489, 4719, 3954, 3756, 4940, 2371, 4516, 3739, 3572, 2644, 3837, 4915, 2251,
78 4248, 4019, 4407, 4217, 2913, 5106
79 };
80 const int32_t AAC_FRAME_SIZE[] = {
81 361, 368, 22, 20, 20, 20, 20, 20, 18, 198, 513, 499, 534, 522, 541, 608, 596, 613, 631, 543,
82 563, 505, 411, 375, 402, 361, 396, 405, 372, 402, 382, 371, 363, 366, 401, 390, 519, 325, 367,
83 365, 389, 358, 389, 413, 327, 493, 378, 360, 359, 387, 356, 391, 362, 360, 393, 408, 384, 348,
84 361, 437, 494, 381, 397, 329, 365, 376, 354, 376, 347, 541, 366, 377, 370, 365, 368, 366, 358,
85 366, 401, 395, 393, 385, 348, 365, 386, 375, 381, 371, 549, 335, 376, 362, 390, 391, 350, 380,
86 368, 360, 387, 408, 392, 383, 390, 418, 353, 383, 375, 410, 355, 375, 437, 413, 393, 427, 397,
87 397, 363, 418, 393, 412, 373, 433, 323, 381, 396, 391, 372, 400, 397, 294, 280, 391, 405, 378,
88 410, 505, 411, 385, 380, 377, 345, 393, 375, 377, 378, 351, 401, 377, 404, 368, 370, 402, 386,
89 398, 393, 392, 386, 403, 360, 393, 373, 386, 362, 344, 416, 355, 380, 353, 398, 422, 386, 365,
90 335, 340, 383, 371, 386, 375, 399, 398, 352, 387, 380, 390, 391, 390, 385, 404, 384, 407, 365,
91 348, 388, 388, 385, 392, 383, 462, 463, 466, 392, 351, 358, 385, 358, 389, 378, 359, 349, 424,
92 335, 392, 347, 348, 379, 302, 295, 357, 458, 466, 460, 370, 390, 402, 405, 411, 378, 383, 351,
93 413, 420, 362, 343, 369, 367, 378, 355, 385, 410, 420, 375, 398, 394, 384, 376, 400, 395, 389,
94 395, 363, 422, 364, 365, 380, 395, 364, 395, 350, 319, 308, 374, 560, 503, 500, 438, 427, 445,
95 416, 366, 424, 331, 354, 376, 381, 387, 369, 382, 343, 366, 442, 419, 348, 362, 354, 405, 419,
96 332, 376, 388, 405, 365, 428, 379, 384, 387, 403, 385, 344, 366, 381, 366, 371, 286, 328, 470,
97 413, 404, 409, 406, 376, 370, 380, 393, 345, 400, 386, 397, 376, 407, 364, 362, 351, 377, 345,
98 375, 413, 353, 419, 382, 379, 383, 444, 392, 368, 374, 376, 349, 413, 405, 374, 355, 412, 385,
99 356, 277, 361, 461, 398, 431, 381, 405, 389, 374, 392, 377, 407, 377, 389, 406, 391, 378, 420,
100 388, 372, 372, 350, 373, 446, 399, 354, 368, 350, 373, 418, 390, 366, 367, 351, 414, 413, 362,
101 373, 364, 312, 400, 391, 371, 384, 478, 391, 400, 344, 360, 383, 349, 370, 393, 369, 364, 366,
102 401, 377, 360, 392, 398, 388, 358, 374, 386, 395, 374, 419, 376, 393, 376, 348, 416, 381, 363,
103 376, 381, 369, 378, 416, 366, 379, 363, 430, 368, 358, 470, 296, 358
104 };
105 const int32_t MPEG4_FRAME_SIZE[] = {
106 40629, 42109, 7513, 2414, 867, 1342, 676, 599, 698, 600, 657, 610, 15298, 615, 403, 433, 480, 458, 485,
107 536, 572, 524, 492, 608, 9497, 586, 423, 504, 526, 504, 538, 503, 494, 531, 534, 652, 9152, 682, 527,
108 559, 552, 571, 624, 776, 713, 687, 687, 685, 9301, 721, 599, 702, 786, 728, 715, 739, 711, 872, 748,
109 886, 9289, 777, 703, 716, 752, 807, 843, 827, 945, 880, 891, 803, 9334, 817, 758, 933, 917, 915, 935,
110 969, 959, 974, 1054, 1147, 9385, 912, 849, 989, 957, 1075, 997, 1060, 1108, 1077, 1011, 1107, 9467, 988,
111 1003, 1013, 1059, 1122, 1042, 1072, 1087, 1149, 1057, 1075, 9281, 948, 920, 1008, 1075, 1210, 1083, 1069,
112 1183, 1123, 1133, 1111, 9196, 1044, 982, 1153, 1235, 1160, 1179, 1124, 1272, 1175, 1180, 1285, 9072, 1113,
113 1000, 1045, 1147, 1033, 1057, 1240, 1241, 1127, 1065, 1118, 8856, 938, 882, 977, 1079, 1081, 1064, 964,
114 1059, 932, 1037, 1177, 8742, 970, 1007, 905, 976, 916, 984, 1039, 1076, 1055, 955, 1002, 8544, 861, 765,
115 854, 854, 902, 843, 757, 900, 720, 882, 914, 8272, 764, 627, 637, 736, 635, 751, 742, 841, 744, 822, 694,
116 8307, 567, 495, 612, 737, 701, 646, 585, 671, 626, 638, 816, 8173, 669, 524, 531, 616, 606, 637, 569, 645,
117 598, 650, 592, 8150, 606, 592, 503, 570, 577, 632, 585, 618, 678, 640, 617, 8062, 587, 527, 521, 578, 640,
118 648, 587, 610, 665, 658, 613, 7945, 623, 486, 471, 590, 566, 599, 542, 654, 546, 845, 587, 7956, 553, 470,
119 564, 553, 590, 558, 585, 619, 658, 628, 692, 7919, 633, 484, 556, 575, 637, 606, 615, 665, 643, 589, 654,
120 7964, 634, 543, 576, 583, 655, 563, 676, 594, 690, 522, 646, 7896, 595, 491, 525, 614, 678, 558, 641, 652,
121 673, 545, 683, 7834, 598, 457, 545, 574, 627, 553, 626, 664, 693, 604, 720, 7796, 591, 470, 566, 551, 592,
122 491, 653, 624, 601, 526, 700, 7724, 596, 438, 524, 512, 572, 537, 665, 669, 641, 561, 706, 7918, 661, 552,
123 579, 626, 628, 542, 664, 632, 711, 573, 767, 8016, 645, 472, 591, 573, 760, 607, 676, 628, 685, 596, 714,
124 8051, 672, 496, 561, 622, 599, 594, 696, 736, 737, 622, 705, 8017, 645, 536, 644, 642, 669, 625, 708, 699,
125 694, 758, 769, 8265, 715, 556, 629, 684, 684, 688, 674, 672, 667, 710, 643, 8383, 668, 598, 600, 673, 671,
126 690, 513, 730, 777, 660, 724, 8375, 692, 557, 631, 626, 733, 677, 771, 749, 843, 727, 794, 8508, 788, 576,
127 670, 706, 841, 714, 778, 744, 868, 765, 762, 8689, 752, 588, 749, 721, 825, 729, 794, 773, 875, 773, 898,
128 8797, 822, 654, 775, 780, 869, 777, 849, 854, 938, 772, 844, 8943, 835, 731, 729, 758, 837, 735, 782, 821,
129 896, 789, 848, 9095, 848, 652, 751, 818, 988, 828, 914, 854, 996, 888, 915, 9435, 909, 689, 767, 849, 966,
130 879, 914, 939, 1026, 888, 943, 9538, 893, 706, 868, 873, 951, 850, 808, 1072, 918, 932, 1166, 10145, 882,
131 815, 866, 886, 949, 990, 972, 943, 936, 1050, 955, 10352, 898, 916, 897, 904, 871, 962, 951, 945, 925, 1026,
132 931, 10486, 856, 806, 861, 918, 907, 1076, 970, 979, 945, 1007, 1041, 10717, 940, 902, 927, 968, 1041, 1176,
133 1139, 1101, 1121, 1187, 1068, 10897, 968, 973, 974, 990, 1040, 1162, 1053, 1075, 1214, 1262, 1141, 11030, 993,
134 917, 970, 1008, 1054, 1166, 1090, 1106, 1012, 1165, 1124, 11088, 1057, 1038, 990, 1045, 982, 1131, 1078, 1078,
135 1047, 1205, 1092, 10892, 928, 881, 962, 1001, 1004, 1058, 991, 1047, 1014, 1059, 1045, 10754, 984
136 };
137 const int32_t MP3_FRAME_SIZE[] = {
138 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
139 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
140 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
141 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
142 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
143 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
144 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
145 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
146 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
147 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
148 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
149 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
150 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
151 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
152 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
153 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
154 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
155 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
156 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
157 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
158 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
159 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
160 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
161 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
162 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
163 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
164 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
165 192, 192, 192, 192, 192, 192, 192, 192
166 };
167
168 struct StreamInfo {
169 uint32_t frameDuration_;
170 uint32_t frameNum_;
171 const int32_t *framePointer_;
172 std::string path_;
173 };
174
175 std::map<std::string, StreamInfo> CODEC_PARAMETER = {
176 {"h264", {H264_FRAME_DURATION, sizeof(H264_FRAME_SIZE) / sizeof(int32_t),
177 H264_FRAME_SIZE, "/data/media/test.h264"}},
178 {"mpeg4", {MPEG4_FRAME_DURATION, sizeof(MPEG4_FRAME_SIZE) / sizeof(int32_t),
179 MPEG4_FRAME_SIZE, "/data/media/test.mpeg4"}},
180 {"aac", {AAC_FRAME_DURATION, sizeof(AAC_FRAME_SIZE) / sizeof(int32_t),
181 AAC_FRAME_SIZE, "/data/media/test.aac"}},
182 {"mp3", {MP3_FRAME_DURATION, sizeof(MP3_FRAME_SIZE) / sizeof(int32_t),
183 MP3_FRAME_SIZE, "/data/media/test.mp3"}}
184 };
185 }
186 namespace OHOS {
187 namespace Media {
PushBuffer(std::shared_ptr<std::ifstream> File,const int32_t frameSize,int32_t i,int32_t trackId,int64_t stamp)188 bool AVMuxerDemo::PushBuffer(std::shared_ptr<std::ifstream> File, const int32_t frameSize,
189 int32_t i, int32_t trackId, int64_t stamp)
190 {
191 if (frameSize == 0) {
192 std::cout << "Frame size error" << std::endl;
193 return false;
194 }
195 uint8_t *buffer = static_cast<uint8_t *>(malloc(sizeof(char) * (frameSize)));
196 if (buffer == nullptr) {
197 std::cout << "no memory" << std::endl;
198 return false;
199 }
200 (void)File->read((char *)buffer, frameSize);
201 std::shared_ptr<AVContainerMemory> aVMem = std::make_shared<AVContainerMemory>(buffer, frameSize);
202 aVMem->SetRange(0, frameSize);
203 TrackSampleInfo info;
204 info.size = frameSize;
205 info.trackIdx = trackId;
206
207 if (i == 0) {
208 info.timeUs = 0;
209 info.flags = AVCODEC_BUFFER_FLAG_CODEC_DATA;
210 } else if ((i == 1 && trackId == videoTrackId_) || trackId == audioTrackId_) {
211 info.timeUs = stamp;
212 info.flags = AVCODEC_BUFFER_FLAG_SYNC_FRAME;
213 } else {
214 info.timeUs = stamp;
215 info.flags = AVCODEC_BUFFER_FLAG_PARTIAL_FRAME;
216 }
217
218 if (avmuxer_->WriteTrackSample(aVMem, info) != MSERR_OK) {
219 free(buffer);
220 return false;
221 };
222 free(buffer);
223 usleep(SLEEP_UTIME);
224
225 return true;
226 }
227
OpenFile(const std::string & filePath)228 std::shared_ptr<std::ifstream> OpenFile(const std::string &filePath)
229 {
230 auto file = std::make_unique<std::ifstream>();
231 file->open(filePath, std::ios::in | std::ios::binary);
232 return file;
233 }
234
WriteTrackSample()235 void AVMuxerDemo::WriteTrackSample()
236 {
237 double videoStamp = 0;
238 double audioStamp = 0;
239 int32_t i = 0;
240 int32_t videoLen = videoFile_ == nullptr ? INT32_MAX : videoFrameNum_;
241 int32_t audioLen = audioFile_ == nullptr ? INT32_MAX : audioFrameNum_;
242 while (i < videoLen && i < audioLen) {
243 if (videoFile_ != nullptr) {
244 if (!PushBuffer(videoFile_, *videoFrameArray_, i, videoTrackId_, videoStamp)) {
245 break;
246 }
247 videoFrameArray_++;
248 videoStamp += videoTimeDuration_;
249 }
250 if (audioFile_ != nullptr) {
251 if (!PushBuffer(audioFile_, *audioFrameArray_, i, audioTrackId_, audioStamp)) {
252 break;
253 }
254 audioFrameArray_++;
255 audioStamp += audioTimeDuration_;
256 }
257 i++;
258 std::cout << videoStamp << std::endl;
259 std::cout << audioStamp << std::endl;
260 }
261 }
262
SetParameter(const std::string & type)263 void AVMuxerDemo::SetParameter(const std::string &type)
264 {
265 if (type == "h264" || type == "mpeg4") {
266 videoTimeDuration_ = CODEC_PARAMETER[type].frameDuration_;
267 videoFrameNum_ = CODEC_PARAMETER[type].frameNum_;
268 videoFrameArray_ = CODEC_PARAMETER[type].framePointer_;
269 videoFile_ = OpenFile(CODEC_PARAMETER[type].path_);
270 } else {
271 audioTimeDuration_ = CODEC_PARAMETER[type].frameDuration_;
272 audioFrameNum_ = CODEC_PARAMETER[type].frameNum_;
273 audioFrameArray_ = CODEC_PARAMETER[type].framePointer_;
274 audioFile_ = OpenFile(CODEC_PARAMETER[type].path_);
275 }
276 }
277
AddTrackVideo(std::string & videoType)278 bool AVMuxerDemo::AddTrackVideo(std::string &videoType)
279 {
280 MediaDescription trackDesc;
281 if (videoType == "h264") {
282 trackDesc.PutStringValue(MediaDescriptionKey::MD_KEY_CODEC_MIME, "video/avc");
283 trackDesc.PutIntValue(MediaDescriptionKey::MD_KEY_WIDTH, H264_WIDTH);
284 trackDesc.PutIntValue(MediaDescriptionKey::MD_KEY_HEIGHT, H264_HEIGHT);
285 trackDesc.PutIntValue(MediaDescriptionKey::MD_KEY_FRAME_RATE, H264_FRAME_RATE);
286 SetParameter("h264");
287 } else if (videoType == "mpeg4") {
288 trackDesc.PutStringValue(MediaDescriptionKey::MD_KEY_CODEC_MIME, "video/mp4v-es");
289 trackDesc.PutIntValue(MediaDescriptionKey::MD_KEY_WIDTH, MPEG4_WIDTH);
290 trackDesc.PutIntValue(MediaDescriptionKey::MD_KEY_HEIGHT, MPEG4_HEIGHT);
291 trackDesc.PutIntValue(MediaDescriptionKey::MD_KEY_FRAME_RATE, MPEG4_FRAME_RATE);
292 SetParameter("mpeg4");
293 } else {
294 std::cout << "Failed to check video type" << std::endl;
295 return false;
296 }
297 if (avmuxer_->AddTrack(trackDesc, videoTrackId_) != MSERR_OK) {
298 return false;
299 }
300 std::cout << "trackId is: " << videoTrackId_ << std::endl;
301
302 return true;
303 }
304
AddTrackAudio(std::string & audioType)305 bool AVMuxerDemo::AddTrackAudio(std::string &audioType)
306 {
307 MediaDescription trackDesc;
308 if (audioType == "aac") {
309 trackDesc.PutStringValue(MediaDescriptionKey::MD_KEY_CODEC_MIME, "audio/mp4a-latm");
310 trackDesc.PutIntValue(MediaDescriptionKey::MD_KEY_SAMPLE_RATE, AAC_SAMPLE_RATE);
311 trackDesc.PutIntValue(MediaDescriptionKey::MD_KEY_CHANNEL_COUNT, AAC_CHANNEL);
312 SetParameter("aac");
313 } else if (audioType == "mp3") {
314 trackDesc.PutStringValue(MediaDescriptionKey::MD_KEY_CODEC_MIME, "audio/mpeg");
315 trackDesc.PutIntValue(MediaDescriptionKey::MD_KEY_SAMPLE_RATE, MP3_SAMPLE_RATE);
316 trackDesc.PutIntValue(MediaDescriptionKey::MD_KEY_CHANNEL_COUNT, MP3_CHANNEL);
317 SetParameter("mp3");
318 } else {
319 std::cout << "Failed to check audio type" << std::endl;
320 return false;
321 }
322 if (avmuxer_->AddTrack(trackDesc, audioTrackId_) != MSERR_OK) {
323 return false;
324 }
325 std::cout << "trackId is: " << audioTrackId_ << std::endl;
326
327 return true;
328 }
329
SetMode(int32_t mode)330 void AVMuxerDemo::SetMode(int32_t mode)
331 {
332 switch (mode) {
333 case VIDEO_AUDIO_MODE:
334 std::cout << "Please enter video type, note: only support h264 and mpeg4" << std::endl;
335 std::cin >> videoType_;
336 std::cout << "Please enter audio type, note: only support aac and mp3" << std::endl;
337 std::cin >> audioType_;
338 format_ = "mp4";
339 break;
340 case VIDEO_MODE:
341 std::cout << "Please enter video type, note: only support h264 and mpeg4" << std::endl;
342 std::cin >> videoType_;
343 format_ = "mp4";
344 break;
345 case AUDIO_MODE:
346 std::cout << "Please enter audio type, note: only support aac" << std::endl;
347 std::cin >> audioType_;
348 format_ = "m4a";
349 break;
350 default:
351 std::cout << "Failed to check mode" << std::endl;
352 }
353 }
354
DoNext()355 void AVMuxerDemo::DoNext()
356 {
357 std::cout << "Please enter mode, 0: video + audio, 1: video, 2: audio" << std::endl;
358 int32_t mode;
359 std::cin >> mode;
360 SetMode(mode);
361
362 path_ = videoType_ + audioType_ + "." + format_;
363 int32_t fd = open(path_.c_str(), O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);
364 if (fd < 0) {
365 std::cout << "Open file failed! filePath is: " << path_ << std::endl;
366 return;
367 }
368 if (avmuxer_->SetOutput(fd, format_) != MSERR_OK ||
369 avmuxer_->SetLocation(LATITUDE, LONGITUDE) != MSERR_OK ||
370 avmuxer_->SetRotation(ROTATION) != MSERR_OK) {
371 (void)::close(fd);
372 return;
373 }
374
375 if ((mode == VIDEO_AUDIO_MODE && (AddTrackVideo(videoType_) == false ||
376 AddTrackAudio(audioType_) == false)) ||
377 (mode == VIDEO_MODE && (AddTrackVideo(videoType_) == false)) ||
378 (mode == AUDIO_MODE && (AddTrackAudio(audioType_) == false))) {
379 (void)::close(fd);
380 return;
381 }
382
383 if (avmuxer_->Start() != MSERR_OK) {
384 (void)::close(fd);
385 return;
386 }
387 WriteTrackSample();
388
389 if (avmuxer_->Stop() != MSERR_OK) {
390 (void)::close(fd);
391 return;
392 }
393 avmuxer_->Release();
394
395 (void)::close(fd);
396 }
397
RunCase()398 void AVMuxerDemo::RunCase()
399 {
400 avmuxer_ = OHOS::Media::AVMuxerFactory::CreateAVMuxer();
401 if (avmuxer_ == nullptr) {
402 std::cout << "avmuxer_ is null" << std::endl;
403 return;
404 }
405 DoNext();
406 }
407 } // namespace Media
408 } // namespace OHOS