Still trying

This commit is contained in:
Unknown 2018-02-16 16:16:24 +10:30
parent a38b86236c
commit 182cfeef88
12 changed files with 110704 additions and 14 deletions

View File

@ -19,6 +19,7 @@ const (
InterFrameType = 2
H264 = 7
AVCNALU = 1
SequenceHeader = 0
DataHeaderLength = 5
NoTimestampExtension = 0
AACAudioFormat = 10

View File

@ -91,12 +91,80 @@ func (g *flvGenerator) ResetTimestamp() {
g.currentTimestamp = 0
}
func isKeyFrame(frame []byte) bool {
byteChannel := make(chan byte, len(frame))
for i := range frame {
byteChannel <- frame[i]
}
for len(byteChannel) >= 5{
aByte := <-byteChannel
for i:=1; aByte == 0x00 && i != 4; i++ {
aByte = <-byteChannel
if ( aByte == 0x01 && i == 2 ) || ( aByte == 0x01 && i == 3 ) {
aByte = <-byteChannel
nalType := aByte & 0x1F
switch nalType {
case 1:
return false
case 5:
return true
case 6:
return true
}
}
}
}
return false
}
func isSequenceHeader(frame []byte) bool {
byteChannel := make(chan byte, len(frame))
for i := range frame {
byteChannel <- frame[i]
}
for len(byteChannel) >= 5{
aByte := <-byteChannel
for i:=1; aByte == 0x00 && i != 4; i++ {
aByte = <-byteChannel
if ( aByte == 0x01 && i == 2 ) || ( aByte == 0x01 && i == 3 ) {
aByte = <-byteChannel
nalType := aByte & 0x1F
switch nalType {
case 1:
return false
case 5:
return false
case 6:
return true
case 7:
return true
case 8:
return true
}
}
}
}
return false
}
func (g *flvGenerator) generate() {
g.GenHeader()
for {
select {
case videoFrame := <-g.inputChan:
nalType :=
var frameType byte
if isKeyFrame(videoFrame) {
frameType = flv.KeyFrameType
} else {
frameType = flv.InterFrameType
}
var packetType byte
if isSequenceHeader(videoFrame){
packetType = flv.SequenceHeader
} else {
packetType = flv.AVCNALU
}
timeStamp := g.getNextTimestamp()
videoTag := flv.VideoTag{
PrevTagSize: uint32(g.lastTagSize),
@ -104,9 +172,9 @@ func (g *flvGenerator) generate() {
DataSize: uint32(len(videoFrame)) + flv.DataHeaderLength,
Timestamp: timeStamp,
TimestampExtended: flv.NoTimestampExtension,
FrameType: flv.InterFrameType,
FrameType: frameType,
Codec: flv.H264,
PacketType: flv.AVCNALU,
PacketType: packetType,
CompositionTime: 0,
Data: videoFrame,
}
@ -125,20 +193,20 @@ func (g *flvGenerator) generate() {
audioTag := flv.AudioTag{
PrevTagSize: uint32(g.lastTagSize),
TagType: uint8(flv.AudioTagType),
DataSize: 1 + 10,
DataSize: 7,
Timestamp: timeStamp,
TimestampExtended: flv.NoTimestampExtension,
SoundFormat: flv.AACAudioFormat,
SoundRate: 0,
SoundSize: false,
SoundType: false,
Data: soundData,
SoundRate: 3,
SoundSize: true,
SoundType: true,
Data: []byte{0x00,0x12,0x08,0x56,0xe5,0x00},
}
audioTagAsByteSlice := audioTag.ToByteSlice()
g.lastTagSize = len(audioTagAsByteSlice)
g.outputChan<-audioTagAsByteSlice
time.Sleep(40*time.Millisecond)
time.Sleep(60*time.Millisecond)
}
}
}

View File

@ -1,3 +1,30 @@
/*
NAME
RtpToTsConverter.go - provides utilities for the conversion of Rtp packets
to equivalent MpegTs packets.
DESCRIPTION
See Readme.md
AUTHOR
Saxon Nelson-Milton <saxon.milton@gmail.com>
LICENSE
RtpToTsConverter.go is Copyright (C) 2017 the Australian Ocean Lab (AusOcean)
It is free software: you can redistribute it and/or modify them
under the terms of the GNU General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your
option) any later version.
It is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with revid in gpl.txt. If not, see [GNU licenses](http://www.gnu.org/licenses).
*/
package parser
import (
@ -62,7 +89,7 @@ func (p *h264Parser)parse() {
}
aByte = <-p.inputChan
outputBuffer = append(outputBuffer, aByte)
if nalType := aByte & 0x1F; nalType == 1 || nalType == 5 {
if nalType := aByte & 0x1F; nalType == 1 || nalType == 5 || nalType == 8{
searchingForEnd = true
}
}

BIN
revid/betterInput.h264 Normal file

Binary file not shown.

77410
revid/hexdumpFfmpeg.txt Normal file

File diff suppressed because it is too large Load Diff

33183
revid/hexdumpSaxon.txt Normal file

File diff suppressed because it is too large Load Diff

View File

@ -127,10 +127,10 @@ func TestRtmpOutput(t *testing.T){
func TestFlvOutputFile(t *testing.T) {
config := Config{
Input: File,
InputFileName: "testInput.h264",
InputFileName: "betterInput.h264",
InputCodec: H264,
Output: File,
OutputFileName: "pls.flv",
OutputFileName: "saxonOut.flv",
Packetization: Flv,
FrameRate: "25",
}
@ -147,11 +147,12 @@ func TestFlvOutputFile(t *testing.T) {
// Test h264 inputfile to flv format into rtmp using librtmp c wrapper
func TestRtmpOutputUsingLibRtmp(t *testing.T){
config := Config{
Input: File,
InputFileName: "testInput.h264",
InputFileName: "betterInput.h264",
InputCodec: H264,
Output: Rtmp,
RtmpMethod: LibRtmp,

BIN
revid/saxonOut.flv Normal file

Binary file not shown.

Binary file not shown.

View File

@ -10,7 +10,7 @@ package rtmp
import "C"
const (
inputFile = "pls.flv"
inputFile = "saxonOut.flv"
outputUrl = "rtmp://a.rtmp.youtube.com/live2/w44c-mkuu-aezg-ceb1"
)

Binary file not shown.

BIN
rtmp/saxonOut.flv Normal file

Binary file not shown.