Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

flv-2-mpeg-ps-test.cpp 2.6KB

il y a 10 mois
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include "flv-demuxer.h"
  2. #include "flv-reader.h"
  3. #include "flv-proto.h"
  4. #include "mpeg-ps.h"
  5. #include "sys/system.h"
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <assert.h>
  10. #include <map>
  11. static void* ps_alloc(void* /*param*/, size_t bytes)
  12. {
  13. static char s_buffer[2 * 1024 * 1024];
  14. assert(bytes <= sizeof(s_buffer));
  15. return s_buffer;
  16. }
  17. static void ps_free(void* /*param*/, void* /*packet*/)
  18. {
  19. return;
  20. }
  21. static int ps_write(void* param, int stream, void* packet, size_t bytes)
  22. {
  23. return 1 == fwrite(packet, bytes, 1, (FILE*)param) ? 0 : ferror((FILE*)param);
  24. }
  25. static inline const char* ps_type(int type)
  26. {
  27. switch (type)
  28. {
  29. case FLV_AUDIO_MP3: return "MP3";
  30. case FLV_AUDIO_AAC: return "AAC";
  31. case FLV_VIDEO_H264: return "H264";
  32. case FLV_VIDEO_H265: return "H265";
  33. default: return "*";
  34. }
  35. }
  36. static int flv_ondemux(void* ps, int codec, const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags)
  37. {
  38. printf("[%s] pts: %08lu, dts: %08lu%s\n", ps_type(codec), (unsigned long)pts, (unsigned long)dts, flags ? " [I]" : "");
  39. int i;
  40. static std::map<int, int> streams;
  41. std::map<int, int>::const_iterator it = streams.find(codec);
  42. if (streams.end() == it)
  43. {
  44. switch (codec)
  45. {
  46. case FLV_AUDIO_MP3:
  47. i = ps_muxer_add_stream((ps_muxer_t*)ps, PSI_STREAM_MP3, NULL, 0);
  48. break;
  49. case FLV_AUDIO_ASC:
  50. i = ps_muxer_add_stream((ps_muxer_t*)ps, PSI_STREAM_AAC, NULL, 0);
  51. streams[FLV_AUDIO_AAC] = i;
  52. return 0;
  53. case FLV_VIDEO_AVCC:
  54. i = ps_muxer_add_stream((ps_muxer_t*)ps, PSI_STREAM_H264, NULL, 0);
  55. streams[FLV_VIDEO_H264] = i;
  56. return 0;
  57. case FLV_VIDEO_HVCC:
  58. i = ps_muxer_add_stream((ps_muxer_t*)ps, PSI_STREAM_H265, NULL, 0);
  59. streams[FLV_VIDEO_H265] = i;
  60. return 0;
  61. default: return 0;
  62. }
  63. streams[codec] = i;
  64. }
  65. else
  66. {
  67. i = it->second;
  68. }
  69. return ps_muxer_input((ps_muxer_t*)ps, i, flags ? 0x01 : 0x00, pts * 90, dts * 90, data, bytes);
  70. }
  71. void flv_2_mpeg_ps_test(const char* flv)
  72. {
  73. char output[256] = { 0 };
  74. snprintf(output, sizeof(output) - 1, "%s.ps", flv);
  75. struct ps_muxer_func_t handler;
  76. handler.alloc = ps_alloc;
  77. handler.write = ps_write;
  78. handler.free = ps_free;
  79. FILE* fp = fopen(output, "wb");
  80. ps_muxer_t* ps = ps_muxer_create(&handler, fp);
  81. void* f = flv_reader_create(flv);
  82. flv_demuxer_t* demuxer = flv_demuxer_create(flv_ondemux, ps);
  83. int r, type;
  84. size_t taglen;
  85. uint32_t timestamp;
  86. static uint8_t packet[2 * 1024 * 1024];
  87. while (1 == flv_reader_read(f, &type, &timestamp, &taglen, packet, sizeof(packet)))
  88. {
  89. r = flv_demuxer_input(demuxer, type, packet, taglen, timestamp);
  90. assert(0 == r);
  91. }
  92. flv_demuxer_destroy(demuxer);
  93. flv_reader_destroy(f);
  94. ps_muxer_destroy(ps);
  95. fclose(fp);
  96. }