
Recherche avancée
Médias (1)
-
Revolution of Open-source and film making towards open film making
6 octobre 2011, par
Mis à jour : Juillet 2013
Langue : English
Type : Texte
Autres articles (62)
-
Websites made with MediaSPIP
2 mai 2011, parThis page lists some websites based on MediaSPIP.
-
Creating farms of unique websites
13 avril 2011, parMediaSPIP platforms can be installed as a farm, with a single "core" hosted on a dedicated server and used by multiple websites.
This allows (among other things) : implementation costs to be shared between several different projects / individuals rapid deployment of multiple unique sites creation of groups of like-minded sites, making it possible to browse media in a more controlled and selective environment than the major "open" (...) -
Publier sur MédiaSpip
13 juin 2013Puis-je poster des contenus à partir d’une tablette Ipad ?
Oui, si votre Médiaspip installé est à la version 0.2 ou supérieure. Contacter au besoin l’administrateur de votre MédiaSpip pour le savoir
Sur d’autres sites (9219)
-
What is the bitrate of my audio file based on ffmpeg output ?
21 avril 2015, par blueetherIs it the 40kb/s under
Format
, or is it the 16kb/s underStream
? What is the relationship between the Format and the Stream ?
The below output is for a file generated using Core Audio on an iphone, with an Audio Unit. The output format was specified by anAudioStreamBasicDescription
descriptorUpdated :
Output fromffprobe -v error -show_format -show_streams 123_1429602551009.051025.m4a
:[STREAM]
index=0
codec_name=aac
codec_long_name=AAC (Advanced Audio Coding)
profile=LC
codec_type=audio
codec_time_base=1/8000
codec_tag_string=mp4a
codec_tag=0x6134706d
sample_fmt=fltp
sample_rate=8000
channels=1
channel_layout=mono
bits_per_sample=0
id=N/A
r_frame_rate=0/0
avg_frame_rate=0/0
time_base=1/8000
start_pts=0
start_time=0.000000
duration_ts=43008
duration=5.376000
bit_rate=16501
max_bit_rate=N/A
bits_per_raw_sample=N/A
nb_frames=42
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
TAG:creation_time=1970-04-16 22:36:01
TAG:language=eng
[/STREAM]
[FORMAT]
filename=123_1429602551009.051025.m4a
nb_streams=1
nb_programs=0
format_name=mov,mp4,m4a,3gp,3g2,mj2
format_long_name=QuickTime / MOV
start_time=0.000000
duration=5.376000
size=27473
bit_rate=40882
probe_score=100
TAG:major_brand=M4A
TAG:minor_version=0
TAG:compatible_brands=M4A mp42isom
TAG:creation_time=1970-04-16 22:36:01
TAG:iTunSMPB= 00000000 00000840 00000361 0000000000009C5F 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[/FORMAT] -
Safari sends excessive HTTP range requests during HTML5 MOV playback
28 mai, par LucyI am currently developing a web application based on React and Next.js, and I use the react-player library to play user-uploaded videos stored on AWS S3. The supported upload video formats are mp4, mov, and mkv, with codecs including H.264 or H.265 (HEVC).


Problem


However, some
H.264
videos in themov
format exhibit noticeably poor playback performance only in the Safari browser. The videos do not play smoothly and frequently experience stuttering or delays.

How Safari Handles Range Requests (As I Understand It) :


- 

- Safari first sends a normal GET request to check if the server supports Range requests. If the server responds with the header Accept-Ranges : bytes, Safari closes the connection.
- Then, Safari sends a very small range request like Range : bytes=0-1 to confirm it receives a 206 Partial Content response.
- Next, Safari requests some parts from the beginning and the end of the file to locate metadata such as the moov atom in MP4 files.
- After that, actual streaming begins, but Safari does not request the entire file at once ; instead, it divides the needed parts into multiple small Range requests.










Example of Actual Problematic Requests


Below are some of the Range requests Safari makes for the problematic
.mov
video (H.264 codec) :

# Request - 1
Connection: keep-alive
Range: bytes=0-1

# Response
HTTP/1.1 206 Partial Content
Accept-Ranges: bytes
Content-Disposition: attachment;filename*=utf-8''test.mov
Content-Length: 2
Content-Range: bytes 0-1/102801747
Content-Type: video/quicktime

-------------------------------------
# Request - 2
Connection: Keep-Alive
Range: bytes=0-102801746

