
Recherche avancée
Autres articles (18)
-
Les tâches Cron régulières de la ferme
1er décembre 2010, parLa gestion de la ferme passe par l’exécution à intervalle régulier de plusieurs tâches répétitives dites Cron.
Le super Cron (gestion_mutu_super_cron)
Cette tâche, planifiée chaque minute, a pour simple effet d’appeler le Cron de l’ensemble des instances de la mutualisation régulièrement. Couplée avec un Cron système sur le site central de la mutualisation, cela permet de simplement générer des visites régulières sur les différents sites et éviter que les tâches des sites peu visités soient trop (...) -
Les formats acceptés
28 janvier 2010, parLes commandes suivantes permettent d’avoir des informations sur les formats et codecs gérés par l’installation local de ffmpeg :
ffmpeg -codecs ffmpeg -formats
Les format videos acceptés en entrée
Cette liste est non exhaustive, elle met en exergue les principaux formats utilisés : h264 : H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 m4v : raw MPEG-4 video format flv : Flash Video (FLV) / Sorenson Spark / Sorenson H.263 Theora wmv :
Les formats vidéos de sortie possibles
Dans un premier temps on (...) -
Ajouter notes et légendes aux images
7 février 2011, parPour pouvoir ajouter notes et légendes aux images, la première étape est d’installer le plugin "Légendes".
Une fois le plugin activé, vous pouvez le configurer dans l’espace de configuration afin de modifier les droits de création / modification et de suppression des notes. Par défaut seuls les administrateurs du site peuvent ajouter des notes aux images.
Modification lors de l’ajout d’un média
Lors de l’ajout d’un média de type "image" un nouveau bouton apparait au dessus de la prévisualisation (...)
Sur d’autres sites (3914)
-
Fast method for adding text watermark to only first 25 frames using ffmpeg
4 février 2023, par SarkarI am looking to add a text watermark to the first 25 frames of a video using ffmpeg. I have already tried the following command but it takes a long time as it processes the entire video :


ffmpeg -i input.mp4 -vf "drawtext=fontfile=arial.ttf: text='Watermark': fontsize=24: fontcolor=white: x=(w-text_w)/2: y=(h-text_h)/2: enable='between(n,0,24)'" -c:a copy output.mp4



I need the encoding to be fast as I plan to make this change on the fly when streaming the video to the user. Is there a way to do this efficiently, such that the rest of the video remains unedited ?


-
Trying to decode and encode audio files with the FFMPEG C API
1er février 2023, par Giulio IacominoMy ultimate goal will be to split multi channel WAV files into single mono ones, after few days of experiments my plan is the sequence :


- 

- Decode audio file into a frame.
- Convert interleaved frame into a planar one. (in order to separate the data buffer into multiple ones)
- Grab the planar frame buffers and encode each of them into a new file.








So far I'm stuck trying to convert a wav file from interleaved to a planar one, and reprint the wav file.


edit :
I've turned on guard malloc and apparently the error is within the convert function


Here's the code :


AVCodecContext* initializeAndOpenCodecContext(AVFormatContext* formatContext, AVStream* stream){
 // grab our stream, most audio files only have one anyway
 const AVCodec* decoder = avcodec_find_decoder(stream->codecpar->codec_id);
 if (!decoder){
 std::cout << "no decoder, can't go ahead!\n";
 return nullptr;
 }
 AVCodecContext* codecContext = avcodec_alloc_context3(decoder);
 avcodec_parameters_to_context(codecContext, stream->codecpar);
 int err = avcodec_open2(codecContext, decoder, nullptr);
 if (err < 0){
 std::cout << "couldn't open codex!\n";
 }
 return codecContext;
}

void initialiseResampler(SwrContext* resampler, AVFrame* inputFrame, AVFrame* outputFrame){
 av_opt_set_chlayout(resampler, "in_channel_layout", &inputFrame->ch_layout, 0);
 av_opt_set_chlayout(resampler, "out_channel_layout", &outputFrame->ch_layout, 0);
 av_opt_set_int(resampler, "in_sample_fmt", inputFrame->format, 0);
 av_opt_set_int(resampler, "out_sample_fmt", AV_SAMPLE_FMT_FLTP, 0);
 av_opt_set_int(resampler, "in_sample_rate", inputFrame->sample_rate, 0);
 av_opt_set_int(resampler, "out_sample_rate", outputFrame->sample_rate, 0);
}

AVFrame* initialisePlanarFrame(AVFrame* frameToInit, AVFrame* inputFrame){
 //AVFrame *planar_frame = av_frame_alloc();
 frameToInit->nb_samples = inputFrame->nb_samples;
 frameToInit->ch_layout = inputFrame->ch_layout;
 frameToInit->format = AV_SAMPLE_FMT_FLTP;
 frameToInit->sample_rate = inputFrame->sample_rate;
 return nullptr;
}

int main() {
 AVCodecContext *codingContext= NULL;
 const AVCodec *codec;
 codec = avcodec_find_encoder(AV_CODEC_ID_PCM_F32LE);
 codingContext = avcodec_alloc_context3(codec);
 codingContext->bit_rate = 16000;
 codingContext->sample_fmt = AV_SAMPLE_FMT_FLT;
 codingContext->sample_rate = 48000;
 codingContext->ch_layout.nb_channels = 2;
 codingContext->ch_layout.order = (AVChannelOrder)0;
 uint8_t **buffer_ = NULL;
 AVFrame* planar_frame = NULL;
 
 // open input
 AVFormatContext* formatContext = nullptr;
 int err = avformat_open_input(&formatContext, "/Users/tonytorm/Desktop/drum kits/DECAP - Drums That Knock Vol. 9/Kicks/Brash Full Metal Kick.wav", nullptr, nullptr);
 if (err < 0){
 fprintf(stderr, "Unable to open file!\n");
 return;
 }

 // find audio stream
 err = avformat_find_stream_info(formatContext, nullptr);
 if (err > 0){
 fprintf(stderr, "Unable to retrieve stream info!\n");
 return;
 }
 
 int index = av_find_best_stream(formatContext, AVMEDIA_TYPE_AUDIO, -1, -1, nullptr, 0);
 if (index < 0){
 std::cout<< "coudn't find audio stream in this file" << '\n';
 }
 AVStream* stream = formatContext->streams[index];
 
 auto fileName = "/Users/tonytorm/Desktop/newFile.wav";
 FILE* newFile = fopen(fileName, "w+");
 
 // find right codec and open it
 if (auto openCodecContext = initializeAndOpenCodecContext(formatContext, stream)){
 AVPacket* packet = av_packet_alloc();
 AVFrame* frame = av_frame_alloc();
 AVFrame* planar_frame = av_frame_alloc();
 SwrContext *avr = swr_alloc(); //audio resampling context
 AVChannelLayout monoChannelLayout{(AVChannelOrder)0};
 monoChannelLayout.nb_channels = 2;
 

 while (!av_read_frame(formatContext, packet)){
 if (packet->stream_index != stream->index) continue; // we only care about audio
 int ret = avcodec_send_packet(openCodecContext, packet);
 if ( ret < 0) {
 if (ret != AVERROR(EAGAIN)){ // if error is actual error not EAGAIN
 std::cout << "can't do shit\n";
 return;
 }
 }
 while (int bret = avcodec_receive_frame(openCodecContext, frame) == 0){
 initialisePlanarFrame(planar_frame, frame);
 
 
 
 int buffer_size_in = av_samples_get_buffer_size(nullptr,
 frame->ch_layout.nb_channels,
 frame->nb_samples,
 (AVSampleFormat)frame->format,
 0);
 int buffer_size_out = buffer_size_in/frame->ch_layout.nb_channels;

 //planar_frame->linesize[0] = buffer_size_out;
 
 int ret = av_samples_alloc(planar_frame->data,
 NULL,
 planar_frame->ch_layout.nb_channels,
 planar_frame->nb_samples,
 AV_SAMPLE_FMT_FLTP,
 0);
 
 initialiseResampler(avr, frame, planar_frame);
 if (int errRet = swr_init(avr) < 0) {
 fprintf(stderr, "Failed to initialize the resampling context\n");
 }

 if (ret < 0){
 char error_message[AV_ERROR_MAX_STRING_SIZE];
 av_strerror(ret, error_message, AV_ERROR_MAX_STRING_SIZE);
 fprintf(stderr, "Error allocating sample buffer: %s\n", error_message);
 return -1;
 }
 
 int samples_converted = swr_convert(avr,
 planar_frame->data,
 buffer_size_out,
 (const uint8_t **)frame->data,
 buffer_size_in);
 if (samples_converted < 0) {
 // handle error
 std::cout << "error in conversion\n";
 return;
 }
 if (avcodec_open2(codingContext, codec, NULL) < 0) {
 std::cout << "can't encode!\n";
 return;
 }
 AVPacket* nu_packet = av_packet_alloc();
 while (int copy = avcodec_send_frame(codingContext, planar_frame) != 0){
 if (copy == AVERROR(EAGAIN) || copy == AVERROR_EOF){
 std::cout << "can't encode file\n";
 return;
 }
 if (avcodec_receive_packet(codingContext, nu_packet) >=0){
 fwrite(nu_packet->data, 4, nu_packet->size, newFile);
 //av_write_frame(avc, nu_packet);
 }
 }
 av_freep(planar_frame->data);
 av_frame_unref(frame);
 av_frame_unref(planar_frame);
 }
// av_packet_free(&packet);
// av_packet_free(&nu_packet);
 }
 swr_free(&avr);
 avcodec_free_context(&codingContext);
 
 }
 fclose(newFile);
}



