Audio/video stream recording forums (http://stream-recorder.com/forum/index.php)
-   rtmpdump (http://stream-recorder.com/forum/forumdisplay.php?f=54)
-   -  

FLV fixer script

(http://stream-recorder.com/forum/showthread.php?t=12722)

KSV 06-03-2012 10:28 AM

FLV fixer script


 
I have created a new script for repairing the FLV files based on the flv processing code taken from my another script AdobeHDS. it can help you in following scenarios.
  1. it can fix live streams recorded with rtmpdump which are not remuxable with ffmpeg or not properly seekable.
  2. it can extract valid flv data leaving out junk from interrupted downloads which are no longer resumable with rtmpdump. you can resume them after fixing with this script.

You can use script with following switches:
Code:

--help              displays this help
 --debug            show debug output
 --nometa            do not save metadata in repaired file
 --fixwindow [param] timestamp gap between frames to consider as timeshift
 --in        [param] input filename of flv file to be repaired
 --out      [param] output filename for repaired file

Download:
Code:

https://github.com/K-S-V/Scripts

greenythebeast 06-03-2012 03:43 PM

Re: FLV fixer script


 
Wonderful, thanks!

KSV 07-18-2012 01:07 AM

Re: FLV fixer script


 
Changes:
Code:

1. rebase timestamps to zero + other improvements
2. added nometa switch to remove metadata from repaired file

removing metadata from repaired file can be often useful in case of live streams because they normally have wrong duration set in metadata.

Elgero 07-22-2012 02:56 PM

Re: FLV fixer script


 
KSV, would it be difficult to write a script or modify the flvFixer script so it can read several chunks/parts from an Flv video and then save them as a single video in one process?

I have quite a few large Flv videos (some are over 2GB) I need to cut first and then join the cut parts together, but I'm having a lot of problems finding a freeware application that can do it properly.

Some applications crash with large files, because they want to load the entire video in memory. Other applications can cut only 1 part at once, which takes a lot of time and other applications don't support Nellymoser or Speex audio, even though it's raw file editing.

I'd like to edit based on seconds or perhaps milliseconds. I know that every video needs to start on a keyframe, which means it won't always cut exactly on the specified start time, but that's not a problem.


For example:

--parts 39-249,583-937,1292-1819

cut from second 39 to 249
cut from second 583 to 937
cut from second 1292 to 1819

Save the parts as a single Flv video.

greenythebeast 07-22-2012 09:32 PM

Re: FLV fixer script


 
Quote:

Originally Posted by Elgero (Post 49664)
KSV, would it be difficult to write a script or modify the flvFixer script so it can read several chunks/parts from an Flv video and then save them as a single video in one process?

I have quite a few large Flv videos (some are over 2GB) I need to cut first and then join the cut parts together, but I'm having a lot of problems finding a freeware application that can do it properly.

Some applications crash with large files, because they want to load the entire video in memory. Other applications can cut only 1 part at once, which takes a lot of time and other applications don't support Nellymoser or Speex audio, even though it's raw file editing.

I'd like to edit based on seconds or perhaps milliseconds. I know that every video needs to start on a keyframe, which means it won't always cut exactly on the specified start time, but that's not a problem.


For example:

--parts 39-249,583-937,1292-1819

cut from second 39 to 249
cut from second 583 to 937
cut from second 1292 to 1819

Save the parts as a single Flv video.

Pretty sure you can do this with ffmpeg.

Elgero 07-22-2012 11:19 PM

Re: FLV fixer script


 
Quote:

Originally Posted by greenythebeast (Post 49675)
Pretty sure you can do this with ffmpeg.

Thank you. Do you know if ffmpeg can cut multiple parts with one command? The only commands I can find are -ss (start time) and -t (duration) to cut one part. This is what I'm already doing and it takes too long to do this all step by step. Or perhaps I need to write a batch script to do this.

I'm not a PHP programmer, but I'll play around with the FlvFixer script and maybe I can add it myself. I rather have the PHP script, it gives me more control and I can add little things, like "duration" metadata that some video players require to be able to seek.

Elgero 07-23-2012 03:50 PM

Re: FLV fixer script


 
I've been playing around with the FlvFixer script for a while. I know that packet 2021, 4181, 8230 and 10607 are keyframes and I have currently hardcoded them as a test.

The code below works fine, it extracts the parts from keyframe 2021 to 4181 and from keyframe 8230 to 10607. The only problem I don't know how to solve is fixing the timestamps. The timestamps of the first part are fixed correctly, but not the second part.

Is there an "easy" fix for that?

Code:

  while ($filePos < $fileLen)
    {
      $flvTag    = fread($flvIn, $tagHeaderLen);
      $tagPos    = 0;
      $packetType = ReadByte($flvTag, $tagPos);
      $packetSize = ReadInt24($flvTag, $tagPos + 1);
      $packetTS  = ReadInt24($flvTag, $tagPos + 4);
      $packetTS  = $packetTS | (ReadByte($flvTag, $tagPos + 7) << 24);
      $flvTag      = $flvTag . fread($flvIn, $packetSize + $prevTagSize);
      $totalTagLen = $tagHeaderLen + $packetSize + $prevTagSize;
      if (strlen($flvTag) != $totalTagLen)
        {
          DebugLog("Broken FLV tag encountered! Aborting further processing.");
          break;
        }

      $PacketCount += 1;

      if (($PacketCount >= 2021 and $PacketCount <= 4181) or ($PacketCount >= 8230 and $PacketCount <= 10607))
        {

        if (($baseTS === false) and (($packetType == AUDIO) or ($packetType == VIDEO)))
          $baseTS = $packetTS;
        if ($baseTS > 1000)
          {
            $packetTS -= $baseTS;
            WriteFlvTimestamp($flvTag, $tagPos, $packetTS);
          }

        switch ($packetType)
          {
            case AUDIO:
                if ($packetTS >= $prevAudioTS - TIMECODE_DURATION * 5)
                  {
                    $FrameInfo = ReadByte($flvTag, $tagPos + $tagHeaderLen);
                    $CodecID  = ($FrameInfo & 0xF0) >> 4;
                    if ($CodecID == CODEC_ID_AAC)
                      {
                        $AAC_PacketType = ReadByte($flvTag, $tagPos + $tagHeaderLen + 1);
                        if ($AAC_PacketType == AAC_SEQUENCE_HEADER)


greenythebeast 07-23-2012 06:00 PM

Re: FLV fixer script


 
Quote:

Originally Posted by Elgero (Post 49714)
I've been playing around with the FlvFixer script for a while. I know that packet 2021, 4181, 8230 and 10607 are keyframes and I have currently hardcoded them as a test.

The code below works fine, it extracts the parts from keyframe 2021 to 4181 and from keyframe 8230 to 10607. The only problem I don't know how to solve is fixing the timestamps. The timestamps of the first part are fixed correctly, but not the second part.

Is there an "easy" fix for that?

Code:

  while ($filePos < $fileLen)
    {
      $flvTag    = fread($flvIn, $tagHeaderLen);
      $tagPos    = 0;
      $packetType = ReadByte($flvTag, $tagPos);
      $packetSize = ReadInt24($flvTag, $tagPos + 1);
      $packetTS  = ReadInt24($flvTag, $tagPos + 4);
      $packetTS  = $packetTS | (ReadByte($flvTag, $tagPos + 7) << 24);
      $flvTag      = $flvTag . fread($flvIn, $packetSize + $prevTagSize);
      $totalTagLen = $tagHeaderLen + $packetSize + $prevTagSize;
      if (strlen($flvTag) != $totalTagLen)
        {
          DebugLog("Broken FLV tag encountered! Aborting further processing.");
          break;
        }

      $PacketCount += 1;

      if (($PacketCount >= 2021 and $PacketCount <= 4181) or ($PacketCount >= 8230 and $PacketCount <= 10607))
        {

        if (($baseTS === false) and (($packetType == AUDIO) or ($packetType == VIDEO)))
          $baseTS = $packetTS;
        if ($baseTS > 1000)
          {
            $packetTS -= $baseTS;
            WriteFlvTimestamp($flvTag, $tagPos, $packetTS);
          }

        switch ($packetType)
          {
            case AUDIO:
                if ($packetTS >= $prevAudioTS - TIMECODE_DURATION * 5)
                  {
                    $FrameInfo = ReadByte($flvTag, $tagPos + $tagHeaderLen);
                    $CodecID  = ($FrameInfo & 0xF0) >> 4;
                    if ($CodecID == CODEC_ID_AAC)
                      {
                        $AAC_PacketType = ReadByte($flvTag, $tagPos + $tagHeaderLen + 1);
                        if ($AAC_PacketType == AAC_SEQUENCE_HEADER)


Will Avidemux do what you want? http://fixounet.free.fr/avidemux/

Elgero 07-23-2012 09:03 PM

Re: FLV fixer script


 
Unfortunately not. AVIDemux is one of those tools that does not support Nellymoser audio, even though it's just raw file editing.

When I load the Flv video it first complains that no audio decoder can be found. When I try to save the video anyway it complains about unsupported audio and that saving the video has failed.

KSV 07-23-2012 11:51 PM

Re: FLV fixer script


 
IMO trying to add editing capabilities (sort of) to this script is out of scope for it's intended purpose though you are free to play around with your copy.


All times are GMT -6. The time now is 03:07 AM.