public Flv(FileInfo file, bool generateMetadata) { _file = file; _generateMetadata = generateMetadata; int count = 0; if (!_generateMetadata) { try { FlvReader reader = new FlvReader(_file); ITag tag = null; while (reader.HasMoreTags() && (++count < 5)) { tag = reader.ReadTag(); if (tag.DataType == IOConstants.TYPE_METADATA) { if (_metaService == null) _metaService = new MetaService(_file); _metaData = _metaService.ReadMetaData(tag.Body); } } reader.Close(); } catch (Exception ex) { #if !SILVERLIGHT log.Error("An error occured looking for metadata:", ex); #endif } } }
public void ReadTag_WhenStateIsBeforeBackpointer_ThrowsInvalidOperationException() { // Arrange _flvReader = _flvReaderObjectMother.CreateFlvReaderWithBackpointer(); // Act and assert. Assert.Throws <InvalidOperationException>(() => _flvReader.ReadTag()); }
public void ReadTag_WhenStateIsBeforeTag_ReturnsTag() { // Arrange _flvReader = _flvReaderObjectMother.CreateFlvReaderWithTag(); // Act var tag = _flvReader.ReadTag(); // Assert Assert.NotNull(tag); }
public void ReadTag_ReachedEndOfStream_ReturnsNull() { // Arrange _flvReader = _flvReaderObjectMother.CreateEmptyFlvReader(); _flvReader.MoveToBeforeTagState(); // Act var tag = _flvReader.ReadTag(); // Assert Assert.Null(tag); }
/// <summary> /// Initiates writing of the Metadata. /// </summary> /// <param name="meta">Metadata to write.</param> public void Write(MetaData meta) { // Get cue points, FLV reader and writer MetaCue[] metaArr = meta.MetaCue; FlvReader reader = new FlvReader(_file, false); FlvWriter writer = new FlvWriter(_output, false); ITag tag = null; // Read first tag if (reader.HasMoreTags()) { tag = reader.ReadTag(); if (tag.DataType == IOConstants.TYPE_METADATA) { if (!reader.HasMoreTags()) throw new IOException("File we're writing is metadata only?"); } } meta.Duration = (double)reader.Duration / 1000; meta.VideoCodecId = reader.VideoCodecId; meta.AudioCodecId = reader.AudioCodecId; ITag injectedTag = InjectMetaData(meta, tag); injectedTag.PreviousTagSize = 0; tag.PreviousTagSize = injectedTag.BodySize; writer.WriteHeader(); writer.WriteTag(injectedTag); writer.WriteTag(tag); int cuePointTimeStamp = 0; int counter = 0; if (metaArr != null) { Array.Sort(metaArr); cuePointTimeStamp = GetTimeInMilliseconds(metaArr[0]); } while (reader.HasMoreTags()) { tag = reader.ReadTag(); // if there are cuePoints in the array if (counter < metaArr.Length) { // If the tag has a greater timestamp than the // cuePointTimeStamp, then inject the tag while (tag.Timestamp > cuePointTimeStamp) { injectedTag = InjectMetaCue(metaArr[counter], tag); writer.WriteTag(injectedTag); tag.PreviousTagSize = injectedTag.BodySize; // Advance to the next CuePoint counter++; if (counter > (metaArr.Length - 1)) { break; } cuePointTimeStamp = GetTimeInMilliseconds(metaArr[counter]); } } if (tag.DataType != IOConstants.TYPE_METADATA) { writer.WriteTag(tag); } } writer.Close(); }
public void ReadTag_WhenStateIsBeforeHeader_ThrowsInvalidOperationException() { // Arrange _flvReader = _flvReaderObjectMother.CreateFlvReaderWithHeader(); // Act and assert. Assert.Throws<InvalidOperationException>(() => _flvReader.ReadTag()); }