Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

82 строки
2.0KB

  1. #include "fmp4-writer.h"
  2. #include "mov-format.h"
  3. #include "mpeg4-aac.h"
  4. #include "flv-proto.h"
  5. #include "flv-reader.h"
  6. #include "flv-parser.h"
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <assert.h>
  10. extern "C" const struct mov_buffer_t* mov_file_buffer(void);
  11. static uint8_t s_buffer[2 * 1024 * 1024];
  12. static int s_width, s_height;
  13. static int onFLV(void* param, int codec, const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags)
  14. {
  15. fmp4_writer_t* mov = (fmp4_writer_t*)param;
  16. static int s_aac_track = -1;
  17. static int s_avc_track = -1;
  18. switch (codec)
  19. {
  20. case FLV_AUDIO_AAC:
  21. return fmp4_writer_write(mov, s_aac_track, data, bytes, pts, dts, 1 == flags ? MOV_AV_FLAG_KEYFREAME : 0);
  22. case FLV_AUDIO_MP3:
  23. assert(0);
  24. break;
  25. case FLV_VIDEO_H264:
  26. return fmp4_writer_write(mov, s_avc_track, data, bytes, pts, dts, flags);
  27. case FLV_VIDEO_AVCC:
  28. if (-1 == s_avc_track)
  29. {
  30. s_avc_track = fmp4_writer_add_video(mov, MOV_OBJECT_H264, s_width, s_height, data, bytes);
  31. }
  32. break;
  33. case FLV_AUDIO_ASC:
  34. if (-1 == s_aac_track)
  35. {
  36. struct mpeg4_aac_t aac;
  37. mpeg4_aac_audio_specific_config_load((const uint8_t*)data, bytes, &aac);
  38. int rate = mpeg4_aac_audio_frequency_to((enum mpeg4_aac_frequency)aac.sampling_frequency_index);
  39. s_aac_track = fmp4_writer_add_audio(mov, MOV_OBJECT_AAC, aac.channel_configuration, 16, rate, data, bytes);
  40. }
  41. break;
  42. default:
  43. // nothing to do
  44. //assert(0);
  45. break;
  46. }
  47. printf("\n");
  48. return 0;
  49. }
  50. void fmp4_writer_test(int w, int h, const char* inflv, const char* outmp4)
  51. {
  52. int r, type;
  53. size_t taglen;
  54. uint32_t timestamp;
  55. FILE* fp = fopen(outmp4, "wb+");
  56. void* flv = flv_reader_create(inflv);
  57. fmp4_writer_t* mov = fmp4_writer_create(mov_file_buffer(), fp, 0);
  58. s_width = w;
  59. s_height = h;
  60. while (1 == flv_reader_read(flv, &type, &timestamp, &taglen, s_buffer, sizeof(s_buffer)))
  61. {
  62. r = flv_parser_tag(type, s_buffer, taglen, timestamp, onFLV, mov);
  63. assert(r >= 0);
  64. }
  65. fmp4_writer_destroy(mov);
  66. flv_reader_destroy(flv);
  67. fclose(fp);
  68. }