正在显示
9 个修改的文件
包含
78 行增加
和
10 行删除
| @@ -365,7 +365,7 @@ MODULE_DEPENDS=("CORE") | @@ -365,7 +365,7 @@ MODULE_DEPENDS=("CORE") | ||
| 365 | ModuleLibIncs=(${SRS_OBJS_DIR}) | 365 | ModuleLibIncs=(${SRS_OBJS_DIR}) |
| 366 | MODULE_FILES=("srs_kernel_error" "srs_kernel_log" "srs_kernel_stream" | 366 | MODULE_FILES=("srs_kernel_error" "srs_kernel_log" "srs_kernel_stream" |
| 367 | "srs_kernel_utility" "srs_kernel_flv" "srs_kernel_codec" "srs_kernel_file" | 367 | "srs_kernel_utility" "srs_kernel_flv" "srs_kernel_codec" "srs_kernel_file" |
| 368 | - "srs_kernel_consts" "srs_kernel_aac") | 368 | + "srs_kernel_consts" "srs_kernel_aac" "srs_kernel_mp3") |
| 369 | KERNEL_INCS="src/kernel"; MODULE_DIR=${KERNEL_INCS} . auto/modules.sh | 369 | KERNEL_INCS="src/kernel"; MODULE_DIR=${KERNEL_INCS} . auto/modules.sh |
| 370 | KERNEL_OBJS="${MODULE_OBJS[@]}" | 370 | KERNEL_OBJS="${MODULE_OBJS[@]}" |
| 371 | # | 371 | # |
trunk/doc/mp3.id3v2.3.0.pdf
0 → 100644
不能预览此文件类型
| @@ -63,4 +63,8 @@ http1.1-rfc2616.txt | @@ -63,4 +63,8 @@ http1.1-rfc2616.txt | ||
| 63 | arpa-internet-text-messages-rfc822.txt | 63 | arpa-internet-text-messages-rfc822.txt |
| 64 | http://www.rfc-editor.org/rfc/rfc822.txt | 64 | http://www.rfc-editor.org/rfc/rfc822.txt |
| 65 | 65 | ||
| 66 | +mp3规范: | ||
| 67 | +mp3.id3v2.3.0.pdf | ||
| 68 | + http://id3.org/id3v2.3.0 | ||
| 69 | + | ||
| 66 | Winlin | 70 | Winlin |
| @@ -45,6 +45,7 @@ using namespace std; | @@ -45,6 +45,7 @@ using namespace std; | ||
| 45 | #include <srs_app_source.hpp> | 45 | #include <srs_app_source.hpp> |
| 46 | #include <srs_protocol_msg_array.hpp> | 46 | #include <srs_protocol_msg_array.hpp> |
| 47 | #include <srs_kernel_aac.hpp> | 47 | #include <srs_kernel_aac.hpp> |
| 48 | +#include <srs_kernel_mp3.hpp> | ||
| 48 | 49 | ||
| 49 | SrsVodStream::SrsVodStream(string root_dir) | 50 | SrsVodStream::SrsVodStream(string root_dir) |
| 50 | : SrsGoHttpFileServer(root_dir) | 51 | : SrsGoHttpFileServer(root_dir) |
| @@ -226,6 +227,44 @@ int SrsAacStreamEncoder::write_metadata(int64_t /*timestamp*/, char* /*data*/, i | @@ -226,6 +227,44 @@ int SrsAacStreamEncoder::write_metadata(int64_t /*timestamp*/, char* /*data*/, i | ||
| 226 | return ERROR_SUCCESS; | 227 | return ERROR_SUCCESS; |
| 227 | } | 228 | } |
| 228 | 229 | ||
| 230 | +SrsMp3StreamEncoder::SrsMp3StreamEncoder() | ||
| 231 | +{ | ||
| 232 | + enc = new SrsMp3Encoder(); | ||
| 233 | +} | ||
| 234 | + | ||
| 235 | +SrsMp3StreamEncoder::~SrsMp3StreamEncoder() | ||
| 236 | +{ | ||
| 237 | + srs_freep(enc); | ||
| 238 | +} | ||
| 239 | + | ||
| 240 | +int SrsMp3StreamEncoder::initialize(SrsFileWriter* w) | ||
| 241 | +{ | ||
| 242 | + int ret = ERROR_SUCCESS; | ||
| 243 | + | ||
| 244 | + if ((ret = enc->initialize(w)) != ERROR_SUCCESS) { | ||
| 245 | + return ret; | ||
| 246 | + } | ||
| 247 | + | ||
| 248 | + return ret; | ||
| 249 | +} | ||
| 250 | + | ||
| 251 | +int SrsMp3StreamEncoder::write_audio(int64_t timestamp, char* data, int size) | ||
| 252 | +{ | ||
| 253 | + return enc->write_audio(timestamp, data, size); | ||
| 254 | +} | ||
| 255 | + | ||
| 256 | +int SrsMp3StreamEncoder::write_video(int64_t /*timestamp*/, char* /*data*/, int /*size*/) | ||
| 257 | +{ | ||
| 258 | + // mp3 ignore any flv video. | ||
| 259 | + return ERROR_SUCCESS; | ||
| 260 | +} | ||
| 261 | + | ||
| 262 | +int SrsMp3StreamEncoder::write_metadata(int64_t /*timestamp*/, char* /*data*/, int /*size*/) | ||
| 263 | +{ | ||
| 264 | + // mp3 ignore any flv metadata. | ||
| 265 | + return ERROR_SUCCESS; | ||
| 266 | +} | ||
| 267 | + | ||
| 229 | SrsStreamWriter::SrsStreamWriter(ISrsGoHttpResponseWriter* w) | 268 | SrsStreamWriter::SrsStreamWriter(ISrsGoHttpResponseWriter* w) |
| 230 | { | 269 | { |
| 231 | writer = w; | 270 | writer = w; |
| @@ -279,12 +318,15 @@ int SrsLiveStream::serve_http(ISrsGoHttpResponseWriter* w, SrsHttpMessage* r) | @@ -279,12 +318,15 @@ int SrsLiveStream::serve_http(ISrsGoHttpResponseWriter* w, SrsHttpMessage* r) | ||
| 279 | 318 | ||
| 280 | bool serve_flv_streaming = false; | 319 | bool serve_flv_streaming = false; |
| 281 | bool serve_aac_streaming = false; | 320 | bool serve_aac_streaming = false; |
| 321 | + bool serve_mp3_streaming = false; | ||
| 282 | 322 | ||
| 283 | srs_assert(entry); | 323 | srs_assert(entry); |
| 284 | if (srs_string_ends_with(entry->pattern, ".flv")) { | 324 | if (srs_string_ends_with(entry->pattern, ".flv")) { |
| 285 | serve_flv_streaming = true; | 325 | serve_flv_streaming = true; |
| 286 | } else if (srs_string_ends_with(entry->pattern, ".aac")) { | 326 | } else if (srs_string_ends_with(entry->pattern, ".aac")) { |
| 287 | serve_aac_streaming = true; | 327 | serve_aac_streaming = true; |
| 328 | + } else if (srs_string_ends_with(entry->pattern, ".mp3")) { | ||
| 329 | + serve_mp3_streaming = true; | ||
| 288 | } else { | 330 | } else { |
| 289 | ret = ERROR_HTTP_LIVE_STREAM_EXT; | 331 | ret = ERROR_HTTP_LIVE_STREAM_EXT; |
| 290 | srs_error("http: unsupported pattern %s", entry->pattern.c_str()); | 332 | srs_error("http: unsupported pattern %s", entry->pattern.c_str()); |
| @@ -322,6 +364,9 @@ int SrsLiveStream::serve_http(ISrsGoHttpResponseWriter* w, SrsHttpMessage* r) | @@ -322,6 +364,9 @@ int SrsLiveStream::serve_http(ISrsGoHttpResponseWriter* w, SrsHttpMessage* r) | ||
| 322 | if (serve_aac_streaming) { | 364 | if (serve_aac_streaming) { |
| 323 | enc = new SrsAacStreamEncoder(); | 365 | enc = new SrsAacStreamEncoder(); |
| 324 | } | 366 | } |
| 367 | + if (serve_mp3_streaming) { | ||
| 368 | + enc = new SrsMp3StreamEncoder(); | ||
| 369 | + } | ||
| 325 | SrsAutoFree(ISrsStreamEncoder, enc); | 370 | SrsAutoFree(ISrsStreamEncoder, enc); |
| 326 | 371 | ||
| 327 | if ((ret = enc->initialize(&writer)) != ERROR_SUCCESS) { | 372 | if ((ret = enc->initialize(&writer)) != ERROR_SUCCESS) { |
| @@ -42,6 +42,7 @@ class SrsSource; | @@ -42,6 +42,7 @@ class SrsSource; | ||
| 42 | class SrsRequest; | 42 | class SrsRequest; |
| 43 | class SrsStSocket; | 43 | class SrsStSocket; |
| 44 | class SrsAacEncoder; | 44 | class SrsAacEncoder; |
| 45 | +class SrsMp3Encoder; | ||
| 45 | class SrsFlvEncoder; | 46 | class SrsFlvEncoder; |
| 46 | class SrsHttpParser; | 47 | class SrsHttpParser; |
| 47 | class SrsHttpMessage; | 48 | class SrsHttpMessage; |
| @@ -113,6 +114,23 @@ public: | @@ -113,6 +114,23 @@ public: | ||
| 113 | }; | 114 | }; |
| 114 | 115 | ||
| 115 | /** | 116 | /** |
| 117 | +* the mp3 stream encoder, remux rtmp stream to mp3 stream. | ||
| 118 | +*/ | ||
| 119 | +class SrsMp3StreamEncoder : public ISrsStreamEncoder | ||
| 120 | +{ | ||
| 121 | +private: | ||
| 122 | + SrsMp3Encoder* enc; | ||
| 123 | +public: | ||
| 124 | + SrsMp3StreamEncoder(); | ||
| 125 | + virtual ~SrsMp3StreamEncoder(); | ||
| 126 | +public: | ||
| 127 | + virtual int initialize(SrsFileWriter* w); | ||
| 128 | + virtual int write_audio(int64_t timestamp, char* data, int size); | ||
| 129 | + virtual int write_video(int64_t timestamp, char* data, int size); | ||
| 130 | + virtual int write_metadata(int64_t timestamp, char* data, int size); | ||
| 131 | +}; | ||
| 132 | + | ||
| 133 | +/** | ||
| 116 | * write stream to http response direclty. | 134 | * write stream to http response direclty. |
| 117 | */ | 135 | */ |
| 118 | class SrsStreamWriter : public SrsFileWriter | 136 | class SrsStreamWriter : public SrsFileWriter |
| @@ -38,9 +38,6 @@ using namespace std; | @@ -38,9 +38,6 @@ using namespace std; | ||
| 38 | #include <srs_kernel_file.hpp> | 38 | #include <srs_kernel_file.hpp> |
| 39 | #include <srs_kernel_codec.hpp> | 39 | #include <srs_kernel_codec.hpp> |
| 40 | 40 | ||
| 41 | -#define SRS_FLV_TAG_HEADER_SIZE 11 | ||
| 42 | -#define SRS_FLV_PREVIOUS_TAG_SIZE 4 | ||
| 43 | - | ||
| 44 | SrsAacEncoder::SrsAacEncoder() | 41 | SrsAacEncoder::SrsAacEncoder() |
| 45 | { | 42 | { |
| 46 | _fs = NULL; | 43 | _fs = NULL; |
| @@ -36,7 +36,7 @@ class SrsFileWriter; | @@ -36,7 +36,7 @@ class SrsFileWriter; | ||
| 36 | class SrsFileReader; | 36 | class SrsFileReader; |
| 37 | 37 | ||
| 38 | /** | 38 | /** |
| 39 | -* encode data to flv file. | 39 | +* encode data to aac file. |
| 40 | */ | 40 | */ |
| 41 | class SrsAacEncoder | 41 | class SrsAacEncoder |
| 42 | { | 42 | { |
| @@ -55,8 +55,8 @@ public: | @@ -55,8 +55,8 @@ public: | ||
| 55 | public: | 55 | public: |
| 56 | /** | 56 | /** |
| 57 | * initialize the underlayer file stream. | 57 | * initialize the underlayer file stream. |
| 58 | - * @remark user can initialize multiple times to encode multiple flv files. | ||
| 59 | - * @remark, user must free the fs, flv encoder never close/free it. | 58 | + * @remark user can initialize multiple times to encode multiple aac files. |
| 59 | + * @remark, user must free the fs, aac encoder never close/free it. | ||
| 60 | */ | 60 | */ |
| 61 | virtual int initialize(SrsFileWriter* fs); | 61 | virtual int initialize(SrsFileWriter* fs); |
| 62 | public: | 62 | public: |
| @@ -202,9 +202,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -202,9 +202,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
| 202 | #define ERROR_AAC_REQUIRED_ADTS 3046 | 202 | #define ERROR_AAC_REQUIRED_ADTS 3046 |
| 203 | #define ERROR_AAC_ADTS_HEADER 3047 | 203 | #define ERROR_AAC_ADTS_HEADER 3047 |
| 204 | #define ERROR_AAC_DATA_INVALID 3048 | 204 | #define ERROR_AAC_DATA_INVALID 3048 |
| 205 | -#define ERROR_HTTP_STATUS_INVLIAD 3049 | ||
| 206 | -#define ERROR_KERNEL_AAC_STREAM_CLOSED 3050 | ||
| 207 | -#define ERROR_AAC_DECODE_ERROR 3051 | ||
| 208 | 205 | ||
| 209 | /////////////////////////////////////////////////////// | 206 | /////////////////////////////////////////////////////// |
| 210 | // HTTP protocol error. | 207 | // HTTP protocol error. |
| @@ -214,6 +211,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -214,6 +211,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
| 214 | #define ERROR_HTTP_URL_NOT_CLEAN 4002 | 211 | #define ERROR_HTTP_URL_NOT_CLEAN 4002 |
| 215 | #define ERROR_HTTP_CONTENT_LENGTH 4003 | 212 | #define ERROR_HTTP_CONTENT_LENGTH 4003 |
| 216 | #define ERROR_HTTP_LIVE_STREAM_EXT 4004 | 213 | #define ERROR_HTTP_LIVE_STREAM_EXT 4004 |
| 214 | +#define ERROR_HTTP_STATUS_INVLIAD 4005 | ||
| 215 | +#define ERROR_KERNEL_AAC_STREAM_CLOSED 4006 | ||
| 216 | +#define ERROR_AAC_DECODE_ERROR 4007 | ||
| 217 | +#define ERROR_KERNEL_MP3_STREAM_CLOSED 4008 | ||
| 218 | +#define ERROR_MP3_DECODE_ERROR 4009 | ||
| 217 | 219 | ||
| 218 | /** | 220 | /** |
| 219 | * whether the error code is an system control error. | 221 | * whether the error code is an system control error. |
| @@ -32,6 +32,8 @@ file | @@ -32,6 +32,8 @@ file | ||
| 32 | ..\kernel\srs_kernel_flv.cpp, | 32 | ..\kernel\srs_kernel_flv.cpp, |
| 33 | ..\kernel\srs_kernel_log.hpp, | 33 | ..\kernel\srs_kernel_log.hpp, |
| 34 | ..\kernel\srs_kernel_log.cpp, | 34 | ..\kernel\srs_kernel_log.cpp, |
| 35 | + ..\kernel\srs_kernel_mp3.hpp, | ||
| 36 | + ..\kernel\srs_kernel_mp3.cpp, | ||
| 35 | ..\kernel\srs_kernel_stream.hpp, | 37 | ..\kernel\srs_kernel_stream.hpp, |
| 36 | ..\kernel\srs_kernel_stream.cpp, | 38 | ..\kernel\srs_kernel_stream.cpp, |
| 37 | ..\kernel\srs_kernel_utility.hpp, | 39 | ..\kernel\srs_kernel_utility.hpp, |
-
请 注册 或 登录 后发表评论