
Recherche avancée
Médias (2)
-
Rennes Emotion Map 2010-11
19 octobre 2011, par
Mis à jour : Juillet 2013
Langue : français
Type : Texte
-
Carte de Schillerkiez
13 mai 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Texte
Autres articles (100)
-
MediaSPIP en mode privé (Intranet)
17 septembre 2013, parÀ partir de la version 0.3, un canal de MediaSPIP peut devenir privé, bloqué à toute personne non identifiée grâce au plugin "Intranet/extranet".
Le plugin Intranet/extranet, lorsqu’il est activé, permet de bloquer l’accès au canal à tout visiteur non identifié, l’empêchant d’accéder au contenu en le redirigeant systématiquement vers le formulaire d’identification.
Ce système peut être particulièrement utile pour certaines utilisations comme : Atelier de travail avec des enfants dont le contenu ne doit pas (...) -
Formulaire personnalisable
21 juin 2013, parCette page présente les champs disponibles dans le formulaire de publication d’un média et il indique les différents champs qu’on peut ajouter. Formulaire de création d’un Media
Dans le cas d’un document de type média, les champs proposés par défaut sont : Texte Activer/Désactiver le forum ( on peut désactiver l’invite au commentaire pour chaque article ) Licence Ajout/suppression d’auteurs Tags
On peut modifier ce formulaire dans la partie :
Administration > Configuration des masques de formulaire. (...) -
Soumettre bugs et patchs
10 avril 2011Un logiciel n’est malheureusement jamais parfait...
Si vous pensez avoir mis la main sur un bug, reportez le dans notre système de tickets en prenant bien soin de nous remonter certaines informations pertinentes : le type de navigateur et sa version exacte avec lequel vous avez l’anomalie ; une explication la plus précise possible du problème rencontré ; si possibles les étapes pour reproduire le problème ; un lien vers le site / la page en question ;
Si vous pensez avoir résolu vous même le bug (...)
Sur d’autres sites (11333)
-
libavcodec/libx264 do not produce B-frames
6 novembre 2013, par Rob SchmidtI am writing an application in C++ that uses libavcodec with libx264 to encode video. However, the encoded data ended up being much larger than I expected. I analyzed the results and discovered that my encoding never produced B-frames, only I- and P-frames.
I created a standalone utility based on the ffmpeg source code and examples to test my encoder setup. It reads in an H.264 file, re-encodes the decoded frames, and outputs the result to a file using the ITU H.264 Annex B format. I also used ffmpeg to perform the same operation so I could compare against a known good implementation. My utility never outputs B-frames whereas ffmpeg does.
I have since tried to figure out what ffmpeg does that my code doesn’t. I first tried manually specifying encoder settings related to B-frames. This had no effect.
I then tried running both ffmpeg and my utility under gdb and comparing the contents of the AVStream, AVCodecContext, and X264Context prior to opening the encoder and manually setting any fields that appeared different. Even with identical settings, I still only produce I- and P-frames.
Finally, I thought that perhaps the problem was with my timestamp handling. I reworked my test utility to mimic the pipeline used by ffmpeg and to output timestamp debugging output like ffmpeg does. Even with my timestamps identical to ffmpeg’s I still get no B-frames.
At this point I don’t know what else to try. When I run ffmpeg, I run it with the command line below. Note that aside from the "superfast" preset, I pretty much use the default values.
ffmpeg -v debug -i ~/annexb.264 -codec:v libx264 -preset superfast -g 30 -f h264 ./out.264
The code that configures the encoder is listed below. It specifies the "superfast" preset too.
static AVStream *add_video_stream(AVFormatContext *output_ctx, AVCodec **output_codec, enum AVCodecID codec_id)
{
*output_codec = avcodec_find_encoder(codec_id);
if (*output_codec == NULL) {
printf("Could not find encoder for '%s' (%d)\n", avcodec_get_name(codec_id), codec_id);
return NULL;
}
AVStream *output_stream = avformat_new_stream(output_ctx, *output_codec);
if (output_stream == NULL) {
printf("Could not create video stream.\n");
return NULL;
}
output_stream->id = output_ctx->nb_streams - 1;
AVCodecContext *codec_ctx = output_stream->codec;
avcodec_get_context_defaults3(codec_ctx, *output_codec);
codec_ctx->width = 1280;
codec_ctx->height = 720;
codec_ctx->time_base.den = 15000;
codec_ctx->time_base.num = 1001;
/* codec_ctx->gop_size = 30;*/
codec_ctx->pix_fmt = AV_PIX_FMT_YUVJ420P;
// try to force B-frame output
/* codec_ctx->max_b_frames = 3;*/
/* codec_ctx->b_frame_strategy = 2;*/
output_stream->sample_aspect_ratio.num = 1;
output_stream->sample_aspect_ratio.den = 1;
codec_ctx->sample_aspect_ratio.num = 1;
codec_ctx->sample_aspect_ratio.den = 1;
codec_ctx->chroma_sample_location = AVCHROMA_LOC_LEFT;
codec_ctx->bits_per_raw_sample = 8;
if ((output_ctx->oformat->flags & AVFMT_GLOBALHEADER) != 0) {
codec_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER;
}
return output_stream;
}
int main(int argc, char **argv)
{
// ... open input file
avformat_alloc_output_context2(&output_ctx, NULL, "h264", output_path);
if (output_ctx == NULL) {
fprintf(stderr, "Unable to allocate output context.\n");
return 1;
}
AVCodec *output_codec = NULL;
output_stream = add_video_stream(output_ctx, &output_codec, output_ctx->oformat->video_codec);
if (output_stream == NULL) {
fprintf(stderr, "Error adding video stream to output context.\n");
return 1;
}
encode_ctx = output_stream->codec;
// seems to have no effect
#if 0
if (decode_ctx->extradata_size != 0) {
size_t extradata_size = decode_ctx->extradata_size;
printf("extradata_size: %zu\n", extradata_size);
encode_ctx->extradata = av_mallocz(extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
memcpy(encode_ctx->extradata, decode_ctx->extradata, extradata_size);
encode_ctx->extradata_size = extradata_size;
}
#endif // 0
AVDictionary *opts = NULL;
av_dict_set(&opts, "preset", "superfast", 0);
// av_dict_set(&opts, "threads", "auto", 0); // seems to have no effect
ret = avcodec_open2(encode_ctx, output_codec, &opts);
if (ret < 0) {
fprintf(stderr, "Unable to open output video cocec: %s\n", av_err2str(ret));
return 1;
}
// ... decoding/encoding loop, clean up, etc.
return 0;
}My test utility produces the following debug output in which you can see there are no B-frames produced :
[libx264 @ 0x1b8c9c0] using mv_range_thread = 56
[libx264 @ 0x1b8c9c0] using SAR=1/1
[libx264 @ 0x1b8c9c0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
[libx264 @ 0x1b8c9c0] profile High, level 3.1
Output #0, h264, to './out.264':
Stream #0:0, 0, 1/90000: Video: h264, yuvj420p, 1280x720 [SAR 1:1 DAR 16:9], 1001/15000, q=-1--1, 90k tbn, 14.99 tbc
<snip>
[libx264 @ 0x1b8c9c0] frame= 0 QP=17.22 NAL=3 Slice:I Poc:0 I:3600 P:0 SKIP:0 size=122837 bytes
[libx264 @ 0x1b8c9c0] frame= 1 QP=18.03 NAL=2 Slice:P Poc:2 I:411 P:1825 SKIP:1364 size=25863 bytes
[libx264 @ 0x1b8c9c0] frame= 2 QP=17.03 NAL=2 Slice:P Poc:4 I:369 P:2159 SKIP:1072 size=37880 bytes
[libx264 @ 0x1b8c9c0] frame= 3 QP=16.90 NAL=2 Slice:P Poc:6 I:498 P:2330 SKIP:772 size=50509 bytes
[libx264 @ 0x1b8c9c0] frame= 4 QP=16.68 NAL=2 Slice:P Poc:8 I:504 P:2233 SKIP:863 size=50791 bytes
[libx264 @ 0x1b8c9c0] frame= 5 QP=16.52 NAL=2 Slice:P Poc:10 I:513 P:2286 SKIP:801 size=51820 bytes
[libx264 @ 0x1b8c9c0] frame= 6 QP=16.49 NAL=2 Slice:P Poc:12 I:461 P:2293 SKIP:846 size=51311 bytes
[libx264 @ 0x1b8c9c0] frame= 7 QP=16.65 NAL=2 Slice:P Poc:14 I:476 P:2287 SKIP:837 size=51196 bytes
[libx264 @ 0x1b8c9c0] frame= 8 QP=16.66 NAL=2 Slice:P Poc:16 I:508 P:2240 SKIP:852 size=51577 bytes
[libx264 @ 0x1b8c9c0] frame= 9 QP=16.55 NAL=2 Slice:P Poc:18 I:477 P:2278 SKIP:845 size=51531 bytes
[libx264 @ 0x1b8c9c0] frame= 10 QP=16.67 NAL=2 Slice:P Poc:20 I:517 P:2233 SKIP:850 size=51946 bytes
<snip>
[libx264 @ 0x1b8c9c0] frame I:7 Avg QP:13.71 size:152207
[libx264 @ 0x1b8c9c0] frame P:190 Avg QP:16.66 size: 50949
[libx264 @ 0x1b8c9c0] mb I I16..4: 27.1% 30.8% 42.1%
[libx264 @ 0x1b8c9c0] mb P I16..4: 6.8% 6.0% 0.8% P16..4: 61.8% 0.0% 0.0% 0.0% 0.0% skip:24.7%
[libx264 @ 0x1b8c9c0] 8x8 transform intra:41.2% inter:86.9%
[libx264 @ 0x1b8c9c0] coded y,uvDC,uvAC intra: 92.2% 28.3% 5.4% inter: 50.3% 1.9% 0.0%
[libx264 @ 0x1b8c9c0] i16 v,h,dc,p: 7% 7% 77% 8%
[libx264 @ 0x1b8c9c0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 7% 15% 49% 6% 4% 3% 5% 3% 8%
[libx264 @ 0x1b8c9c0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 19% 25% 24% 6% 7% 4% 6% 3% 6%
[libx264 @ 0x1b8c9c0] i8c dc,h,v,p: 72% 14% 10% 4%
[libx264 @ 0x1b8c9c0] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x1b8c9c0] kb/s:6539.11
</snip></snip>ffmpeg, on the other hand, produces the following output that is almost identical but includes B-frames :
[libx264 @ 0x20b9c40] using mv_range_thread = 56
[libx264 @ 0x20b9c40] using SAR=1/1
[libx264 @ 0x20b9c40] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
[libx264 @ 0x20b9c40] profile High, level 3.1
[h264 @ 0x20b8160] detected 4 logical cores
Output #0, h264, to './out.264':
Metadata:
encoder : Lavf54.63.104
Stream #0:0, 0, 1/90000: Video: h264, yuvj420p, 1280x720 [SAR 1:1 DAR 16:9], 1001/15000, q=-1--1, 90k tbn, 14.99 tbc
Stream mapping:
Stream #0:0 -> #0:0 (h264 -> libx264)
<snip>
[libx264 @ 0x20b9c40] frame= 0 QP=17.22 NAL=3 Slice:I Poc:0 I:3600 P:0 SKIP:0 size=122835 bytes
[libx264 @ 0x20b9c40] frame= 1 QP=18.75 NAL=2 Slice:P Poc:8 I:984 P:2045 SKIP:571 size=54208 bytes
[libx264 @ 0x20b9c40] frame= 2 QP=19.40 NAL=2 Slice:B Poc:4 I:447 P:1581 SKIP:1572 size=24930 bytes
[libx264 @ 0x20b9c40] frame= 3 QP=19.78 NAL=0 Slice:B Poc:2 I:199 P:1002 SKIP:2399 size=10717 bytes
[libx264 @ 0x20b9c40] frame= 4 QP=20.19 NAL=0 Slice:B Poc:6 I:204 P:1155 SKIP:2241 size=15937 bytes
[libx264 @ 0x20b9c40] frame= 5 QP=18.11 NAL=2 Slice:P Poc:16 I:990 P:2221 SKIP:389 size=64240 bytes
[libx264 @ 0x20b9c40] frame= 6 QP=19.35 NAL=2 Slice:B Poc:12 I:439 P:1784 SKIP:1377 size=34048 bytes
[libx264 @ 0x20b9c40] frame= 7 QP=19.88 NAL=0 Slice:B Poc:10 I:275 P:1035 SKIP:2290 size=16911 bytes
[libx264 @ 0x20b9c40] frame= 8 QP=19.91 NAL=0 Slice:B Poc:14 I:257 P:1270 SKIP:2073 size=19172 bytes
[libx264 @ 0x20b9c40] frame= 9 QP=17.90 NAL=2 Slice:P Poc:24 I:962 P:2204 SKIP:434 size=67439 bytes
[libx264 @ 0x20b9c40] frame= 10 QP=18.84 NAL=2 Slice:B Poc:20 I:474 P:1911 SKIP:1215 size=37742 bytes
<snip>
[libx264 @ 0x20b9c40] frame I:7 Avg QP:15.95 size:130124
[libx264 @ 0x20b9c40] frame P:52 Avg QP:17.78 size: 64787
[libx264 @ 0x20b9c40] frame B:138 Avg QP:19.32 size: 26231
[libx264 @ 0x20b9c40] consecutive B-frames: 6.6% 0.0% 0.0% 93.4%
[libx264 @ 0x20b9c40] mb I I16..4: 30.2% 35.2% 34.6%
[libx264 @ 0x20b9c40] mb P I16..4: 13.9% 11.4% 0.3% P16..4: 60.4% 0.0% 0.0% 0.0% 0.0% skip:13.9%
[libx264 @ 0x20b9c40] mb B I16..4: 5.7% 3.3% 0.0% B16..8: 15.8% 0.0% 0.0% direct:25.7% skip:49.5% L0:43.2% L1:37.3% BI:19.5%
[libx264 @ 0x20b9c40] 8x8 transform intra:39.4% inter:77.2%
[libx264 @ 0x20b9c40] coded y,uvDC,uvAC intra: 90.7% 26.6% 3.0% inter: 34.0% 4.1% 0.0%
[libx264 @ 0x20b9c40] i16 v,h,dc,p: 7% 7% 77% 9%
[libx264 @ 0x20b9c40] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 7% 16% 51% 5% 4% 3% 5% 3% 7%
[libx264 @ 0x20b9c40] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 22% 27% 20% 6% 6% 3% 6% 3% 6%
[libx264 @ 0x20b9c40] i8c dc,h,v,p: 71% 15% 11% 3%
[libx264 @ 0x20b9c40] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x20b9c40] kb/s:4807.16
</snip></snip>I’m sure I’m missing something simple, but I can’t for the life of me see what it is. Any assistance would be greatly appreciated.
-
Error with FFmpeg and FS in React : "ErrnoError : FS error"
23 juillet 2024, par namwanI'm working on a React application where I'm using the @ffmpeg/ffmpeg library to compress images and videos. I'm facing an issue with the virtual file system (FS) when trying to read and write files using FFmpeg. I'm getting the following error :


ErrnoError: FS error



Here's the relevant part of my code :


import React, { useState } from "react";
import { FFmpeg } from "@ffmpeg/ffmpeg";

const ffmpeg = new FFmpeg();

const fetchFile = async (filePath) => {
 const file = await ffmpeg.readFile(filePath);
 alert("hello");
 return new Uint8Array(file).buffer;
};


const Main = () => {
 const [file, setFile] = useState(null);
 const [compressedFile, setCompressedFile] = useState("");

 const loadFFmpeg = async () => {
 if (!ffmpeg.isLoaded) {
 await ffmpeg.load();
 }
 }; 

 const getFile = (event) => {
 const selectedFile = event.target.files[0];
 
 if (selectedFile) {
 setFile(selectedFile);
 }
 };

 const compressImage = (selectedFile) => {
 const img = new Image();
 img.src = URL.createObjectURL(selectedFile);
 img.onload = () => {
 const canvas = document.createElement('canvas');
 const MAX_WIDTH = 300;
 const MAX_HEIGHT = 300;
 let width = img.width;
 let height = img.height;

 if (width > height) {
 if (width > MAX_WIDTH) {
 height *= MAX_WIDTH / width;
 width = MAX_WIDTH;
 }
 } else {
 if (height > MAX_HEIGHT) {
 width *= MAX_HEIGHT / height;
 height = MAX_HEIGHT;
 }
 }

 canvas.width = width;
 canvas.height = height;
 const ctx = canvas.getContext('2d');
 ctx.drawImage(img, 0, 0, width, height);
 const dataUrl = canvas.toDataURL('image/jpeg', 1.0);
 setCompressedFile(dataUrl);
 };
 };

 const compressVideo = async (selectedFile) => {
 try {
 await loadFFmpeg();
 
 const arrayBuffer = await selectedFile.arrayBuffer();
 const fileName = selectedFile.name;
 
 await ffmpeg.writeFile(fileName, new Uint8Array(arrayBuffer));
 
 await ffmpeg.exec(
 '-i',
 fileName,
 '-vf',
 'scale=640:-1',
 '-c:a',
 'aac',
 '-strict',
 '-2',
 'output.mp4'
 );
 
 const data = await fetchFile('output.mp4');
 const compressedVideoBlob = new Blob([data], { type: 'video/mp4' });
 const compressedVideoUrl = URL.createObjectURL(compressedVideoBlob);
 setCompressedFile(compressedVideoUrl);
 
 await ffmpeg.unlink(fileName);
 await ffmpeg.unlink('output.mp4');
 
 alert('Compression successful');
 } catch (error) {
 console.error('Error:', error);
 alert('Compression failed. Please check the console for more details.');
 }
 };
 

 const handleSubmit = async (e) => {
 e.preventDefault();

 if (file) {
 const fileType = file.name.split('.').pop().toLowerCase();

 if (fileType === 'png' || fileType === 'jpg' || fileType === 'jpeg') {
 compressImage(file);
 } else if (fileType === 'mp4' || fileType === 'h264') {
 compressVideo(file);
 } else {
 alert('Please select a valid file type (png, jpg, jpeg for images or mp4, h264 for videos).');
 }
 }
 };

 const handleDownload = () => {
 if (file) {
 const downloadLink = document.createElement('a');
 downloadLink.href = compressedFile;

 const fileExtension = file.name.split('.').pop().toLowerCase();

 downloadLink.download = `compressed_file.${fileExtension}`;
 
 document.body.appendChild(downloadLink);
 downloadLink.click();
 document.body.removeChild(downloadLink);
 }
 };

 return (
 <>
 <h1>Main Page</h1>
 <form>
 <label>Upload</label>
 <input type="'file'" />
 <br /><br />
 <input type="submit" value="Compress" />
 </form>
 {compressedFile && (
 <>
 <h2>Compressed File Preview</h2>
 {file && file.name && ( 
 file.name.split('.').pop().toLowerCase() === 'mp4' || file.name.split('.').pop().toLowerCase() === 'h264' ? (
 <video width="300" controls="controls">
 <source src="{compressedFile}" type="video/mp4"></source>
 Your browser does not support the video tag.
 </video>
 ) : (
 <img src="http://stackoverflow.com/feeds/tag/{compressedFile}" alt="Compressed file preview" style='max-width: 300px; max-height: 300px' />
 )
 )}
 <br /><br />
 <button>Download Compressed File</button>
 >
 )}
 >
 );
};

export default Main;



I'm using ffmpeg.readFile and ffmpeg.writeFile to read and write files to FFmpeg's virtual file system. I've also tried using ffmpeg.read and ffmpeg.write but still encounter the same issue.


Could someone please help me understand what might be causing this FS error and how to resolve it ?


-
getting a `InValid URL` when I send a voice message
9 septembre 2023, par AmmadWhen I try to send voice messages I always get invalid url error with. I am using whisper to convert the audio to text but for some reason I cannot seem to pass the file to the whisper. It worked when I used this in java script but not in typescript for some reason


async function createFile(path: string): Promise<file> {
 const response = await fetch(path);
 const data = await response.blob();
 
 // Extract file name from the path
 const fileName = path.split('/').pop() || 'unknown';
 
 // Extract file extension and determine MIME type
 const fileExtension = fileName.split('.').pop()?.toLowerCase() || '';
 const mimeTypes: Record = {
 'mp3': 'audio/mpeg',
 // Add more mappings as needed
 };
 const fileType = mimeTypes[fileExtension] || 'application/octet-stream';
 
 const metadata = {
 type: fileType
 };
 
 return new File([data], fileName, metadata);
}

async function sendAudioForTranscription(file_path:string) {
 try {
 
 // const audioData = fs.createReadStream(file_path);
 const audioFile = await createFile(file_path)

 const response = await openai.createTranscription(audioFile, "whisper-1");
 const transcribed = response.data.text;

 return transcribed;
 } catch (error) {
 console.error("Error transcribing the audio:", error);
 return null;
 }
}
</file>


I am new to this so any help would be appreciated. This is the error


Error transcribing the audio: TypeError: Failed to parse URL from src\audio_files\false_xxxxxxxxx8@c.us_B161BC6FA04DB01B8B31F5E0F83EDAD5.mp3
 at Object.fetch (node:internal/deps/undici/undici:11576:11)
 at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {
 [cause]: TypeError [ERR_INVALID_URL]: Invalid URL
 at new NodeError (node:internal/errors:405:5)
 at new URL (node:internal/url:778:13)
 at new Request (node:internal/deps/undici/undici:7132:25)
 at fetch2 (node:internal/deps/undici/undici:10715:25)
 at Object.fetch (node:internal/deps/undici/undici:11574:18)
 at fetch (node:internal/process/pre_execution:270:25)
 at C:\Users\Ammad Ali\Documents\Documents\alex-whatsapp-bot\build\openai\transcript.js:28:32
 at C:\Users\Ammad Ali\Documents\Documents\alex-whatsapp-bot\build\openai\transcript.js:8:71
 at new Promise (<anonymous>)
 at __awaiter (C:\Users\Ammad Ali\Documents\Documents\alex-whatsapp-bot\build\openai\transcript.js:4:12)
 at createFile (C:\Users\Ammad Ali\Documents\Documents\alex-whatsapp-bot\build\openai\transcript.js:27:12)
 at Object.<anonymous> (C:\Users\Ammad Ali\Documents\Documents\alex-whatsapp-bot\build\openai\transcript.js:49:37)
 at Generator.next (<anonymous>)
 at C:\Users\Ammad Ali\Documents\Documents\alex-whatsapp-bot\build\openai\transcript.js:8:71
 at new Promise (<anonymous>) {
 input: 'src\\audio_files\\false_xxxxxxxxx8@c.us_B161BC6FA04DB01B8B31F5E0F83EDAD5.mp3',
 code: 'ERR_INVALID_URL'
 }
}
</anonymous></anonymous></anonymous></anonymous>


To get a response back in voice message