# Response
HTTP/1.1 206 Partial Content
Accept-Ranges: bytes
Content-Disposition: attachment;filename*=utf-8''test.mov
Content-Length: 102801747
Content-Range: bytes 0-102801746/102801747
Content-Type: video/quicktime

-------------------------------------
# Request - 3
Connection: Keep-Alive
Range: bytes=102760448-102801746

# Response - 3
HTTP/1.1 206 Partial Content
Accept-Ranges: bytes
Content-Disposition: attachment;filename*=utf-8''test.mov
Content-Length: 41299
Content-Range: bytes 102760448-102801746/102801747
Content-Type: video/quicktime

-------------------------------------
# Request - 4
Connection: keep-alive
Range: bytes=3014656-3080191 # 64KB

# Response - 4
HTTP/1.1 206 Partial Content
Accept-Ranges: bytes
Content-Disposition: attachment;filename*=utf-8''IMG_7929.mov
Content-Length: 65536
Content-Range: bytes 3014656-3080191/102801747
Content-Type: video/quicktime



Safari continues to send hundreds of similar small Range requests repeatedly, gradually downloading the file.


This causes increased network load, which ultimately leads to video stuttering or playback delays.


Example of another
.mov
file that works properly :

In contrast, another .mov video using the same format and codec (H.264) sends Range requests over much larger byte ranges, downloading about 30MB of data at once. In this case, the video plays smoothly.


# Request 
Connection: Keep-Alive
Range: bytes=1310534-673918954 # Request : 672MB, Actual Downloaded : 32MB

# Response
Accept-Ranges: bytes
Content-Disposition: attachment;filename*=utf-8''mov-example-video-download-4k-uhd-3840x2160.mov
Content-Length: 672608421
Content-Range: bytes 1310534-673918954/673918955
Content-Type: video/quicktime



Question


In Safari, for certain video files, the browser repeatedly closes the connection after receiving only a few kilobytes per request and immediately sends the next request. As a result, dozens or even hundreds of small range requests occur consecutively. This causes increased connection overhead and latency, and although the web server can deliver data at sufficient speed, the player does not receive data in time, leading to poor and stuttering video playback.


- 

- What could be the reason Safari repeatedly makes these very small requests for certain files ?
- Could the internal structure of the video file (such as the moov atom) influence this request pattern ?






f you have any similar experience or advice, please share.


What I'ved tried


- 

- Using
ffmpeg
to move themoov atom
to the beginning of the file with-movflags faststart
does not resolve the issue — the same problem persists. - Converting the exact same video to MP4 format and testing it results in normal playback without issues.






Test Environment


- 

- Macbook pro 16
- mac OS - Sequoia 15.5
- Safari - Latest








File information


Due to company policy, I am unable to share the problematic video files directly. However, I am attaching the file information obtained via ffprobe for your reference.


ffprobe -v error -show_format -show_streams -print_format json test.mov

