
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 (62)
-
Les autorisations surchargées par les plugins
27 avril 2010, parMediaspip core
autoriser_auteur_modifier() afin que les visiteurs soient capables de modifier leurs informations sur la page d’auteurs -
Le plugin : Gestion de la mutualisation
2 mars 2010, parLe plugin de Gestion de mutualisation permet de gérer les différents canaux de mediaspip depuis un site maître. Il a pour but de fournir une solution pure SPIP afin de remplacer cette ancienne solution.
Installation basique
On installe les fichiers de SPIP sur le serveur.
On ajoute ensuite le plugin "mutualisation" à la racine du site comme décrit ici.
On customise le fichier mes_options.php central comme on le souhaite. Voilà pour l’exemple celui de la plateforme mediaspip.net :
< ?php (...) -
Installation en mode ferme
4 février 2011, parLe mode ferme permet d’héberger plusieurs sites de type MediaSPIP en n’installant qu’une seule fois son noyau fonctionnel.
C’est la méthode que nous utilisons sur cette même plateforme.
L’utilisation en mode ferme nécessite de connaïtre un peu le mécanisme de SPIP contrairement à la version standalone qui ne nécessite pas réellement de connaissances spécifique puisque l’espace privé habituel de SPIP n’est plus utilisé.
Dans un premier temps, vous devez avoir installé les mêmes fichiers que l’installation (...)
Sur d’autres sites (7369)
-
How to encode resampled PCM-audio to AAC using ffmpeg-API when input pcm samples count not equal 1024
22 février 2023, par Aleksei2414904I am working on capturing and streaming audio to RTMP server at a moment. I work under MacOS (in Xcode), so for capturing audio sample-buffer I use AVFoundation-framework. But for encoding and streaming I need to use ffmpeg-API and libfaac encoder. So output format must be AAC (for supporting stream playback on iOS-devices).



And I faced with such problem : audio-capturing device (in my case logitech camera) gives me sample-buffer with 512 LPCM samples, and I can select input sample-rate from 16000, 24000, 36000 or 48000 Hz. When I give these 512 samples to AAC-encoder (configured for appropriate sample-rate), I hear a slow and jerking audio (seems as like pice of silence after each frame).



I figured out (maybe I am wrong), that libfaac encoder accepts audio frames only with 1024 samples. When I set input samplerate to 24000 and resample input sample-buffer to 48000 before encoding, I obtain 1024 resampled samples. After encoding these 1024 sampels to AAC, I hear proper sound on output. But my web-cam produce 512 samples in buffer for any input samplerate, when output sample-rate must be 48000 Hz. So I need to do resampling in any case, and I will not obtain exactly 1024 samples in buffer after resampling.



Is there a way to solve this problem within ffmpeg-API functionality ?



I would be grateful for any help.



PS :
I guess that I can accumulate resampled buffers until count of samples become 1024, and then encode it, but this is stream so there will be troubles with resulting timestamps and with other input devices, and such solution is not suitable.



The current issue came out of the problem described in [question] : How to fill audio AVFrame (ffmpeg) with the data obtained from CMSampleBufferRef (AVFoundation) ?



Here is a code with audio-codec configs (there also was video stream but video work fine) :



/*global variables*/
 static AVFrame *aframe;
 static AVFrame *frame;
 AVOutputFormat *fmt; 
 AVFormatContext *oc; 
 AVStream *audio_st, *video_st;
