Toggle navigation
Toggle navigation
此项目
正在载入...
Sign in
胡斌
/
srs
转到一个项目
Toggle navigation
项目
群组
代码片段
帮助
Toggle navigation pinning
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
winlin
2013-11-22 21:20:24 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
08d745f1cf63b0425432a5cf45129adf17a3d3e9
08d745f1
1 parent
21b962e9
remove the flv muxer
显示空白字符变更
内嵌
并排对比
正在显示
1 个修改的文件
包含
9 行增加
和
185 行删除
trunk/research/ts_info.cpp
trunk/research/ts_info.cpp
查看文件 @
08d745f
...
...
@@ -1958,152 +1958,6 @@ public:
}
};
class
FlvMuxer
{
public
:
int
fd
;
const
char
*
file
;
bool
audio_sequence_header_writen
;
FlvMuxer
()
{
file
=
NULL
;
fd
=
0
;
audio_sequence_header_writen
=
false
;
}
virtual
~
FlvMuxer
()
{
if
(
fd
>
0
)
{
close
(
fd
);
}
}
int
open
(
const
char
*
_file
)
{
file
=
_file
;
if
((
fd
=
::
open
(
file
,
O_CREAT
|
O_WRONLY
|
O_TRUNC
,
S_IRUSR
|
S_IWUSR
|
S_IRGRP
|
S_IWGRP
|
S_IROTH
))
<
0
)
{
return
-
1
;
}
char
header
[]
=
{
0x46
,
0x4c
,
0x56
,
// FLV
0x01
,
// version: 01
0x04
,
// 0x05:audio+video, 0x01:video, 0x04:audio
0x00
,
0x00
,
0x00
,
0x09
,
// offset: always 0x09
0x00
,
0x00
,
0x00
,
0x00
// previous tag 0: always 0
};
if
(
write
(
fd
,
header
,
sizeof
(
header
))
!=
sizeof
(
header
))
{
return
-
1
;
}
return
0
;
}
/**
* @param size, if 0 for sequence header.
* @param sound_rate, Sampling rate. The following values are defined:
* 0 = 5.5 kHz
* 1 = 11 kHz
* 2 = 22 kHz
* 3 = 44 kHz
* @param sound_type, Mono or stereo sound
* 0 = Mono sound
* 1 = Stereo sound
*/
int
write_audio
(
char
*
data
,
int
size
,
u_int32_t
timestamp
,
int
sound_rate
,
int
sound_type
)
{
if
(
size
>
0
&&
!
audio_sequence_header_writen
)
{
audio_sequence_header_writen
=
true
;
if
(
write_audio
(
NULL
,
0
,
0
,
sound_rate
,
sound_type
)
!=
0
)
{
return
-
1
;
}
}
char
tag_header
[
11
];
char
sequence_header
[
2
];
// aac only
int
data_size
=
size
+
sizeof
(
sequence_header
);
int
tag_size
=
data_size
+
sizeof
(
tag_header
);
////////////////////////////////////
// 11bytes tag header.
////////////////////////////////////
// TagType
char
*
p
=
tag_header
;
*
p
++
=
0x08
;
// audio
// DataSize
char
*
pp
=
(
char
*
)
&
data_size
;
*
p
++
=
pp
[
2
];
*
p
++
=
pp
[
1
];
*
p
++
=
pp
[
0
];
// Timestamp
pp
=
(
char
*
)
&
timestamp
;
*
p
++
=
pp
[
2
];
*
p
++
=
pp
[
1
];
*
p
++
=
pp
[
0
];
// TimestampExtended
*
p
++
=
pp
[
3
];
//StreamID
*
p
++
=
0
;
*
p
++
=
0
;
*
p
++
=
0
;
////////////////////////////////////
// 2bytes codec header for aac
////////////////////////////////////
// SoundFormat
sequence_header
[
0
]
=
0xa0
;
// aac
sequence_header
[
0
]
|=
(
sound_rate
<<
2
)
&
0x0c
;
sequence_header
[
0
]
|=
0x02
;
// Compressed formats always decode to 16 bits internally.
sequence_header
[
0
]
|=
sound_type
&
0x01
;
// AACPacketType
if
(
size
==
0
)
{
sequence_header
[
1
]
=
0x00
;
}
else
{
sequence_header
[
1
]
=
0x01
;
}
////////////////////////////////////
// 4bytes tag size
////////////////////////////////////
char
tag_size_bytes
[
4
];
p
=
tag_size_bytes
;
pp
=
(
char
*
)
&
tag_size
;
*
p
++
=
pp
[
4
];
*
p
++
=
pp
[
2
];
*
p
++
=
pp
[
1
];
*
p
++
=
pp
[
0
];
// write
if
(
write
(
fd
,
tag_header
,
sizeof
(
tag_header
))
!=
sizeof
(
tag_header
))
{
return
-
1
;
}
if
(
write
(
fd
,
sequence_header
,
sizeof
(
sequence_header
))
!=
sizeof
(
sequence_header
))
{
return
-
1
;
}
if
(
size
>
0
&&
write
(
fd
,
data
,
size
)
!=
size
)
{
return
-
1
;
}
if
(
write
(
fd
,
tag_size_bytes
,
sizeof
(
tag_size_bytes
))
!=
sizeof
(
tag_size_bytes
))
{
return
-
1
;
}
return
0
;
}
int
write_video
(
char
*
data
,
int
size
)
{
return
0
;
}
};
class
AacMuxer
{
public
:
...
...
@@ -2150,7 +2004,7 @@ public:
}
};
int
consume
(
TSMessage
*
msg
,
FlvMuxer
*
flv
,
AacMuxer
*
aac_muxer
)
int
consume
(
TSMessage
*
msg
,
AacMuxer
*
aac_muxer
)
{
int
ret
=
0
;
...
...
@@ -2176,35 +2030,7 @@ int consume(TSMessage* msg, FlvMuxer* flv, AacMuxer* aac_muxer)
}
trace
(
"ts+aac audio raw data parsed, size: %d, 0x%02x 0x%02x 0x%02x 0x%02x"
,
aac
.
size
,
aac
.
at
(
0
),
aac
.
at
(
1
),
aac
.
at
(
2
),
aac
.
at
(
3
));
int
sound_rate
=
0
;
if
(
aac
.
sampling_frequency_index
==
TSAacSampleFrequency22050
)
{
sound_rate
=
0x02
;
}
else
if
(
aac
.
sampling_frequency_index
==
TSAacSampleFrequency44100
)
{
sound_rate
=
0x03
;
}
else
{
// 0 = 5.5 kHz
// 1 = 11 kHz
// others.
trace
(
"ts+aac flv donot support sample-rate: %d"
,
aac
.
sampling_frequency_index
);
return
-
1
;
}
int
sound_type
=
0
;
if
(
aac
.
channel_configuration
==
1
)
{
// 0 = Mono sound
sound_type
=
0
;
}
else
if
(
aac
.
channel_configuration
==
2
)
{
// 1 = Stereo sound
sound_type
=
1
;
}
else
{
trace
(
"ts+aac flv donot support channel: %d"
,
aac
.
channel_configuration
);
return
-
1
;
}
if
(
flv
&&
(
ret
=
flv
->
write_audio
((
char
*
)
aac
.
raw_data
,
aac
.
size
,
msg
->
pts
,
sound_rate
,
sound_type
))
!=
0
)
{
return
ret
;
}
// TODO: process audio.
}
}
else
{
// parse H264 video.
...
...
@@ -2222,21 +2048,19 @@ int consume(TSMessage* msg, FlvMuxer* flv, AacMuxer* aac_muxer)
return
ret
;
}
int
main
(
int
/*argc*/
,
char
**
/*argv*/
)
int
main
(
int
argc
,
char
**
argv
)
{
const
char
*
file
=
"livestream-1347.ts"
;
const
char
*
output_flv_file
=
"livestream.flv"
;
const
char
*
output_aac_file
=
"livestream.aac"
;
const
char
*
output_aac_file
=
"output.aac"
;
if
(
argc
>
2
)
{
file
=
argv
[
1
];
output_aac_file
=
argv
[
2
];
}
int
fd
=
open
(
file
,
O_RDONLY
);
FlvMuxer
flv
;
AacMuxer
aac_muxer
;
int
ret
=
0
;
if
((
ret
=
flv
.
open
(
output_flv_file
))
!=
0
)
{
trace
(
"flv+open open flv file failed."
);
return
ret
;
}
if
((
ret
=
aac_muxer
.
open
(
output_aac_file
))
!=
0
)
{
trace
(
"aac_muxer+open open flv file failed."
);
return
ret
;
...
...
@@ -2280,7 +2104,7 @@ int main(int /*argc*/, char** /*argv*/)
continue
;
}
if
((
ret
=
consume
(
msg
,
&
flv
,
&
aac_muxer
))
!=
0
)
{
if
((
ret
=
consume
(
msg
,
&
aac_muxer
))
!=
0
)
{
trace
(
"demuxer+consume parse and consume message failed. ret=%d"
,
ret
);
break
;
}
...
...
请
注册
或
登录
后发表评论