
Recherche avancée
Autres articles (55)
-
Contribute to documentation
13 avril 2011Documentation is vital to the development of improved technical capabilities.
MediaSPIP welcomes documentation by users as well as developers - including : critique of existing features and functions articles contributed by developers, administrators, content producers and editors screenshots to illustrate the above translations of existing documentation into other languages
To contribute, register to the project users’ mailing (...) -
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 (...) -
Encoding and processing into web-friendly formats
13 avril 2011, parMediaSPIP automatically converts uploaded files to internet-compatible formats.
Video files are encoded in MP4, Ogv and WebM (supported by HTML5) and MP4 (supported by Flash).
Audio files are encoded in MP3 and Ogg (supported by HTML5) and MP3 (supported by Flash).
Where possible, text is analyzed in order to retrieve the data needed for search engine detection, and then exported as a series of image files.
All uploaded files are stored online in their original format, so you can (...)
Sur d’autres sites (8715)
-
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 */



-
Creating an ffmpeg html/php form process and need ffmpeg technical feedback
7 juin 2016, par daveI have decided to create an input form for ffmpeg to go with my video uploader.
This is for my video uploader plugin for a social site software. Users have told me that they want technical options for videos so they can choose the specific options they want including thumbnail options.
I have been reading the ffmpeg docs most of the morning as well as watching some videos and i have come up with a rough draft of my form. The videos uploaded will more than likely be non gaming, personal and hobby videos.
The goal here is to have a form that is easy enough for the non technical user, but technical for those that want the options. So i do plan to have a checkbox which allows the non technical user to skip the technical settings. This will result in a generic ffmpeg command with default settings. If they choose to use the technical specs then it will create a more specific ffmpeg command stream.
here is what i have so far in the draft.
select max size options ’50MB’,’100MB’,’200MB’,’500MB’,’650MB’,’750MB’,’1GB’,’2GB’,’3GB’
input for thumbcapture in seconds maxlength 2 size 2
input for video in ’mpg’,’wma’,’mov’,’flv’,’mp4’,’avi’,’qt’,’wmv’,’rm’
option for video size ’200x100’,’320x240’,’560x315’,’640x360’,’853x480’,’1280x720’ not sure if i want to offer a custom slot or not.
my thought here is that if they do not want the tech version of the form then the codecs will be b:v copy b:a copy (if that is the smart way to do it) or just left out and let ffmpeg decide what is best.
===== this is the technical part of the form =======
select for acodec options copy, mp3, mp1, mp2, dnet, 28_8, wmav2, alac, cook
select for vcodec option copy, ffv1, ms-cram, mpeg-4, rv40, wmv, xvid, mov, qt, avchd
select for bitrate audio 32k, 64k, 128k
select for bitrate video 1000k, 1200k, 1500k
select for sampling rate 22050, 44100
input for crf(mp4 out only) size 2 maxlength 2 minval 2 maxval 49
input for avi quantanizer (avi out only) size 2 maxlength 2 minval 2 maxval 49
===== end technical form =====================
select for video out ’avi’,’mp4’,’flv’
that is what i have so far. How does that combination on the technical side look to you ffmpeg pros ?
Any suggestions ? :)
-
Build error caused by missing library arc4random
25 mai 2016, par Omega1001I’m currently working on a Streaming framework, and decided to use ffmpeg to encode and or decode my Video and or Audio.
So i clicked through https://ffmpeg.org for the api files, and downloaded the statically linked version only to find out it actually contained a .exe (I use Windows in development, but plan on using Linux in production) instead of one or more dll’s and header informations.
Since i don’t think i can use the ’exe’ as replacement for an dll, i cloned the git source, and tried to compile it myself.
Then, while compiling i run into this error :
CC libavutil/random_seed.o
libavutil/random_seed.c: In function 'av_get_random_seed':
libavutil/random_seed.c:130:12: error: implicit declaration of function 'arc4random' [-Werror=implicit-function-declaration]
return arc4random();
^
cc1: some warnings being treated as errors
common.mak:60: recipe for target 'libavutil/random_seed.o' failed
make: *** [libavutil/random_seed.o] Error 1As far as I can tell, this means that I’m missing the library arc4random, so I started searching for this lib, and found absolutly nothing, besides the fact that this library is somehow Apple related..., but no dll’s and stuff or sources to compile it myself.
I use cygwin and its GCC to compile on 64-Bit windows 7 Machine.
Can anyone hint me to some location where I can get this missing library, or some other possibility to get ffmpeg as library into my project ?
(I would prefer something I can link statically , since this project is meant to be a lib by itself)Maybe is there a way I can make use of that downloaded exe of ffmpeg, since i can borrow its headers from the source I cloned from Git ?
Any Hint appreciated.
Best Regards,
Jannik Adam