sendVideoStream method

Future<void> sendVideoStream(
  1. String filePath
)

send video streamming

Implementation

Future<void> sendVideoStream(String filePath) async {
  try {
    final file = File(filePath);
    if (!await file.exists()) {
      response
        ..statusCode = HttpStatus.notFound
        ..write('File not found')
        ..close();
      return;
    }

    final total = await file.length();
    int start = 0;
    int end = total - 1;

    final rangeHeader = headers.value(HttpHeaders.rangeHeader);
    if (rangeHeader != null) {
      final match = RegExp(r'bytes=(\d+)-(\d*)').firstMatch(rangeHeader);
      if (match != null) {
        start = int.parse(match.group(1)!);
        if (match.group(2) != null && match.group(2)!.isNotEmpty) {
          end = int.parse(match.group(2)!);
        }
      }
      response.statusCode = HttpStatus.partialContent;
    }

    final length = end - start + 1;

    response.headers
      ..set(HttpHeaders.contentTypeHeader, 'video/mp4')
      ..set(HttpHeaders.acceptRangesHeader, 'bytes')
      ..set(HttpHeaders.contentLengthHeader, length.toString())
      ..set(HttpHeaders.contentRangeHeader, 'bytes $start-$end/$total');

    final stream = file.openRead(start, end + 1);
    await stream.pipe(response);
  } catch (e) {
    TLogger.instance.showLog(e.toString(), tag: 'sendVideoStream');
    response
      ..statusCode = HttpStatus.internalServerError
      ..write('Server Error')
      ..close();
  }
}