{
 "streams": [
 {
 "index": 0,
 "codec_name": "h264",
 "codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
 "profile": "High",
 "codec_type": "video",
 "codec_tag_string": "avc1",
 "codec_tag": "0x31637661",
 "width": 3840,
 "height": 2160,
 "coded_width": 3840,
 "coded_height": 2160,
 "closed_captions": 0,
 "film_grain": 0,
 "has_b_frames": 0,
 "pix_fmt": "yuv420p",
 "level": 51,
 "color_range": "tv",
 "color_space": "bt709",
 "color_transfer": "bt709",
 "color_primaries": "bt709",
 "chroma_location": "left",
 "field_order": "progressive",
 "refs": 1,
 "is_avc": "true",
 "nal_length_size": "4",
 "id": "0x1",
 "r_frame_rate": "30000/1001",
 "avg_frame_rate": "18200/607",
 "time_base": "1/600",
 "start_pts": 0,
 "start_time": "0.000000",
 "duration_ts": 10925,
 "duration": "18.208333",
 "bit_rate": "44900923",
 "bits_per_raw_sample": "8",
 "nb_frames": "546",
 "extradata_size": 158,
 "disposition": {
 "default": 1,
 "dub": 0,
 "original": 0,
 "comment": 0,
 "lyrics": 0,
 "karaoke": 0,
 "forced": 0,
 "hearing_impaired": 0,
 "visual_impaired": 0,
 "clean_effects": 0,
 "attached_pic": 0,
 "timed_thumbnails": 0,
 "non_diegetic": 0,
 "captions": 0,
 "descriptions": 0,
 "metadata": 0,
 "dependent": 0,
 "still_image": 0,
 "multilayer": 0
 },
 "tags": {
 "creation_time": "",
 "language": "und",
 "handler_name": "Core Media Video",
 "vendor_id": "[0][0][0][0]",
 "encoder": "H.264"
 }
 },
 {
 "index": 1,
 "codec_name": "aac",
 "codec_long_name": "AAC (Advanced Audio Coding)",
 "profile": "LC",
 "codec_type": "audio",
 "codec_tag_string": "mp4a",
 "codec_tag": "0x6134706d",
 "sample_fmt": "fltp",
 "sample_rate": "44100",
 "channels": 2,
 "channel_layout": "stereo",
 "bits_per_sample": 0,
 "initial_padding": 0,
 "id": "0x2",
 "r_frame_rate": "0/0",
 "avg_frame_rate": "0/0",
 "time_base": "1/44100",
 "start_pts": 0,
 "start_time": "0.000000",
 "duration_ts": 802988,
 "duration": "18.208345",
 "bit_rate": "187218",
 "nb_frames": "787",
 "extradata_size": 2,
 "disposition": {
 "default": 1,
 "dub": 0,
 "original": 0,
 "comment": 0,
 "lyrics": 0,
 "karaoke": 0,
 "forced": 0,
 "hearing_impaired": 0,
 "visual_impaired": 0,
 "clean_effects": 0,
 "attached_pic": 0,
 "timed_thumbnails": 0,
 "non_diegetic": 0,
 "captions": 0,
 "descriptions": 0,
 "metadata": 0,
 "dependent": 0,
 "still_image": 0,
 "multilayer": 0
 },
 "tags": {
 "creation_time": "",
 "language": "und",
 "handler_name": "Core Media Audio",
 "vendor_id": "[0][0][0][0]"
 }
 },
 {
 "index": 2,
 "codec_type": "data",
 "codec_tag_string": "mebx",
 "codec_tag": "0x7862656d",
 "id": "0x3",
 "r_frame_rate": "0/0",
 "avg_frame_rate": "0/0",
 "time_base": "1/600",
 "start_pts": 0,
 "start_time": "0.000000",
 "duration_ts": 10925,
 "duration": "18.208333",
 "bit_rate": "4",
 "nb_frames": "1",
 "disposition": {
 "default": 1,
 "dub": 0,
 "original": 0,
 "comment": 0,
 "lyrics": 0,
 "karaoke": 0,
 "forced": 0,
 "hearing_impaired": 0,
 "visual_impaired": 0,
 "clean_effects": 0,
 "attached_pic": 0,
 "timed_thumbnails": 0,
 "non_diegetic": 0,
 "captions": 0,
 "descriptions": 0,
 "metadata": 0,
 "dependent": 0,
 "still_image": 0,
 "multilayer": 0
 },
 "tags": {
 "creation_time": "",
 "language": "und",
 "handler_name": "Core Media Metadata"
 }
 },
 {
 "index": 3,
 "codec_type": "data",
 "codec_tag_string": "mebx",
 "codec_tag": "0x7862656d",
 "id": "0x4",
 "r_frame_rate": "0/0",
 "avg_frame_rate": "0/0",
 "time_base": "1/600",
 "start_pts": 0,
 "start_time": "0.000000",
 "duration_ts": 10925,
 "duration": "18.208333",
 "bit_rate": "6756",
 "nb_frames": "80",
 "disposition": {
 "default": 1,
 "dub": 0,
 "original": 0,
 "comment": 0,
 "lyrics": 0,
 "karaoke": 0,
 "forced": 0,
 "hearing_impaired": 0,
 "visual_impaired": 0,
 "clean_effects": 0,
 "attached_pic": 0,
 "timed_thumbnails": 0,
 "non_diegetic": 0,
 "captions": 0,
 "descriptions": 0,
 "metadata": 0,
 "dependent": 0,
 "still_image": 0,
 "multilayer": 0
 },
 "tags": {
 "creation_time": "",
 "language": "und",
 "handler_name": "Core Media Metadata"
 }
 },
 {
 "index": 4,
 "codec_type": "data",
 "codec_tag_string": "mebx",
 "codec_tag": "0x7862656d",
 "id": "0x5",
 "r_frame_rate": "0/0",
 "avg_frame_rate": "0/0",
 "time_base": "1/600",
 "start_pts": 0,
 "start_time": "0.000000",
 "duration_ts": 10925,
 "duration": "18.208333",
 "bit_rate": "50764",
 "nb_frames": "546",
 "disposition": {
 "default": 1,
 "dub": 0,
 "original": 0,
 "comment": 0,
 "lyrics": 0,
 "karaoke": 0,
 "forced": 0,
 "hearing_impaired": 0,
 "visual_impaired": 0,
 "clean_effects": 0,
 "attached_pic": 0,
 "timed_thumbnails": 0,
 "non_diegetic": 0,
 "captions": 0,
 "descriptions": 0,
 "metadata": 0,
 "dependent": 0,
 "still_image": 0,
 "multilayer": 0
 },
 "tags": {
 "creation_time": "",
 "language": "und",
 "handler_name": "Core Media Metadata"
 }
 },
 {
 "index": 5,
 "codec_type": "data",
 "codec_tag_string": "mebx",
 "codec_tag": "0x7862656d",
 "id": "0x6",
 "r_frame_rate": "0/0",
 "avg_frame_rate": "0/0",
 "time_base": "1/600",
 "start_pts": 0,
 "start_time": "0.000000",
 "duration_ts": 10925,
 "duration": "18.208333",
 "bit_rate": "19",
 "nb_frames": "1",
 "disposition": {
 "default": 1,
 "dub": 0,
 "original": 0,
 "comment": 0,
 "lyrics": 0,
 "karaoke": 0,
 "forced": 0,
 "hearing_impaired": 0,
 "visual_impaired": 0,
 "clean_effects": 0,
 "attached_pic": 0,
 "timed_thumbnails": 0,
 "non_diegetic": 0,
 "captions": 0,
 "descriptions": 0,
 "metadata": 0,
 "dependent": 0,
 "still_image": 0,
 "multilayer": 0
 },
 "tags": {
 "creation_time": "",
 "language": "und",
 "handler_name": "Core Media Metadata"
 }
 }
 ],
 "format": {
 "filename": "test.mov",
 "nb_streams": 6,
 "nb_programs": 0,
 "nb_stream_groups": 0,
 "format_name": "mov,mp4,m4a,3gp,3g2,mj2",
 "format_long_name": "QuickTime / MOV",
 "start_time": "0.000000",
 "duration": "18.208345",
 "size": "102801747",
 "bit_rate": "45166871",
 "probe_score": 100,
 "tags": {
 "major_brand": "qt ",
 "minor_version": "0",
 "compatible_brands": "qt ",
 "creation_time": "",
 "com.apple.quicktime.location.accuracy.horizontal": "76.200233",
 "com.apple.quicktime.full-frame-rate-playback-intent": "0",
 "com.apple.quicktime.location.ISO6709": "",
 "com.apple.quicktime.make": "Apple",
 "com.apple.quicktime.model": "iPhone 15 Pro",
 "com.apple.quicktime.software": "18.4.1",
 "com.apple.quicktime.creationdate": ""
 }
 }
}



-
Flutter ffmpeg_kit_flutter_new can't build Android app in any version
13 mai, par user31929I can't build my project on Android ( on Ios it works and the project itself without ffmpeg_kit_flutter_new builds without problems )
This is the error i obtain :


/GeneratedPluginRegistrant.java:51: error: cannot find symbol
 com.antonkarpenko.ffmpegkit.MainActivity.registerWith(shimPluginRegistry.registrarFor("com.antonkarpenko.ffmpegkit.MainActivity"));
 ^
 symbol: class MainActivity
 location: package com.antonkarpenko.ffmpegkit



This is my flutter doctor :


[✓] Flutter (Channel stable, 3.19.4, on macOS 15.4.1 24E263 darwin-x64, locale it-IT)
 • Flutter version 3.19.4 on channel stable at ….
 • Upstream repository https://github.com/flutter/flutter.git
 • Framework revision 68bfaea224 (1 year, 2 months ago), 2024-03-20 15:36:31 -0700
 • Engine revision a5c24f538d
 • Dart version 3.3.2
 • DevTools version 2.31.1

[✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
 • Android SDK at …..
 • Platform android-35, build-tools 34.0.0
 • Java binary at: /Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java
 • Java version OpenJDK Runtime Environment (build 17.0.7+0-17.0.7b1000.6-10550314)
 • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 16.3)
 • Xcode at /Applications/Xcode.app/Contents/Developer
 • Build 16E140
 • CocoaPods version 1.16.2

[✓] Chrome - develop for the web
 • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] Android Studio (version 2023.1)
 • Android Studio at /Applications/Android Studio.app/Contents
 • Flutter plugin can be installed from:
 🔨 https://plugins.jetbrains.com/plugin/9212-flutter
 • Dart plugin can be installed from:
 🔨 https://plugins.jetbrains.com/plugin/6351-dart
 • Java version OpenJDK Runtime Environment (build 17.0.7+0-17.0.7b1000.6-10550314)

[✓] VS Code (version 1.99.3)
 • VS Code at /Applications/Visual Studio Code.app/Contents
 • Flutter extension version 3.110.0

[✓] Connected device (5 available)
 • SM A135F (mobile) • RF8T40TMS6Z • android-arm • Android 12 (API 31)
 • cri SE 128 (mobile) • 00008030-001268303E38402E • ios • iOS 18.4.1 22E252
 • iPhone di WacMini (mobile) • 00008030-00121D543CE8802E • ios • iOS 18.4.1 22E252
 • macOS (desktop) • macos • darwin-x64 • macOS 15.4.1 24E263 darwin-x64
 • Chrome (web) • chrome • web-javascript • Google Chrome 136.0.7103.93

[✓] Network resources
 • All expected network resources are available.



My android/app/build.gradle


def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
 localPropertiesFile.withReader('UTF-8') { reader ->
 localProperties.load(reader)
 }
}

def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
 keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
 throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}

def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
 flutterVersionCode = '1'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
 flutterVersionName = '1.0'
}

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.google.firebase.crashlytics'
apply plugin: 'org.jetbrains.kotlin.android'


android {

 compileSdkVersion 35

 namespace = "com.app.app"
 sourceSets {
 main.java.srcDirs += 'src/main/kotlin'
 }

 defaultConfig {
 applicationId "com.appid.appid"
 minSdkVersion 24
 targetSdkVersion 35
 versionCode flutterVersionCode.toInteger()
 versionName flutterVersionName
 
 // insert this line of code in order to manage correct build abi configuration only on supported devices not supported tablet device emulator
 /* ndk {
 abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86_64'
 }*/
 }

 signingConfigs {
 release {
 keyAlias keystoreProperties['keyAlias']
 keyPassword keystoreProperties['keyPassword']
 storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
 storePassword keystoreProperties['storePassword']
 }
 }

 buildTypes {
 debug {
 debuggable true
 }

 release {
 signingConfig signingConfigs.release
 debuggable false
 shrinkResources true
 minifyEnabled true
 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
 }
 }

}

flutter {
 source '../..'
}

dependencies {
 implementation "org.jetbrains.kotlin:kotlin-stdlib:1.9.24"
}



My android/build.gradle


buildscript {
 ext.kotlin_version = '1.9.24'
 repositories {
 google()
 mavenCentral()
 jcenter()
 }

 dependencies {
 classpath 'com.android.tools.build:gradle:8.4.0'
 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
 classpath 'com.google.gms:google-services:4.3.14'
 classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1'
 }
}

allprojects {
 repositories {
 google()
 mavenCentral()
 jcenter()
 }

 
 subprojects {
 tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) {
 kotlinOptions.jvmTarget = "1.8"
 }
 afterEvaluate { project ->
 if (project.hasProperty('android')) {
 project.android {
 if (namespace == null) {
 namespace project.group
 }
 }
 }
 }
 }
 
}


ext {
 flutterFFmpegPackage = "min-gpl-lts"
}


rootProject.buildDir = '../build'
subprojects {
 project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
 project.evaluationDependsOn(':app')
}

tasks.register("clean", Delete) {
 delete rootProject.buildDir
}



My gradle.wrapper.properties


distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-all.zip



What i have already tried :


- 

- flutter clean/flutter pub get
- remove .gradle folder/flutter clean/flutter pub get
- remove GeneratedPluginRegistrant.java file then remove .gradle/flutter clean/flutter pub get








I have this issue in every version of the plugin. There is something wrong in my configurations or maybe this is a plugin issue ?