
Recherche avancée
Autres articles (54)
-
Soumettre améliorations et plugins supplémentaires
10 avril 2011Si vous avez développé une nouvelle extension permettant d’ajouter une ou plusieurs fonctionnalités utiles à MediaSPIP, faites le nous savoir et son intégration dans la distribution officielle sera envisagée.
Vous pouvez utiliser la liste de discussion de développement afin de le faire savoir ou demander de l’aide quant à la réalisation de ce plugin. MediaSPIP étant basé sur SPIP, il est également possible d’utiliser le liste de discussion SPIP-zone de SPIP pour (...) -
Participer à sa traduction
10 avril 2011Vous pouvez nous aider à améliorer les locutions utilisées dans le logiciel ou à traduire celui-ci dans n’importe qu’elle nouvelle langue permettant sa diffusion à de nouvelles communautés linguistiques.
Pour ce faire, on utilise l’interface de traduction de SPIP où l’ensemble des modules de langue de MediaSPIP sont à disposition. ll vous suffit de vous inscrire sur la liste de discussion des traducteurs pour demander plus d’informations.
Actuellement MediaSPIP n’est disponible qu’en français et (...) -
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 (4175)
-
rmtp lavfi & image2 queue blocking
13 mars 2017, par John[image2 @ 0x7fb9ffc105e0] Thread message queue blocking; consider raising the thread_queue_size option (current value: 1024)
How to resolve this, after adding lavfi & raising the queue value to 1024 error still present....
ffmpeg -f image2 -loop 1 -framerate 1 -thread_queue_size 512 -i bg.png \
-f lavfi -thread_queue_size 512 -i "amovie=audio.m4a:loop=0,asetpts=N/SR/TB" \
-vf "realtime" \
-f flv rtmp://server.dev:1935/live/mystreamNo errors w/o lavfi
ffmpeg -f image2 -loop 1 -framerate 1 -i bg.png \
-vf "realtime" \
-f flv rtmp://server.dev:1935/live/mystream -
FFMPEG AAC encoding causes audio to be lower in pitch
14 février 2017, par Paul KnopfI built a sample application that encodes AAC (from PortAudio) into a MP4 container (no video stream).
The resulting audio is lower in pitch.
#include "stdafx.h"
#include "TestRecording.h"
#include "libffmpeg.h"
TestRecording::TestRecording()
{
}
TestRecording::~TestRecording()
{
}
struct RecordingContext
{
RecordingContext()
{
formatContext = NULL;
audioStream = NULL;
audioFrame = NULL;
audioFrameframeNumber = 0;
}
libffmpeg::AVFormatContext* formatContext;
libffmpeg::AVStream* audioStream;
libffmpeg::AVFrame* audioFrame;
int audioFrameframeNumber;
};
static int AudioRecordCallback(const void *inputBuffer, void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData)
{
RecordingContext* recordingContext = (RecordingContext*)userData;
libffmpeg::avcodec_fill_audio_frame(recordingContext->audioFrame,
recordingContext->audioFrame->channels,
recordingContext->audioStream->codec->sample_fmt,
static_cast<const unsigned="unsigned">(inputBuffer),
(framesPerBuffer * sizeof(float) * recordingContext->audioFrame->channels),
0);
libffmpeg::AVPacket pkt;
libffmpeg::av_init_packet(&pkt);
pkt.data = NULL;
pkt.size = 0;
int gotpacket;
int result = avcodec_encode_audio2(recordingContext->audioStream->codec, &pkt, recordingContext->audioFrame, &gotpacket);
if (result < 0)
{
LOGINT_WITH_MESSAGE(ERROR, result, "Couldn't encode the audio frame to acc");
return paContinue;
}
if (gotpacket)
{
pkt.stream_index = recordingContext->audioStream->index;
recordingContext->audioFrameframeNumber++;
// this codec requires no bitstream filter, just send it to the muxer!
result = libffmpeg::av_write_frame(recordingContext->formatContext, &pkt);
if (result < 0)
{
LOG(ERROR) << "Couldn't write the encoded audio frame";
libffmpeg::av_free_packet(&pkt);
return paContinue;
}
libffmpeg::av_free_packet(&pkt);
}
return paContinue;
}
static bool InitializeRecordingContext(RecordingContext* recordingContext)
{
int result = libffmpeg::avformat_alloc_output_context2(&recordingContext->formatContext, NULL, NULL, "C:\\Users\\Paul\\Desktop\\test.mp4");
if (result < 0)
{
LOGINT_WITH_MESSAGE(ERROR, result, "Couldn't create output format context");
return false;
}
libffmpeg::AVCodec *audioCodec;
audioCodec = libffmpeg::avcodec_find_encoder(libffmpeg::AV_CODEC_ID_AAC);
if (audioCodec == NULL)
{
LOG(ERROR) << "Couldn't find the encoder for AAC";
}
recordingContext->audioStream = libffmpeg::avformat_new_stream(recordingContext->formatContext, audioCodec);
if (!recordingContext->audioStream)
{
LOG(ERROR) << "Couldn't create the audio stream";
return false;
}
recordingContext->audioStream->codec->bit_rate = 64000;
recordingContext->audioStream->codec->sample_fmt = libffmpeg::AV_SAMPLE_FMT_FLTP;
recordingContext->audioStream->codec->sample_rate = 48000;
recordingContext->audioStream->codec->channel_layout = AV_CH_LAYOUT_STEREO;
recordingContext->audioStream->codec->channels = libffmpeg::av_get_channel_layout_nb_channels(recordingContext->audioStream->codec->channel_layout);
recordingContext->audioStream->codecpar->bit_rate = recordingContext->audioStream->codec->bit_rate;
recordingContext->audioStream->codecpar->format = recordingContext->audioStream->codec->sample_fmt;
recordingContext->audioStream->codecpar->sample_rate = recordingContext->audioStream->codec->sample_rate;
recordingContext->audioStream->codecpar->channel_layout = recordingContext->audioStream->codec->channel_layout;
recordingContext->audioStream->codecpar->channels = recordingContext->audioStream->codec->channels;
result = libffmpeg::avcodec_open2(recordingContext->audioStream->codec, audioCodec, NULL);
if (result < 0)
{
LOGINT_WITH_MESSAGE(ERROR, result, "Couldn't open the audio codec");
return false;
}
// create a new frame to store the audio samples
recordingContext->audioFrame = libffmpeg::av_frame_alloc();
if (!recordingContext->audioFrame)
{
LOG(ERROR) << "Couldn't alloce the output audio frame";
return false;
}
recordingContext->audioFrame->nb_samples = recordingContext->audioStream->codec->frame_size;
recordingContext->audioFrame->channel_layout = recordingContext->audioStream->codec->channel_layout;
recordingContext->audioFrame->channels = recordingContext->audioStream->codec->channels;
recordingContext->audioFrame->format = recordingContext->audioStream->codec->sample_fmt;
recordingContext->audioFrame->sample_rate = recordingContext->audioStream->codec->sample_rate;
result = libffmpeg::av_frame_get_buffer(recordingContext->audioFrame, 0);
if (result < 0)
{
LOG(ERROR) << "Coudln't initialize the output audio frame buffer";
return false;
}
// some formats want video_stream headers to be separate
if (!strcmp(recordingContext->formatContext->oformat->name, "mp4") || !strcmp(recordingContext->formatContext->oformat->name, "mov") || !strcmp(recordingContext->formatContext->oformat->name, "3gp"))
{
recordingContext->audioStream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
}
// open the ouput file
if (!(recordingContext->formatContext->oformat->flags & AVFMT_NOFILE))
{
result = libffmpeg::avio_open(&recordingContext->formatContext->pb, recordingContext->formatContext->filename, AVIO_FLAG_WRITE);
if (result < 0)
{
LOGINT_WITH_MESSAGE(ERROR, result, "Couldn't open the output file");
return false;
}
}
// write the stream headers
result = libffmpeg::avformat_write_header(recordingContext->formatContext, NULL);
if (result < 0)
{
LOGINT_WITH_MESSAGE(ERROR, result, "Couldn't write the headers to the file");
return false;
}
return true;
}
static bool FinalizeRecordingContext(RecordingContext* recordingContext)
{
int result = 0;
// write the trailing information
if (recordingContext->formatContext->pb)
{
result = libffmpeg::av_write_trailer(recordingContext->formatContext);
if (result < 0)
{
LOGINT_WITH_MESSAGE(ERROR, result, "Couldn't write the trailer information");
return false;
}
}
// close all the codes
for (int i = 0; i < (int)recordingContext->formatContext->nb_streams; i++)
{
result = libffmpeg::avcodec_close(recordingContext->formatContext->streams[i]->codec);
if (result < 0)
{
LOGINT_WITH_MESSAGE(ERROR, result, "Couldn't close the codec");
return false;
}
}
// close the output file
if (recordingContext->formatContext->pb)
{
if (!(recordingContext->formatContext->oformat->flags & AVFMT_NOFILE))
{
result = libffmpeg::avio_close(recordingContext->formatContext->pb);
if (result < 0)
{
LOGINT_WITH_MESSAGE(ERROR, result, "Couldn't close the output file");
return false;
}
}
}
// free the format context and all of its data
libffmpeg::avformat_free_context(recordingContext->formatContext);
recordingContext->formatContext = NULL;
recordingContext->audioStream = NULL;
if (recordingContext->audioFrame)
{
libffmpeg::av_frame_free(&recordingContext->audioFrame);
recordingContext->audioFrame = NULL;
}
return true;
}
int TestRecording::Test()
{
PaError result = paNoError;
result = Pa_Initialize();
if (result != paNoError) LOGINT_WITH_MESSAGE(ERROR, result, "Error initializing audio device framework");
RecordingContext recordingContext;
if (!InitializeRecordingContext(&recordingContext))
{
LOG(ERROR) << "Couldn't start recording file";
return 0;
}
auto defaultDevice = Pa_GetDefaultInputDevice();
auto deviceInfo = Pa_GetDeviceInfo(defaultDevice);
PaStreamParameters inputParameters;
inputParameters.device = defaultDevice;
inputParameters.channelCount = 2;
inputParameters.sampleFormat = paFloat32;
inputParameters.suggestedLatency = deviceInfo->defaultLowInputLatency;
inputParameters.hostApiSpecificStreamInfo = NULL;
PaStream* stream = NULL;
result = Pa_OpenStream(
&stream,
&inputParameters,
NULL,
48000,
1024,
paClipOff,
AudioRecordCallback,
&recordingContext);
if (result != paNoError)LOGINT_WITH_MESSAGE(ERROR, result, "Couldn't open the audio stream");
result = Pa_StartStream(stream);
if (result != paNoError)LOGINT_WITH_MESSAGE(ERROR, result, "Couldn't start the audio stream");
Sleep(1000 * 5);
result = Pa_StopStream(stream);
if (result != paNoError)LOGINT_WITH_MESSAGE(ERROR, result, "Couldn't stop the audio stream");
if (!FinalizeRecordingContext(&recordingContext)) LOG(ERROR) << "Couldn't stop recording file";
result = Pa_CloseStream(stream);
if (result != paNoError)LOGINT_WITH_MESSAGE(ERROR, result, "Couldn't stop the audio stream");
return 0;
}
</const>Here is the
stdout
, in case it helps.https://gist.github.com/pauldotknopf/9f24a604ce1f8a081aa68da1bf169e98
Why is the audio lower in pitch ? I assume I am overlooking a parameter that needs to be configured between PortAudio and FFMPEG. Is there something super obvious that I am missing ?
-
ffmpeg `avformat_write_header` fail with -22 Invalid arg
3 février 2017, par user998953I am having an error with FFMPEG. Here is my code :
static int open_output_file(const char *filename) {
AVStream *out_stream;
AVStream *in_stream;
AVCodecContext *dec_ctx, *enc_ctx;
AVCodec *encoder;
int ret;
unsigned int i;
ofmt_ctx = NULL;
avformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, filename);
if (!ofmt_ctx) {
LOGD(NULL, AV_LOG_ERROR, "Could notcreate output context\n");
return AVERROR_UNKNOWN;
}
for (i = 0; i < ifmt_ctx->nb_streams; i++) {
out_stream = avformat_new_stream(ofmt_ctx, NULL);
if (!out_stream) {
LOGD(NULL, AV_LOG_ERROR, "Failed allocating output stream\n");
return AVERROR_UNKNOWN;
}
in_stream = ifmt_ctx->streams[i];
dec_ctx = in_stream->codec;
enc_ctx = out_stream->codec;
if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO
|| dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
/* in this example, we choose transcoding to same codec */
encoder = avcodec_find_encoder(dec_ctx->codec_id);
enc_ctx = avcodec_alloc_context3(encoder);
if (!encoder) {
LOGE("encoder not avalibe ");
return -1;
}
/* In this example, we transcode to same properties(picture size,
* sample rate etc.). These properties can be changed for output
* streams easily using filters */
if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {
enc_ctx->height = dec_ctx->height;
enc_ctx->width = dec_ctx->width;
enc_ctx->sample_aspect_ratio = dec_ctx->sample_aspect_ratio;
/* take first format from list of supported formats */
enc_ctx->pix_fmt = encoder->pix_fmts[0];
/* video time_base can be set to whatever is handy andsupported by encoder */
enc_ctx->time_base = dec_ctx->time_base;
} else {
enc_ctx->sample_rate = dec_ctx->sample_rate;
enc_ctx->channel_layout = dec_ctx->channel_layout;
enc_ctx->channels = av_get_channel_layout_nb_channels(enc_ctx->channel_layout);
/* take first format from list of supported formats */
enc_ctx->sample_fmt = encoder->sample_fmts[0];
AVRational time_base = {1, enc_ctx->sample_rate};
enc_ctx->time_base = time_base;
}
/* Third parameter can be used to pass settings to encoder*/
ret = avcodec_open2(enc_ctx, encoder, NULL);
if (ret < 0) {
LOGD("Cannot openvideo encoder for stream #%u\n", i);
return ret;
}
} else if (dec_ctx->codec_type == AVMEDIA_TYPE_UNKNOWN) {
LOGE("Elementarystream #%d is of unknown type, cannot proceed\n",
i);
return AVERROR_INVALIDDATA;
} else {
/* if this stream must be remuxed */
ret = avcodec_copy_context(ofmt_ctx->streams[i]->codec,
ifmt_ctx->streams[i]->codec);
if (ret < 0) {
LOGE("Copyingstream context failed\n");
return ret;
}
}
if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
enc_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER;
}
av_dump_format(ofmt_ctx, 0, filename, 1);
if (!(ofmt_ctx->oformat->flags & AVFMT_NOFILE)) {
ret = avio_open(&ofmt_ctx->pb, filename, AVIO_FLAG_WRITE);
if (ret < 0) {
LOGE("Could not open output file '%s'", filename);
return ret;
}
}
ret = avformat_write_header(ofmt_ctx, NULL); //wrong here
if (ret < 0) {
char buf[1024] = {0};
av_strerror(ret, buf, 1024);
LOGE("Error occurred when opening output file : %s\n", buf);
return ret;
}
return 0;
}Here is the ffmpeg log. Pay close attention to the error I am getting which is :
Error occurred when opening output file : Invalid argument
Here is the rest of it :
02-03 18:09:44.120 24571-24571/com.zhenbeiju.avplayer E/videoplayer: [mov,mp4,m4a,3gp,3g2,mj2 @ 0xebf33e00] After avformat_find_stream_info() pos: 680796 bytes read:308417 seeks:1 frames:48
02-03 18:09:44.120 24571-24571/com.zhenbeiju.avplayer E/videoplayer: [h264 @ 0xea72cc00] nal_unit_type: 7, nal_ref_idc: 3
02-03 18:09:44.120 24571-24571/com.zhenbeiju.avplayer E/videoplayer: [h264 @ 0xea72cc00] nal_unit_type: 8, nal_ref_idc: 3
02-03 18:09:44.121 24571-24571/com.zhenbeiju.avplayer E/videoplayer: Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/sdcard/test2.mp4':
02-03 18:09:44.121 24571-24571/com.zhenbeiju.avplayer E/videoplayer: Metadata:
02-03 18:09:44.121 24571-24571/com.zhenbeiju.avplayer E/videoplayer: major_brand :
02-03 18:09:44.121 24571-24571/com.zhenbeiju.avplayer E/videoplayer: mp42
02-03 18:09:44.121 24571-24571/com.zhenbeiju.avplayer E/videoplayer: minor_version :
02-03 18:09:44.121 24571-24571/com.zhenbeiju.avplayer E/videoplayer: 0
02-03 18:09:44.121 24571-24571/com.zhenbeiju.avplayer E/videoplayer: compatible_brands:
02-03 18:09:44.121 24571-24571/com.zhenbeiju.avplayer E/videoplayer: isommp42
02-03 18:09:44.121 24571-24571/com.zhenbeiju.avplayer E/videoplayer: creation_time :
02-03 18:09:44.121 24571-24571/com.zhenbeiju.avplayer E/videoplayer: 2017-01-23T08:22:57.000000Z
02-03 18:09:44.121 24571-24571/com.zhenbeiju.avplayer E/videoplayer: com.android.version:
02-03 18:09:44.121 24571-24571/com.zhenbeiju.avplayer E/videoplayer: 6.0.1
02-03 18:09:44.122 24571-24571/com.zhenbeiju.avplayer E/videoplayer: Duration:
02-03 18:09:44.122 24571-24571/com.zhenbeiju.avplayer E/videoplayer: 00:00:07.74
02-03 18:09:44.122 24571-24571/com.zhenbeiju.avplayer E/videoplayer: , start:
02-03 18:09:44.122 24571-24571/com.zhenbeiju.avplayer E/videoplayer: 0.000000
02-03 18:09:44.122 24571-24571/com.zhenbeiju.avplayer E/videoplayer: , bitrate:
02-03 18:09:44.122 24571-24571/com.zhenbeiju.avplayer E/videoplayer: 14377 kb/s
02-03 18:09:44.122 24571-24571/com.zhenbeiju.avplayer E/videoplayer: Stream #0:0
02-03 18:09:44.122 24571-24571/com.zhenbeiju.avplayer E/videoplayer: (eng)
02-03 18:09:44.122 24571-24571/com.zhenbeiju.avplayer E/videoplayer: , 1, 1/90000
02-03 18:09:44.122 24571-24571/com.zhenbeiju.avplayer E/videoplayer: : Video: h264 (avc1 / 0x31637661), yuv420p, 1280x720, 13892 kb/s
02-03 18:09:44.122 24571-24571/com.zhenbeiju.avplayer E/videoplayer: , SAR 1:1 DAR 16:9
02-03 18:09:44.122 24571-24571/com.zhenbeiju.avplayer E/videoplayer: ,
02-03 18:09:44.122 24571-24571/com.zhenbeiju.avplayer E/videoplayer: 30.02 fps,
02-03 18:09:44.122 24571-24571/com.zhenbeiju.avplayer E/videoplayer: 30 tbr,
02-03 18:09:44.122 24571-24571/com.zhenbeiju.avplayer E/videoplayer: 90k tbn,
02-03 18:09:44.122 24571-24571/com.zhenbeiju.avplayer E/videoplayer: 60.04 tbc
02-03 18:09:44.122 24571-24571/com.zhenbeiju.avplayer E/videoplayer: (default)
02-03 18:09:44.122 24571-24571/com.zhenbeiju.avplayer E/videoplayer: Metadata:
02-03 18:09:44.122 24571-24571/com.zhenbeiju.avplayer E/videoplayer: rotate :
02-03 18:09:44.122 24571-24571/com.zhenbeiju.avplayer E/videoplayer: 90
02-03 18:09:44.122 24571-24571/com.zhenbeiju.avplayer E/videoplayer: creation_time :
02-03 18:09:44.122 24571-24571/com.zhenbeiju.avplayer E/videoplayer: 2017-01-23T08:22:57.000000Z
02-03 18:09:44.122 24571-24571/com.zhenbeiju.avplayer E/videoplayer: handler_name :
02-03 18:09:44.122 24571-24571/com.zhenbeiju.avplayer E/videoplayer: VideoHandle
02-03 18:09:44.123 24571-24571/com.zhenbeiju.avplayer E/videoplayer: Side data:
02-03 18:09:44.123 24571-24571/com.zhenbeiju.avplayer E/videoplayer:
02-03 18:09:44.123 24571-24571/com.zhenbeiju.avplayer E/videoplayer: displaymatrix: rotation of -90.00 degrees
02-03 18:09:44.123 24571-24571/com.zhenbeiju.avplayer E/videoplayer: Stream #0:1
02-03 18:09:44.123 24571-24571/com.zhenbeiju.avplayer E/videoplayer: (eng)
02-03 18:09:44.123 24571-24571/com.zhenbeiju.avplayer E/videoplayer: , 47, 1/48000
02-03 18:09:44.123 24571-24571/com.zhenbeiju.avplayer E/videoplayer: : Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 96 kb/s
02-03 18:09:44.123 24571-24571/com.zhenbeiju.avplayer E/videoplayer: (default)
02-03 18:09:44.123 24571-24571/com.zhenbeiju.avplayer E/videoplayer: Metadata:
02-03 18:09:44.123 24571-24571/com.zhenbeiju.avplayer E/videoplayer: creation_time :
02-03 18:09:44.123 24571-24571/com.zhenbeiju.avplayer E/videoplayer: 2017-01-23T08:22:57.000000Z
02-03 18:09:44.123 24571-24571/com.zhenbeiju.avplayer E/videoplayer: handler_name :
02-03 18:09:44.123 24571-24571/com.zhenbeiju.avplayer E/videoplayer: SoundHandle
02-03 18:09:44.124 24571-24571/com.zhenbeiju.avplayer E/videoplayer: [libx264 @ 0xdbf3dc00] using mv_range_thread = 56
02-03 18:09:44.126 24571-24571/com.zhenbeiju.avplayer E/videoplayer: [libx264 @ 0xdbf3dc00] using cpu capabilities: none!
02-03 18:09:44.197 24571-24571/com.zhenbeiju.avplayer E/videoplayer: [libx264 @ 0xdbf3dc00] profile High, level 4.0
02-03 18:09:44.199 24571-24571/com.zhenbeiju.avplayer E/videoplayer: Output #0, mp4, to '/sdcard/test3.mp4':
02-03 18:09:44.199 24571-24571/com.zhenbeiju.avplayer E/videoplayer: Stream #0:0
02-03 18:09:44.199 24571-24571/com.zhenbeiju.avplayer E/videoplayer: , 0, 0/0
02-03 18:09:44.199 24571-24571/com.zhenbeiju.avplayer E/videoplayer: : Unknown: none
02-03 18:09:44.200 24571-24571/com.zhenbeiju.avplayer E/videoplayer: Stream #0:1
02-03 18:09:44.200 24571-24571/com.zhenbeiju.avplayer E/videoplayer: , 0, 0/0
02-03 18:09:44.200 24571-24571/com.zhenbeiju.avplayer E/videoplayer: : Unknown: none
02-03 18:09:44.200 24571-24571/com.zhenbeiju.avplayer E/videoplayer: [file @ 0xdbdc71e0] Setting default whitelist 'file,crypto'
02-03 18:09:44.201 24571-24571/com.zhenbeiju.avplayer E/videoplayer: [mp4 @ 0xebf3a800] Could not find tag for codec none in stream #0, codec not currently supported in container
02-03 18:09:44.201 24571-24571/com.zhenbeiju.avplayer E/videoplayer: Error occurred when opening output file : Invalid argument