Working video and audio
This commit is contained in:
parent
be0038711d
commit
8d8c23e194
3 changed files with 244 additions and 40 deletions
|
@ -10,6 +10,15 @@
|
|||
#include "../../lib/ts_packet.h" //TS support
|
||||
#include "../../lib/dtsc.h" //DTSC support
|
||||
|
||||
std::string GetAudioHeader( int FrameLen ) {
|
||||
char StandardHeader[7] = {0xFF,0xF1,0x4C,0x80,0x00,0x1F,0xFC};
|
||||
FrameLen += 7;
|
||||
StandardHeader[3] = ( StandardHeader[3] & 0xFC ) + ( ( FrameLen & 0x00001800 ) >> 11 );
|
||||
StandardHeader[4] = ( ( FrameLen & 0x000007F8 ) >> 3 );
|
||||
StandardHeader[5] = ( StandardHeader[5] & 0x3F ) + ( ( FrameLen & 0x00000007 ) << 5 );
|
||||
return std::string(StandardHeader,7);
|
||||
}
|
||||
|
||||
int main( ) {
|
||||
char ShortNALUHeader[3] = {0x00,0x00,0x01};
|
||||
char NALUHeader[4] = {0x00,0x00,0x00,0x01};
|
||||
|
@ -21,6 +30,8 @@ int main( ) {
|
|||
0x5E,0xF7,0xC0,0x40,
|
||||
0x00,0x00,0x00,0x01,
|
||||
0x28,0xCE,0x09,0xC8};
|
||||
char AudioHeader_01[7] = {0xFF,0xF1,0x4C,0x80,0x01,0xDF,0xFC};
|
||||
char AudioHeader_45[7] = {0xFF,0xF1,0x4C,0x80,0x45,0xDF,0xFC};
|
||||
char charBuffer[1024*10];
|
||||
unsigned int charCount;
|
||||
std::string StrData;
|
||||
|
@ -34,6 +45,12 @@ int main( ) {
|
|||
int TimeStamp = 0;
|
||||
int ThisNaluSize;
|
||||
int VidContinuity = 0;
|
||||
int AudioContinuity = 0;
|
||||
bool FirstKeyFrame = true;
|
||||
bool FirstIDRInKeyFrame;
|
||||
std::string AudioPack;
|
||||
uint64_t AudioTimestamp = 0;
|
||||
uint64_t NextAudioTimestamp = 0;
|
||||
while( std::cin.good() ) {
|
||||
std::cin.read(charBuffer, 1024*10);
|
||||
charCount = std::cin.gcount();
|
||||
|
@ -43,11 +60,13 @@ int main( ) {
|
|||
DTMIData = DTSCStream.lastData();
|
||||
if( DTSCStream.getPacket(0).getContent("keyframe").NumValue() ) {
|
||||
IsKeyFrame = true;
|
||||
TimeStamp = DTSCStream.getTime();
|
||||
FirstIDRInKeyFrame = true;
|
||||
} else {
|
||||
IsKeyFrame = false;
|
||||
TimeStamp = 0;
|
||||
FirstKeyFrame = false;
|
||||
}
|
||||
TimeStamp = (DTSCStream.getPacket(0).getContent("time").NumValue() * 27000);
|
||||
if( TimeStamp < 0 ) { TimeStamp = 0; }
|
||||
std::string ToPack;
|
||||
int TSType;
|
||||
bool FirstIDRPic = true;
|
||||
|
@ -61,8 +80,21 @@ int main( ) {
|
|||
ToPack.append(PPS_SPS,32);
|
||||
FirstIDRPic = false;
|
||||
FirstNonIDRPic = false;
|
||||
}
|
||||
ToPack.append(ShortNALUHeader,3);
|
||||
}
|
||||
if( IsKeyFrame ) {
|
||||
if( FirstKeyFrame ) {
|
||||
ToPack.append(ShortNALUHeader,3);
|
||||
} else {
|
||||
if( FirstIDRInKeyFrame ) {
|
||||
ToPack.append(NALUHeader,4);
|
||||
FirstIDRInKeyFrame = false;
|
||||
} else {
|
||||
ToPack.append(ShortNALUHeader,3);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ToPack.append(ShortNALUHeader,3);
|
||||
}
|
||||
} else if ( TSType == 0x21 ) {
|
||||
if( FirstNonIDRPic ) {
|
||||
ToPack.append(NALUHeader,4);
|
||||
|
@ -78,38 +110,90 @@ int main( ) {
|
|||
DTMIData.erase(0,ThisNaluSize);
|
||||
}
|
||||
WritePesHeader = true;
|
||||
fprintf( stderr, "PESHeader: %d, PackNum: %2d, ToPackSize: %d\n", WritePesHeader, TSPackNum, ToPack.size() );
|
||||
while( ToPack.size() ) {
|
||||
if ( ( TSPackNum % 210 ) == 0 ) {
|
||||
PackData.FFMpegHeader();
|
||||
PackData.ToString();
|
||||
}
|
||||
if ( ( TSPackNum % 42 ) == 0 ) {
|
||||
PackData.DefaultPAT();
|
||||
std::cout << PackData.ToString();
|
||||
PackData.ToString();
|
||||
} else if ( ( TSPackNum % 42 ) == 1 ) {
|
||||
PackData.DefaultPMT();
|
||||
std::cout << PackData.ToString();
|
||||
PackData.ToString();
|
||||
} else {
|
||||
PackData.Clear();
|
||||
PackData.PID( 0x100 );
|
||||
PackData.ContinuityCounter( VidContinuity++ );
|
||||
PackData.ContinuityCounter( VidContinuity );
|
||||
VidContinuity ++;
|
||||
if( WritePesHeader ) {
|
||||
PackData.UnitStart( 1 );
|
||||
if( IsKeyFrame ) {
|
||||
PackData.AdaptionField( 0x03 );
|
||||
fprintf( stderr, "IsKeyFrame\n" );
|
||||
PackData.RandomAccess( 1 );
|
||||
PackData.PCR( TimeStamp );
|
||||
} else {
|
||||
PackData.AdaptionField( 0x01 );
|
||||
}
|
||||
fprintf( stderr, "Needed Stuffing: %d\n", 184 - (20+ToPack.size()) );
|
||||
PackData.AddStuffing( 184 - (20+ToPack.size()) );
|
||||
PackData.PESLeadIn( ToPack.size() );
|
||||
PackData.PESVideoLeadIn( ToPack.size(), TimeStamp / 300 );
|
||||
WritePesHeader = false;
|
||||
} else {
|
||||
PackData.AdaptionField( 0x01 );
|
||||
PackData.AddStuffing( 184 - (ToPack.size()) );
|
||||
}
|
||||
fprintf( stderr, "Needed Stuffing: %d\n", 184 - (ToPack.size()) );
|
||||
PackData.AddStuffing( 184 - (ToPack.size()) );
|
||||
}
|
||||
PackData.FillFree( ToPack );
|
||||
std::cout << PackData.ToString();
|
||||
}
|
||||
PackData.ToString();
|
||||
}
|
||||
fprintf( stderr, "PackNum: %d\n\tAdaptionField: %d\n==========\n", TSPackNum + (TSPackNum/210)+1 + 1, PackData.AdaptionField( ) );
|
||||
TSPackNum++;
|
||||
}
|
||||
}
|
||||
} else if( DTSCStream.lastType() == DTSC::AUDIO ) {
|
||||
WritePesHeader = true;
|
||||
DTMIData = DTSCStream.lastData();
|
||||
AudioPack = GetAudioHeader( DTMIData.size() );
|
||||
AudioPack += DTMIData;
|
||||
fprintf( stderr, "DTMIData: %d\n", DTMIData.size() );
|
||||
AudioTimestamp = DTSCStream.getPacket(0).getContent("time").NumValue() * 900;
|
||||
if( AudioTimestamp < 0 ) { AudioTimestamp = 0; }
|
||||
PackData.Clear();
|
||||
while( AudioPack.size() ) {
|
||||
if ( ( TSPackNum % 210 ) == 0 ) {
|
||||
PackData.FFMpegHeader();
|
||||
PackData.ToString();
|
||||
}
|
||||
if ( ( TSPackNum % 42 ) == 0 ) {
|
||||
PackData.DefaultPAT();
|
||||
PackData.ToString();
|
||||
} else if ( ( TSPackNum % 42 ) == 1 ) {
|
||||
PackData.DefaultPMT();
|
||||
PackData.ToString();
|
||||
} else {
|
||||
PackData.Clear();
|
||||
PackData.PID( 0x101 );
|
||||
PackData.ContinuityCounter( AudioContinuity );
|
||||
AudioContinuity ++;
|
||||
if( WritePesHeader ) {
|
||||
PackData.UnitStart( 1 );
|
||||
PackData.RandomAccess( 1 );
|
||||
fprintf( stderr, "WritePes Needed Stuffing: %d\n", 184 - (14+AudioPack.size()) );
|
||||
PackData.AddStuffing( 184 - (14+ AudioPack.size()) );
|
||||
PackData.PESAudioLeadIn( AudioPack.size(), AudioTimestamp );
|
||||
WritePesHeader = false;
|
||||
} else {
|
||||
PackData.AdaptionField( 0x01 );
|
||||
fprintf( stderr, "Needed Stuffing: %d\n", 184 - (AudioPack.size()) );
|
||||
PackData.AddStuffing( 184 - (AudioPack.size()) );
|
||||
}
|
||||
PackData.FillFree( AudioPack );
|
||||
PackData.ToString();
|
||||
}
|
||||
fprintf( stderr, "PackNum: %d\n\tAdaptionField: %d\n==========\n", TSPackNum + (TSPackNum/210)+1 + 1, PackData.AdaptionField( ) );
|
||||
TSPackNum++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue