
Recherche avancée
Médias (9)
-
Stereo master soundtrack
17 octobre 2011, par
Mis à jour : Octobre 2011
Langue : English
Type : Audio
-
Elephants Dream - Cover of the soundtrack
17 octobre 2011, par
Mis à jour : Octobre 2011
Langue : English
Type : Image
-
#7 Ambience
16 octobre 2011, par
Mis à jour : Juin 2015
Langue : English
Type : Audio
-
#6 Teaser Music
16 octobre 2011, par
Mis à jour : Février 2013
Langue : English
Type : Audio
-
#5 End Title
16 octobre 2011, par
Mis à jour : Février 2013
Langue : English
Type : Audio
-
#3 The Safest Place
16 octobre 2011, par
Mis à jour : Février 2013
Langue : English
Type : Audio
Autres articles (105)
-
L’agrémenter visuellement
10 avril 2011MediaSPIP est basé sur un système de thèmes et de squelettes. Les squelettes définissent le placement des informations dans la page, définissant un usage spécifique de la plateforme, et les thèmes l’habillage graphique général.
Chacun peut proposer un nouveau thème graphique ou un squelette et le mettre à disposition de la communauté. -
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 -
Ajouter des informations spécifiques aux utilisateurs et autres modifications de comportement liées aux auteurs
12 avril 2011, parLa manière la plus simple d’ajouter des informations aux auteurs est d’installer le plugin Inscription3. Il permet également de modifier certains comportements liés aux utilisateurs (référez-vous à sa documentation pour plus d’informations).
Il est également possible d’ajouter des champs aux auteurs en installant les plugins champs extras 2 et Interface pour champs extras.
Sur d’autres sites (8215)
-
Anomalie #3403 (Nouveau) : Notice dans le forum de l’espace privé
8 mars 2015, par Franck Dalotphp 5.6.4
prefix des tables : spipdev2
SPIP 3.1.0-alpha [21929]Dans ecrire/ ?exec=forum&repondre=new si le message ou le titre contient moins de 10 caractères apparait :
Notice : Undefined variable : ajouter_mot in C :\EasyPHP-DevServer-14.1VC11\data\localweb\projects\spipdev2\plugins-dist\forum\formulaires\forum_prive.php on line 82 -
FFMPEG command from Python 3.5 does not actually create audio file
20 décembre 2017, par Nathan BlaineI have a Django web application that accepts user uploaded videos/audio and saves them into a folder ’../WebAppDirectory/media/recordings’.
I am then using a speech to text API to get a rough transcription of the audio. This is working fine for .wav and .mp4 files, but the web app also accepts videos (.MOV) that I would like to first convert to .wav, then pass off to the API.
Using ffmpeg from my command line like this
ffmpeg -i C:\Users\Nathan\Desktop\MeetingRecorderWebAPP\media\recordings\upload_sample.MOV -ab 160k -ac 2 -ar 44100 -vn upload_sample.wav
Correctly creates the .wav file from the original .MOV.
However, when I run this from python with
subprocess.check_call(command, shell=True)
ffmpeg responds with
File ’upload_sample.wav’ already exists. Overwrite ? [y/N]
While Python tells me
FileNotFoundError : [Errno 2] No such file or directory : ’C :\Users\Nathan\Desktop\MeetingRecorderWebAPP\media\recordings\upload_sample.wav’
It is also worth noting that I do not see a ’upload_sample.wav’ file in the media/recordings/ directory.
This leads me to believe that maybe Python and ffmpeg are looking in different folders, but I am not sure where I am going wrong. When I print the command from the subprocess.check_call and copy/paste it into cmd, the file is created as expected.
Hoping someone with some experience with ffmpeg/Python subprocess can help shed some light ! Here are the files I am working with :
Folder Structure
DjangoWebApp
|---media
|---|---imgs
|---|---recordings
|---|---|---upload_sample.MOV
|---uploaded_audio_to_text.pyuploaded_audio_to_text.py
import speech_recognition as sr
from os import path
import os
import subprocess
def speech_to_text(file_name):
AUDIO_FILE = path.join(path.dirname(path.realpath(__file__)), 'media','recordings', file_name)
print("Looking at path: ",AUDIO_FILE)
# get extension
AUDIO_FILE_EXT = os.path.splitext(AUDIO_FILE)[1]
if(AUDIO_FILE_EXT == '.MOV'):
print("File is not .wav: ", AUDIO_FILE_EXT, "found. Converting...")
# We will use subprocess and ffmpeg to convert this .MOV file to .wav, so we can send to API
temp_wav = os.path.splitext(file_name)[0] + '.wav'
print("New audio file will be: ", temp_wav)
# build CMD ffmpeg command
command = "ffmpeg -i "
command += AUDIO_FILE
command += " -ab 160k -ac 2 -ar 44100 -vn "
command += temp_wav
print("Attempting to run this command: \n",command)
print(subprocess.check_call(command, shell=True))
print("Past Subprocess.call")
AUDIO_FILE = path.join(path.dirname(path.realpath(__file__)), 'media','recordings', temp_wav)
print("AUDIO_FILE now set to: ", AUDIO_FILE)
else:
# continue with what we are doing
pass
r = sr.Recognizer()
with sr.AudioFile(AUDIO_FILE) as source:
audio = r.record(source) # read the entire audio file
text_transcription = "Sentinel"
# recognize speech using Microsoft Bing Voice Recognition
BING_KEY = "MY_KEY_:)"
try:
text_transcription = r.recognize_bing(audio, key=BING_KEY)
except sr.UnknownValueError:
print("Microsoft Bing Voice Recognition could not understand audio")
except sr.RequestError as e:
print("Could not request results from Microsoft Bing Voice Recognition service; {0}".format(e))
return text_transcription
#my tests
my_relative_file_path = "upload_sample.MOV"
print(speech_to_text(my_relative_file_path))Console output (traceback and my print()’s)
Looking at path: C:\Users\Nathan\Desktop\MeetingRecorderWebAPP\media\recordings\upload_sample.MOV
File is not .wav: .MOV found. Converting...
New audio file will be: upload_sample.wav Attempting to run this command:
ffmpeg -i C:\Users\Nathan\Desktop\MeetingRecorderWebAPP\media\recordings\upload_sample.MOV -ab 160k -ac 2 -ar 44100 -vn upload_sample.wav
ffmpeg version git-2017-12-18-74f408c Copyright (c) 2000-2017 the FFmpeg developers built with gcc 7.2.0 (GCC)
----REMOVED SOME FFMPEG OUTPUT FOR BREVITY----
File 'upload_sample.wav' already exists. Overwrite ? [y/N] y
Stream mapping: Stream #0:1 -> #0:0 (aac (native) -> pcm_s16le (native)) Press [q] to stop, [?] for help Output #0, wav, to 'upload_sample.wav': Metadata:
major_brand : qt
minor_version : 0
compatible_brands: qt
com.apple.quicktime.creationdate: 2017-12-19T16:06:10-0500
com.apple.quicktime.make: Apple
com.apple.quicktime.model: iPhone 6
com.apple.quicktime.software: 10.3.3
ISFT : Lavf58.3.100
Stream #0:0(und): Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s (default)
Metadata:
creation_time : 2017-12-19T21:06:11.000000Z
handler_name : Core Media Data Handler
encoder : Lavc58.8.100 pcm_s16le size= 1036kB time=00:00:06.01 bitrate=1411.3kbits/s speed=N/A video:0kB audio:1036kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.007352%
0
Traceback (most recent call last): Past Subprocess.call
File "C:\Users\Nathan\Desktop\MeetingRecorderWebAPP\uploaded_audio_to_text.py", line 53, in <module>
AUDIO_FILE now set to: C:\Users\Nathan\Desktop\MeetingRecorderWebAPP\media\recordings\upload_sample.wav
print(speech_to_text(my_relative_file_path))
File "C:\Users\Nathan\Desktop\MeetingRecorderWebAPP\uploaded_audio_to_text.py", line 36, in speech_to_text
with sr.AudioFile(AUDIO_FILE) as source:
File "C:\Users\Nathan\AppData\Local\Programs\Python\Python36-32\lib\site-packages\speech_recognition\__init__.py", line 203, in __enter__
self.audio_reader = wave.open(self.filename_or_fileobject, "rb")
File "C:\Users\Nathan\AppData\Local\Programs\Python\Python36-32\lib\wave.py", line 499, in open
return Wave_read(f)
File "C:\Users\Nathan\AppData\Local\Programs\Python\Python36-32\lib\wave.py", line 159, in __init__
f = builtins.open(f, 'rb')
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\Nathan\\Desktop\\MeetingRecorderWebAPP\\media\\recordings\\upload_sample.wav'
Process finished with exit code 1
</module> -
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": ""
 }
 }
}