I know i should write a header to the new wave file but for now I'm just trying to write the raw audio data. I'm getting always the same error but in different parts of the code (randomly), sometimes the code even compiles (writing the raw audio data, but filling it with some rubbish as well, i end up with a data file that is thrice the original one, sometimes i end up with a slightly smaller file - i guess the raw audio without the headers), results are basically random.


Here are some of the functions that trigger the error :


int ret = av_samples_alloc(); //(this the most common one)
swr_convert()
av_freep();



the error is :


main(64155,0x101b5d5c0) malloc: Incorrect checksum for freed object 0x106802600: probably modified after being freed.
Corrupt value: 0x0
main(64155,0x101b5d5c0) malloc: *** set a breakpoint in malloc_error_break to debug */



-
OpenShift — installing ffmpeg
2 juillet 2016, par aweeeezyI’m new to deploying web apps — I just started looking into hosting plans yesterday morning when I settled on OpenShift. I have my app running, but it depends on
node-youtube-dl
which returns this error when trying to download a video from a link :Error: Command failed: WARNING: m_djk1RQ2Ew: writing DASH m4a. Only some players support this container. Install ffmpeg or avconv to fix this automatically.
ERROR: ffprobe or avprobe not found. Please install one.So I searched around for awhile and kept returning to the same list instructions for how to install ffmpeg on OpenShift :
cd $OPENSHIFT_DATA_DIR
mkdir bin
wget http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz
wget http://ffmpeg.org/releases/ffmpeg-2.0.1.tar.gz
tar -xvf yasm-1.2.0.tar.gz
cd yasm-1.2.0
./configure --prefix=$OPENSHIFT_DATA_DIR/bin --bindir=$OPENSHIFT_DATA_DIR/bin
make
make install
export PATH=$OPENSHIFT_DATA_DIR/bin:$PATH
cd $OPENSHIFT_DATA_DIR
tar -xvf ffmpeg-2.0.1.tar.gz
cd ffmpeg-2.0.1
./configure --prefix=$OPENSHIFT_DATA_DIR/bin --bindir=$OPENSHIFT_DATA_DIR/bin
make
make installNow my
~/app-root/data
has ffprobe in it as well as some other codec related things, butnode-youtube-dl
still returns the same error saying I don’t have the necessary codecs installed. Here’s a listing of the contents of my data directory on OpenShift :-rwxr-xr-x. 1 11024048 Jul 2 01:51 ffmpeg
-rwxr-xr-x. 1 10967408 Jul 2 01:51 ffprobe
-rwxr-xr-x. 1 10611184 Jul 2 01:51 ffserver
drwx------. 10 4096 Jul 2 01:51 include
drwx------. 3 4096 Jul 2 01:51 lib
drwx------. 4 29 Jul 2 01:51 share
-rwxr-xr-x. 1 2116650 Jul 2 01:15 vsyasm
-rwxr-xr-x. 1 2115479 Jul 2 01:15 yasm
-rwxr-xr-x. 1 2102821 Jul 2 01:15 ytasmI really want OpenShift to work because it’s the last step to finishing off this one app before I move onto new projects — I don’t want to switch to paid hosting that will allow me to install stuff because I won’t be ready to determine an appropriate plan until a few months from now. That leaves me with trying to get ffmpeg to compile properly on OpenShift...so either a) I’m ignorant and it has long since been determined to be impossible by the OpenShift community or b) I’m ignorant and there’s a simple thing I’m doing wrong when building my codec libraries.
Anybody out there know what’s wrong or had success installing these codecs before ? I’d greatly appreciate some guidance !