mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
add flv injecter, add flv codec to librtmp.
This commit is contained in:
parent
99cfbaaad9
commit
608083d42f
13 changed files with 443 additions and 37 deletions
10
trunk/research/librtmp/Makefile
Normal file → Executable file
10
trunk/research/librtmp/Makefile
Normal file → Executable file
|
@ -3,7 +3,7 @@ GCC = gcc
|
|||
ifeq ($(HANDSHAKE),)
|
||||
ST_ALL = help
|
||||
else
|
||||
ST_ALL = srs_flv_parser srs_publish srs_play srs_ingest_flv srs_ingest_rtmp
|
||||
ST_ALL = srs_flv_parser srs_flv_injecter srs_publish srs_play srs_ingest_flv srs_ingest_rtmp
|
||||
endif
|
||||
|
||||
.PHONY: default clean help ssl nossl
|
||||
|
@ -11,12 +11,13 @@ endif
|
|||
default: $(ST_ALL)
|
||||
|
||||
help:
|
||||
@echo "Usage: make <help>|<clean>|<srs_flv_parser>|<srs_publish>|<srs_play>|<srs_ingest_flv>|<srs_ingest_rtmp>"
|
||||
@echo "Usage: make <help>|<clean>|<srs_flv_parser>|<srs_flv_injecter>|<srs_publish>|<srs_play>|<srs_ingest_flv>|<srs_ingest_rtmp>"
|
||||
@echo " help display this help"
|
||||
@echo " clean cleanup build"
|
||||
@echo " ssl all tools link ssl"
|
||||
@echo " nossl all tools never link ssl"
|
||||
@echo " srs_flv_parser parse flv file, print detail info."
|
||||
@echo " srs_flv_injecter inject keyframes information to metadata."
|
||||
@echo " srs_publish publish program using srs-librtmp"
|
||||
@echo " srs_play play program using srs-librtmp"
|
||||
@echo " srs_ingest_flv ingest flv file and publish to RTMP server."
|
||||
|
@ -29,7 +30,7 @@ help:
|
|||
@echo "Remark: before make this sample, user must make the srs, with/without ssl"
|
||||
|
||||
clean:
|
||||
@rm -f srs_flv_parser srs_publish srs_play srs_ingest_flv srs_ingest_rtmp
|
||||
@rm -f srs_flv_parser srs_flv_injecter srs_publish srs_play srs_ingest_flv srs_ingest_rtmp
|
||||
|
||||
# srs library root
|
||||
SRS_OBJS = ../../objs
|
||||
|
@ -66,6 +67,9 @@ nossl:
|
|||
srs_flv_parser: srs_flv_parser.c $(SRS_RESEARCH_DEPS) $(SRS_LIBRTMP_I) $(SRS_LIBRTMP_L)
|
||||
$(GCC) srs_flv_parser.c $(SRS_LIBRTMP_L) $(SRS_LIBSSL_L) $(EXTRA_CXX_FLAG) -o srs_flv_parser
|
||||
|
||||
srs_flv_injecter: srs_flv_injecter.c $(SRS_RESEARCH_DEPS) $(SRS_LIBRTMP_I) $(SRS_LIBRTMP_L)
|
||||
$(GCC) srs_flv_injecter.c $(SRS_LIBRTMP_L) $(SRS_LIBSSL_L) $(EXTRA_CXX_FLAG) -o srs_flv_injecter
|
||||
|
||||
srs_publish: srs_publish.c $(SRS_RESEARCH_DEPS) $(SRS_LIBRTMP_I) $(SRS_LIBRTMP_L) $(SRS_LIBSSL_L)
|
||||
$(GCC) srs_publish.c $(SRS_LIBRTMP_L) $(SRS_LIBSSL_L) $(EXTRA_CXX_FLAG) -o srs_publish
|
||||
|
||||
|
|
118
trunk/research/librtmp/srs_flv_injecter.c
Normal file
118
trunk/research/librtmp/srs_flv_injecter.c
Normal file
|
@ -0,0 +1,118 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013-2014 winlin
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
/**
|
||||
gcc srs_flv_injecter.c ../../objs/lib/srs_librtmp.a -g -O0 -lstdc++ -o srs_flv_injecter
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "../../objs/include/srs_librtmp.h"
|
||||
#include "srs_research_public.h"
|
||||
#include "srs_flv_codec.h"
|
||||
|
||||
int process(const char* in_flv_file, const char* out_flv_file, srs_flv_t* pic, srs_flv_t* poc);
|
||||
int inject_flv(srs_flv_t ic, srs_flv_t oc);
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
// user options.
|
||||
char* in_flv_file;
|
||||
char* out_flv_file;
|
||||
// flv handler
|
||||
srs_flv_t ic = NULL;
|
||||
srs_flv_t oc = NULL;
|
||||
|
||||
// temp variables.
|
||||
char* tmp_file;
|
||||
|
||||
if (argc <= 2) {
|
||||
printf("inject flv file keyframes to metadata\n"
|
||||
"Usage: %s in_flv_file out_flv_file\n"
|
||||
" in_flv_file input flv file to inject.\n"
|
||||
" out_flv_file the inject output file, can be in_flv_file.\n"
|
||||
"For example:\n"
|
||||
" %s ../../doc/source.200kbps.768x320.flv injected.flv\n",
|
||||
argv[0]);
|
||||
ret = 1;
|
||||
exit(ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
in_flv_file = argv[1];
|
||||
out_flv_file = argv[2];
|
||||
|
||||
tmp_file = (char*)malloc(strlen(out_flv_file) + strlen(".tmp") + 1);
|
||||
|
||||
trace("inject flv file keyframes to metadata.");
|
||||
trace("srs(simple-rtmp-server) client librtmp library.");
|
||||
trace("version: %d.%d.%d", srs_version_major(), srs_version_minor(), srs_version_revision());
|
||||
trace("input: %s", in_flv_file);
|
||||
trace("output: %s", out_flv_file);
|
||||
|
||||
if ((ret = process(in_flv_file, out_flv_file, &ic, &oc)) != 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
srs_flv_close(ic);
|
||||
srs_flv_close(oc);
|
||||
free(tmp_file);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int process(const char* in_flv_file, const char* out_flv_file, srs_flv_t* pic, srs_flv_t* poc)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if ((*pic = srs_flv_open_read(in_flv_file)) == NULL) {
|
||||
ret = 2;
|
||||
trace("open input flv file failed. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if ((*poc = srs_flv_open_write(out_flv_file)) == NULL) {
|
||||
ret = 2;
|
||||
trace("open output flv file failed. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if ((ret = inject_flv(*pic, *poc)) != 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int inject_flv(srs_flv_t ic, srs_flv_t oc)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
return ret;
|
||||
}
|
|
@ -36,7 +36,7 @@ gcc srs_ingest_flv.c ../../objs/lib/srs_librtmp.a -g -O0 -lstdc++ -o srs_ingest_
|
|||
#include "srs_research_public.h"
|
||||
#include "srs_flv_codec.h"
|
||||
|
||||
int parse_flv(int flv_fd);
|
||||
int parse_flv(srs_flv_t flv);
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
int ret = 0;
|
||||
|
@ -44,7 +44,7 @@ int main(int argc, char** argv)
|
|||
// user options.
|
||||
char* in_flv_file;
|
||||
// flv handler
|
||||
int flv_fd;
|
||||
srs_flv_t flv;
|
||||
|
||||
if (argc <= 1) {
|
||||
printf("parse and show flv file detail\n"
|
||||
|
@ -65,15 +65,14 @@ int main(int argc, char** argv)
|
|||
trace("version: %d.%d.%d", srs_version_major(), srs_version_minor(), srs_version_revision());
|
||||
trace("input: %s", in_flv_file);
|
||||
|
||||
flv_fd = open_flv_file(in_flv_file);
|
||||
if (flv_fd <= 0) {
|
||||
if ((flv = srs_flv_open_read(in_flv_file)) == NULL) {
|
||||
ret = 2;
|
||||
trace("open flv file failed. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = parse_flv(flv_fd);
|
||||
close_flv_file(flv_fd);
|
||||
ret = parse_flv(flv);
|
||||
srs_flv_close(flv);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -207,26 +206,30 @@ int parse_video_data(u_int32_t timestamp, char* data, int size, int64_t offset)
|
|||
return ret;
|
||||
}
|
||||
|
||||
int parse_flv(int flv_fd)
|
||||
int parse_flv(srs_flv_t flv)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if ((ret = flv_open_ic(flv_fd)) != 0) {
|
||||
// flv header
|
||||
char header[13];
|
||||
// packet data
|
||||
char type;
|
||||
u_int32_t timestamp = 0;
|
||||
char* data = NULL;
|
||||
int32_t size;
|
||||
int64_t offset = 0;
|
||||
|
||||
if ((ret = srs_flv_read_header(flv, header)) != 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
// packet data
|
||||
int type, size;
|
||||
u_int32_t timestamp = 0;
|
||||
char* data = NULL;
|
||||
int64_t offset = 0;
|
||||
|
||||
trace("start parse flv");
|
||||
for (;;) {
|
||||
offset = lseek(flv_fd, 0, SEEK_CUR);
|
||||
offset = srs_flv_tellg(flv);
|
||||
|
||||
if ((ret = flv_read_packet(flv_fd, &type, ×tamp, &data, &size)) != 0) {
|
||||
if (ret == ERROR_FLV_CODEC_EOF) {
|
||||
// tag header
|
||||
if ((ret = srs_flv_read_tag_header(flv, &type, &size, ×tamp)) != 0) {
|
||||
if (srs_flv_is_eof(ret)) {
|
||||
trace("parse completed.");
|
||||
return 0;
|
||||
}
|
||||
|
@ -234,6 +237,16 @@ int parse_flv(int flv_fd)
|
|||
return ret;
|
||||
}
|
||||
|
||||
if (size <= 0) {
|
||||
trace("invalid size=%d", size);
|
||||
break;
|
||||
}
|
||||
|
||||
data = (char*)malloc(size);
|
||||
if ((ret = srs_flv_read_tag_data(flv, data, size)) != 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
// data tag
|
||||
if (type == SRS_RTMP_TYPE_AUDIO) {
|
||||
if ((ret = parse_audio_data(timestamp, data, size, offset)) != 0) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue