ffmpeg.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #ifndef __FFMPEG_H
  2. #define __FFMPEG_H
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #ifdef _WIN32
  7. #include <windows.h>
  8. #endif
  9. // 先包含头文件获取类型定义
  10. #include <libavformat/avformat.h>
  11. #include <libavcodec/avcodec.h>
  12. #include <libswresample/swresample.h>
  13. #ifdef LUAT_USE_GUI
  14. #define SDL_MAIN_HANDLED
  15. #include <SDL2/SDL.h>
  16. #endif
  17. #ifdef _WIN32
  18. // FFmpeg DLL句柄(声明为extern,在ffmpeg.c中定义)
  19. extern HMODULE h_avutil;
  20. extern HMODULE h_avcodec;
  21. extern HMODULE h_avformat;
  22. extern HMODULE h_swresample;
  23. // 定义函数指针类型
  24. typedef int (*av_find_best_stream_t)(AVFormatContext*, enum AVMediaType, int, int, const AVCodec**, int);
  25. typedef int (*avformat_open_input_t)(AVFormatContext**, const char*, const AVInputFormat*, AVDictionary**);
  26. typedef int (*avformat_find_stream_info_t)(AVFormatContext*, AVDictionary**);
  27. typedef void (*avformat_close_input_t)(AVFormatContext**);
  28. typedef int (*av_read_frame_t)(AVFormatContext*, AVPacket*);
  29. typedef const AVCodec* (*avcodec_find_decoder_t)(enum AVCodecID);
  30. typedef AVCodecContext* (*avcodec_alloc_context3_t)(const AVCodec*);
  31. typedef void (*avcodec_free_context_t)(AVCodecContext**);
  32. typedef int (*avcodec_parameters_to_context_t)(AVCodecContext*, const AVCodecParameters*);
  33. typedef int (*avcodec_open2_t)(AVCodecContext*, const AVCodec*, AVDictionary**);
  34. typedef int (*avcodec_send_packet_t)(AVCodecContext*, const AVPacket*);
  35. typedef int (*avcodec_receive_frame_t)(AVCodecContext*, AVFrame*);
  36. typedef const char* (*av_get_media_type_string_t)(enum AVMediaType);
  37. typedef uint64_t (*av_get_default_channel_layout_t)(int);
  38. typedef AVFrame* (*av_frame_alloc_t)(void);
  39. typedef void (*av_frame_free_t)(AVFrame**);
  40. typedef AVPacket* (*av_packet_alloc_t)(void);
  41. typedef void (*av_packet_free_t)(AVPacket**);
  42. typedef void (*av_packet_unref_t)(AVPacket*);
  43. typedef int (*av_samples_alloc_t)(uint8_t**, int*, int, int, enum AVSampleFormat, int);
  44. typedef void (*av_freep_t)(void*);
  45. typedef int64_t (*av_rescale_rnd_t)(int64_t, int64_t, int64_t, enum AVRounding);
  46. typedef int (*av_get_bytes_per_sample_t)(enum AVSampleFormat);
  47. typedef void (*av_log_set_level_t)(int);
  48. typedef struct SwrContext* (*swr_alloc_set_opts_t)(struct SwrContext*, int64_t, enum AVSampleFormat, int, int64_t, enum AVSampleFormat, int, int, void*);
  49. typedef int (*swr_init_t)(struct SwrContext*);
  50. typedef void (*swr_free_t)(struct SwrContext**);
  51. typedef int (*swr_convert_t)(struct SwrContext*, uint8_t**, int, const uint8_t**, int);
  52. typedef int64_t (*swr_get_delay_t)(struct SwrContext*, int64_t);
  53. // 函数指针变量(声明为extern,在ffmpeg.c中定义)
  54. extern av_find_best_stream_t p_av_find_best_stream;
  55. extern avformat_open_input_t p_avformat_open_input;
  56. extern avformat_find_stream_info_t p_avformat_find_stream_info;
  57. extern avformat_close_input_t p_avformat_close_input;
  58. extern av_read_frame_t p_av_read_frame;
  59. extern avcodec_find_decoder_t p_avcodec_find_decoder;
  60. extern avcodec_alloc_context3_t p_avcodec_alloc_context3;
  61. extern avcodec_free_context_t p_avcodec_free_context;
  62. extern avcodec_parameters_to_context_t p_avcodec_parameters_to_context;
  63. extern avcodec_open2_t p_avcodec_open2;
  64. extern avcodec_send_packet_t p_avcodec_send_packet;
  65. extern avcodec_receive_frame_t p_avcodec_receive_frame;
  66. extern av_get_media_type_string_t p_av_get_media_type_string;
  67. extern av_get_default_channel_layout_t p_av_get_default_channel_layout;
  68. extern av_frame_alloc_t p_av_frame_alloc;
  69. extern av_frame_free_t p_av_frame_free;
  70. extern av_packet_alloc_t p_av_packet_alloc;
  71. extern av_packet_free_t p_av_packet_free;
  72. extern av_packet_unref_t p_av_packet_unref;
  73. extern av_samples_alloc_t p_av_samples_alloc;
  74. extern av_freep_t p_av_freep;
  75. extern av_rescale_rnd_t p_av_rescale_rnd;
  76. extern av_get_bytes_per_sample_t p_av_get_bytes_per_sample;
  77. extern av_log_set_level_t p_av_log_set_level;
  78. extern swr_alloc_set_opts_t p_swr_alloc_set_opts;
  79. extern swr_init_t p_swr_init;
  80. extern swr_free_t p_swr_free;
  81. extern swr_convert_t p_swr_convert;
  82. extern swr_get_delay_t p_swr_get_delay;
  83. // 宏定义名字,便于调用函数
  84. #define av_find_best_stream p_av_find_best_stream
  85. #define avformat_open_input p_avformat_open_input
  86. #define avformat_find_stream_info p_avformat_find_stream_info
  87. #define avformat_close_input p_avformat_close_input
  88. #define av_read_frame p_av_read_frame
  89. #define avcodec_find_decoder p_avcodec_find_decoder
  90. #define avcodec_alloc_context3 p_avcodec_alloc_context3
  91. #define avcodec_free_context p_avcodec_free_context
  92. #define avcodec_parameters_to_context p_avcodec_parameters_to_context
  93. #define avcodec_open2 p_avcodec_open2
  94. #define avcodec_send_packet p_avcodec_send_packet
  95. #define avcodec_receive_frame p_avcodec_receive_frame
  96. #define av_get_media_type_string p_av_get_media_type_string
  97. #define av_get_default_channel_layout p_av_get_default_channel_layout
  98. #define av_frame_alloc p_av_frame_alloc
  99. #define av_frame_free p_av_frame_free
  100. #define av_packet_alloc p_av_packet_alloc
  101. #define av_packet_free p_av_packet_free
  102. #define av_packet_unref p_av_packet_unref
  103. #define av_samples_alloc p_av_samples_alloc
  104. #define av_freep p_av_freep
  105. #define av_rescale_rnd p_av_rescale_rnd
  106. #define av_get_bytes_per_sample p_av_get_bytes_per_sample
  107. #define av_log_set_level p_av_log_set_level
  108. #define swr_alloc_set_opts p_swr_alloc_set_opts
  109. #define swr_init p_swr_init
  110. #define swr_free p_swr_free
  111. #define swr_convert p_swr_convert
  112. #define swr_get_delay p_swr_get_delay
  113. #endif
  114. // 显式加载FFmpeg DLL
  115. int luat_load_ffmpeg_dlls(void);
  116. // 卸载FFmpeg DLL
  117. void luat_unload_ffmpeg_dlls(void);
  118. // 播放文件
  119. int luat_ffmpeg_play_file(const char *path);
  120. // 日志是否输出
  121. void luat_ffmpeg_set_debug(int level);
  122. #endif