MDX Features of Docusaurus
React Componentβ
Code as:
export const Highlight = ({children, color}) => (
<span
style={{
backgroundColor: color,
borderRadius: '2px',
color: '#fff',
padding: '0.2rem',
}}>
{children}
</span>
);
<Highlight color="#25c2a0">Docusaurus green</Highlight> and <Highlight color="#1877F2">Facebook blue</Highlight> are my favorite colors.
Render as:
Docusaurus green and Facebook blue are my favorite colors.
Code as:
import React from 'react';
export default function SharedHighlight({children, color}) {
return (
<span
style={{
backgroundColor: color,
borderRadius: '2px',
color: '#fff',
padding: '0.2rem',
}}>
{children}
</span>
);
}
With:
import SharedHighlight from '@site/src/components/Highlight';
<SharedHighlight color="#25c2a0">Docusaurus green</SharedHighlight>
I can write **Markdown** alongside my _JSX_!
Render as:
Docusaurus greenI can write Markdown alongside my JSX!
Tabsβ
Code as:
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
<Tabs>
<TabItem value="apple" label="Apple" default>
This is an apple π
</TabItem>
<TabItem value="orange" label="Orange">
This is an orange π
</TabItem>
<TabItem value="banana" label="Banana">
This is a banana π
</TabItem>
</Tabs>
Render as:
- Apple
- Orange
- Banana
This is an apple π
This is an orange π
This is a banana π
NOTESβ
<!-- Prettier doesn't change this -->
:::note
Hello world
:::
Hello world
<!-- Prettier changes this -->
:::note
Hello world
:::
<!-- to this -->
::: note Hello world:::
:::note[Your Title]
Some **content** with _Markdown_ `syntax`.
:::
Some content with Markdown syntax
.
:::tip[Use tabs in admonitions]
<Tabs>
<TabItem value="apple" label="Apple">This is an apple π</TabItem>
<TabItem value="orange" label="Orange">This is an orange π</TabItem>
<TabItem value="banana" label="Banana">This is a banana π</TabItem>
</Tabs>
:::
- Apple
- Orange
- Banana
Mathβ
Let $f\colon[a,b]\to\R$ be Riemann integrable. Let $F\colon[a,b]\to\R$ be
$F(x)=\int_{a}^{x} f(t)\,dt$. Then $F$ is continuous, and at all $x$ such that
$f$ is continuous at $x$, $F$ is differentiable at $x$ with $F'(x)=f(x)$.
Let be Riemann integrable. Let be . Then is continuous, and at all such that is continuous at , is differentiable at with .
$$
I = \int_0^{2\pi} \sin(x)\,dx
$$
Diagramsβ
```mermaid
graph TD;
A-->B;
A-->C;
B-->D;
C-->D;
```
Code Blockβ
```jsx title="/src/components/HelloCodeTitle.js"
function HelloCodeTitle(props) {
return <h1>Hello, {props.name}</h1>;
}
```
function HelloCodeTitle(props) {
return <h1>Hello, {props.name}</h1>;
}
Syntax highlighting for Other languages by prism
: sh
, editorconfig
, etc.
editorconfig:
```editorconfig title="/etc/samba.conf"
[documents]
path = /data/documents
valid users = @simon
guest ok = no
writable = yes
browsable = yes
```
sh:
```sh
$ ls /home
```
```js
function HighlightSomeText(highlight) {
if (highlight) {
// highlight-next-line
return 'This text is highlighted!';
}
return 'Nothing highlighted';
}
function HighlightMoreText(highlight) {
// highlight-start
if (highlight) {
return 'This range is highlighted!';
}
// highlight-end
return 'Nothing highlighted';
}
```
function HighlightSomeText(highlight) {
if (highlight) {
return 'This text is highlighted!';
}
return 'Nothing highlighted';
}
function HighlightMoreText(highlight) {
if (highlight) {
return 'This range is highlighted!';
}
return 'Nothing highlighted';
}
```jsx {1,4-6,11}
import React from 'react';
function MyComponent(props) {
if (props.isBar) {
return <div>Bar</div>;
}
return <div>Foo</div>;
}
export default MyComponent;
```
import React from 'react';
function MyComponent(props) {
if (props.isBar) {
return <div>Bar</div>;
}
return <div>Foo</div>;
}
export default MyComponent;
```jsx {1,4-6,11} showLineNumbers
import React from 'react';
function MyComponent(props) {
if (props.isBar) {
return <div>Bar</div>;
}
return <div>Foo</div>;
}
export default MyComponent;
```
import React from 'react';
function MyComponent(props) {
if (props.isBar) {
return <div>Bar</div>;
}
return <div>Foo</div>;
}
export default MyComponent;
- JavaScript
- Python
- Java
function helloWorld() {
console.log('Hello, world!');
}
def hello_world():
print("Hello, world!")
class HelloWorld {
public static void main(String args[]) {
System.out.println("Hello, World");
}
}
Importing Codeβ
npm install --save raw-loader
import CodeBlock from '@theme/CodeBlock';
import MyComponentSource from '!!raw-loader!./myComponent';
<CodeBlock language="jsx">{MyComponentSource}</CodeBlock>
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import React, { useState } from 'react';
export default function MyComponent() {
const [bool, setBool] = useState(false);
return (
<div>
<p>MyComponent rendered !</p>
<p>bool={bool ? 'true' : 'false'}</p>
<p>
<button onClick={() => setBool((b) => !b)}>toggle bool</button>
</p>
</div>
);
}
Importing Markdownβ
import PartialExample from './_markdown-partial-example.mdx';
<PartialExample name="Sebastien" />
This is text some content from _markdown-partial-example.mdx
.
import PartialExample1 from './wiki/wiki-video.mdx';
<PartialExample1 />
It imports file from wiki-video.mdx:
Wiki Video: Streaming Protocols, Video Chunk, Format/Codec, Playback
Overviewβ
This document provides a quick reference to modern video streaming technologies, covering key differences between streaming protocols, video chunking strategies, and how video playback works in browsers and players. It focuses especially on the difference between progressive MP4 streaming and chunk-based playback via HLS/DASH.
Video Format/Codecβ
Common Video Streaming Protocolsβ
Protocol | Full Name | Use Case | Live/VOD | Latency | Status | Notes |
---|---|---|---|---|---|---|
HLS | HTTP Live Streaming | Apple TV, Safari | Both | 10β30 sec | Active | modern, scalable, used for both live and VOD. |
DASH | MPEG-DASH | YouTube, Netflix | Both | 5β15 sec | Active | Open standard, alternative to HLS |
RTMP | Real-Time Messaging Protocol | OBS to YouTube/Twitch | Live Only | ~2β5 sec | Deprecated (playback) | used for sending live video to servers, not for playback |
RTSP | Real-Time Streaming Protocol | CCTV, IP cameras | Live Only | ~1 sec | Active (niche) | Not browser-compatible; mostly in special app(surveillance systems, etc.) |
WebRTC | Web Real-Time Communication | Live chat, calls | Live Only | ~0.5 sec | Growing | Low latency; peer-to-peer(video calls, etc.) |
Video Chunking(HLS/DASH)β
In real world applications, like youtube, they will divide a video into many chunks for HLS
or DASH
for better performance.
Protocol | Chunk File Format | Notes |
---|---|---|
HLS | .ts (MPEG-2 Transport Stream) or .mp4 (fMP4) | .ts is traditional, .mp4 (fMP4) is newer and supports low-latency |
DASH | .mp4 (fMP4) | DASH usually uses fragmented MP4 |
- fMP4 = fragmented MP4 β this allows streaming before the full file is complete, perfect for chunked delivery.
- Each chunk might be ~2β10 seconds long depending on settings.
How Does Client Handle Chunks?β
The client (player) must understand how to:
- Parse the manifest file (
.m3u8
forHLS
,.mpd
forDASH
) - Download the chunks in order
- Buffer a few chunks ahead
- Handle adaptive bitrate switching
Usually, this is done by a video player library like:
- HLS.js (for browsers)
- Shaka Player (for
DASH
) - AVPlayer (on iOS/tvOS)
- ExoPlayer (on Android)
Playbackβ
A. Chunk-Based Playback (HLS/DASH)β
- The player loads the manifest file.
- It picks the best quality (bitrate) based on bandwidth.
- It downloads chunk 1 and starts playing it while downloading chunk 2.
- It continues in parallel: downloading one or more chunks ahead, playing current one.
- If network speed drops, it switches bitrate (adaptive bitrate streaming).
So, no, the player doesnβt download the whole chunked video first. It streams it in real time by pulling chunks one by one.
Bonus: Manifest Filesβ
HLS
.m3u8
Example:
#EXTM3U
#EXT-X-VERSION:3
#EXTINF:10.0,
chunk1.ts
#EXTINF:10.0,
chunk2.ts
...
DASH
.mpd
Manifest:
An XML file describing all chunks, qualities, and durations.
Bonus: How to Create HLS from MP4 (ffmpeg Example)β
ffmpeg -i input.mp4 \
-codec: copy -start_number 0 \
-hls_time 6 -hls_list_size 0 \
-f hls output.m3u8
This will create .ts
chunks and an .m3u8
playlist ready for HLS playback.
B. Progressive MP4 Download (Direct in Browser, via a streaming api supported by server)β
- A single
.mp4
file is streamed via HTTP. - Browsers like Chrome or Safari can start playback once enough is buffered.
- Doesnβt require special manifests.
- Supports basic seeking (if moov atom is early).
- No adaptive bitrate or chunk control.
Bonus: Streaming API In Python to Support Progressive MP4 Playbackβ
loading...
Playback Comparisonβ
Feature | MP4 Progressive | HLS/DASH Chunk Streaming |
---|---|---|
File Format | Single .mp4 | Multiple .ts or .mp4 chunks |
Requires Manifest | β No | β
Yes (.m3u8 / .mpd ) |
Native Browser Support | β Yes (Chrome, etc.) | β (except Safari for HLS) |
Adaptive Bitrate | β No | β Yes |
Low-Latency Live Support | β Limited | β Yes |
JS Player Required | β No | β Usually |
Suitable for Long VOD | β οΈ Not ideal | β Excellent |
When to Use Which,
-
MP4 Progressive:
- Small or simple videos
- Static content without network adaptation needs
-
HLS/DASH:
- Live streaming
- VOD with varying network conditions
- Need for adaptive bitrate
- Complex playback control (seeking, DVR, etc.)
Referencesβ
Import Code Snippets from GitHub Repositoriesβ
A Docusaurus v2 plugin that supports referencing code examples from public GitHub repositories.
loading...
loading...
loading...