Init ()
{
 AVCodec *audio_codec, *video_codec;
 int ret;

 avcodec_register_all(); 
 av_register_all();
 avformat_network_init();
 avformat_alloc_output_context2(&oc, NULL, "flv", filename);
 fmt = oc->oformat;
 oc->oformat->video_codec = AV_CODEC_ID_H264;
 oc->oformat->audio_codec = AV_CODEC_ID_AAC;
 video_st = NULL;
 audio_st = NULL;
 if (fmt->video_codec != AV_CODEC_ID_NONE) 
 { //… /*init video codec*/}
 if (fmt->audio_codec != AV_CODEC_ID_NONE) {
 audio_codec= avcodec_find_encoder(fmt->audio_codec);

 if (!(audio_codec)) {
 fprintf(stderr, "Could not find encoder for '%s'\n",
 avcodec_get_name(fmt->audio_codec));
 exit(1);
 }
 audio_st= avformat_new_stream(oc, audio_codec);
 if (!audio_st) {
 fprintf(stderr, "Could not allocate stream\n");
 exit(1);
 }
 audio_st->id = oc->nb_streams-1;

 //AAC:
 audio_st->codec->sample_fmt = AV_SAMPLE_FMT_S16;
 audio_st->codec->bit_rate = 32000;
 audio_st->codec->sample_rate = 48000;
 audio_st->codec->profile=FF_PROFILE_AAC_LOW;
 audio_st->time_base = (AVRational){1, audio_st->codec->sample_rate };
 audio_st->codec->channels = 1;
 audio_st->codec->channel_layout = AV_CH_LAYOUT_MONO; 


 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
 audio_st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
 }

 if (video_st)
 {
 // …
 /*prepare video*/
 }
 if (audio_st)
 {
 aframe = avcodec_alloc_frame();
 if (!aframe) {
 fprintf(stderr, "Could not allocate audio frame\n");
 exit(1);
 }
 AVCodecContext *c;
 int ret;

 c = audio_st->codec;


 ret = avcodec_open2(c, audio_codec, 0);
 if (ret < 0) {
 fprintf(stderr, "Could not open audio codec: %s\n", av_err2str(ret));
 exit(1);
 }

 //…
}




And resampling and encoding audio :



if (mType == kCMMediaType_Audio)
{
 CMSampleTimingInfo timing_info;
 CMSampleBufferGetSampleTimingInfo(sampleBuffer, 0, &timing_info);
 double pts=0;
 double dts=0;
 AVCodecContext *c;
 AVPacket pkt = { 0 }; // data and size must be 0;
 int got_packet, ret;
 av_init_packet(&pkt);
 c = audio_st->codec;
 CMItemCount numSamples = CMSampleBufferGetNumSamples(sampleBuffer);

 NSUInteger channelIndex = 0;

 CMBlockBufferRef audioBlockBuffer = CMSampleBufferGetDataBuffer(sampleBuffer);
 size_t audioBlockBufferOffset = (channelIndex * numSamples * sizeof(SInt16));
 size_t lengthAtOffset = 0;
 size_t totalLength = 0;
 SInt16 *samples = NULL;
 CMBlockBufferGetDataPointer(audioBlockBuffer, audioBlockBufferOffset, &lengthAtOffset, &totalLength, (char **)(&samples));

 const AudioStreamBasicDescription *audioDescription = CMAudioFormatDescriptionGetStreamBasicDescription(CMSampleBufferGetFormatDescription(sampleBuffer));

 SwrContext *swr = swr_alloc();

 int in_smprt = (int)audioDescription->mSampleRate;
 av_opt_set_int(swr, "in_channel_layout", AV_CH_LAYOUT_MONO, 0);

 av_opt_set_int(swr, "out_channel_layout", audio_st->codec->channel_layout, 0);

 av_opt_set_int(swr, "in_channel_count", audioDescription->mChannelsPerFrame, 0);
 av_opt_set_int(swr, "out_channel_count", audio_st->codec->channels, 0);

 av_opt_set_int(swr, "out_channel_layout", audio_st->codec->channel_layout, 0);
 av_opt_set_int(swr, "in_sample_rate", audioDescription->mSampleRate,0);

 av_opt_set_int(swr, "out_sample_rate", audio_st->codec->sample_rate,0);

 av_opt_set_sample_fmt(swr, "in_sample_fmt", AV_SAMPLE_FMT_S16, 0);

 av_opt_set_sample_fmt(swr, "out_sample_fmt", audio_st->codec->sample_fmt, 0);

 swr_init(swr);
 uint8_t **input = NULL;
 int src_linesize;
 int in_samples = (int)numSamples;
 ret = av_samples_alloc_array_and_samples(&input, &src_linesize, audioDescription->mChannelsPerFrame,
 in_samples, AV_SAMPLE_FMT_S16P, 0);


 *input=(uint8_t*)samples;
 uint8_t *output=NULL;


 int out_samples = av_rescale_rnd(swr_get_delay(swr, in_smprt) +in_samples, (int)audio_st->codec->sample_rate, in_smprt, AV_ROUND_UP);

 av_samples_alloc(&output, NULL, audio_st->codec->channels, out_samples, audio_st->codec->sample_fmt, 0);
 in_samples = (int)numSamples;
 out_samples = swr_convert(swr, &output, out_samples, (const uint8_t **)input, in_samples);


 aframe->nb_samples =(int) out_samples;


 ret = avcodec_fill_audio_frame(aframe, audio_st->codec->channels, audio_st->codec->sample_fmt,
 (uint8_t *)output,
 (int) out_samples *
 av_get_bytes_per_sample(audio_st->codec->sample_fmt) *
 audio_st->codec->channels, 1);

 aframe->channel_layout = audio_st->codec->channel_layout;
 aframe->channels=audio_st->codec->channels;
 aframe->sample_rate= audio_st->codec->sample_rate;

 if (timing_info.presentationTimeStamp.timescale!=0)
 pts=(double) timing_info.presentationTimeStamp.value/timing_info.presentationTimeStamp.timescale;

 aframe->pts=pts*audio_st->time_base.den;
 aframe->pts = av_rescale_q(aframe->pts, audio_st->time_base, audio_st->codec->time_base);

 ret = avcodec_encode_audio2(c, &pkt, aframe, &got_packet);

 if (ret < 0) {
 fprintf(stderr, "Error encoding audio frame: %s\n", av_err2str(ret));
 exit(1);
 }
 swr_free(&swr);
 if (got_packet)
 {
 pkt.stream_index = audio_st->index;

 pkt.pts = av_rescale_q(pkt.pts, audio_st->codec->time_base, audio_st->time_base);
 pkt.dts = av_rescale_q(pkt.dts, audio_st->codec->time_base, audio_st->time_base);

 // Write the compressed frame to the media file.
 ret = av_interleaved_write_frame(oc, &pkt);
 if (ret != 0) {
 fprintf(stderr, "Error while writing audio frame: %s\n",
 av_err2str(ret));
 exit(1);
 }

}



-
lavfi : ensure audio frame durations match the sample count
14 avril 2023, par Anton Khirnov -
ffmpeg : loop count based on certain time
1er novembre 2023, par L.P.I need to loop several short videos for at least 30 seconds each. I could do each one separately but it's too much manual work. Each input video should have their own output video. There was this article in which the amount of loops based on the length of another media file. In my case, there is no such thing. The output should ideally have slightly over 30 seconds of looping video so that the last of the loops is not cut short. How do I achieve this in ffmpeg ?