FFmpeg: ¿Cómo poner datos de medios codificados de un recipiente a otro con fuera re-codificación?
-
30-09-2019 - |
Pregunta
Así, por ejemplo: Tengo file.mp3, sé que mi formato deseado puede reproducir sonido con salida de vídeo (por ejemplo, FLV) de modo cómo poner los datos MP3 codificado utilizando ffmpeg del envase mp3 en flv (donde conseguir artículos / ejemplos de código en este)?
I significa no desde cmd pero a partir de C ++ usando ffmpeg como biblioteca. (Ver etiquetas)
Solución
Este es el comando para convertir archivos .mp3 a .flv (que no tiene ningún tipo de datos de vídeo).
ffmpeg -i test.mp3 -AB 32k -acodec libmp3lame -AC 1 -ar 44100 audio.flv.
Puede ejecutar este comando desde el programa.
Si necesita ayuda sobre cómo instalar y utilizar ffmpeg puede ir a su sitio web:
Gracias,
Mahmud
Otros consejos
¿ha considerado simplemente corriendo ffmpeg de un popen () / () del sistema llamada de C ++?
Es mucho más fácil que la creación de la biblioteca ffmpeg, que hace que sea trivial para multihilo (no es realmente un problema en el ejemplo) y le libera de cualquier LGPL vinculación y cuestiones DLL-infierno.
Esto es lo que quiere hacer:
AVFormatContext *ptrFormatContext;
int i, videoStream, audioStream;
AVCodecContext *ptrCodecCtxt;
AVCodec *ptrCodec;
AVFrame *ptrFrame;
AVPacket ptrPacket;
int frameFinished;
float aspect_ratio;
AVCodecContext *aCodecCtx;
AVCodec *aCodec;
AVCodecContext *aTargetCodecCtxt;
AVCodecContext *vTargetCodecCtxt;
AVCodec *aTargetCodec;
AVCodec *vTargetCodec;
AVSampleFormat ptrSampleFormats[2] = {AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32};
audioStream = videoStream = -1;
av_register_all();
avcodec_register_all();
ptrFormatContext = avformat_alloc_context();
if(avformat_open_input(&ptrFormatContext, filename, NULL, NULL) != 0 )
{
qDebug("Error opening the input");
exit(-1);
}
if(av_find_stream_info( ptrFormatContext) < 0)
{
qDebug("Could not find any stream info");
exit(-2);
}
dump_format(ptrFormatContext, 0, filename, (int) NULL);
for(i=0; i<ptrFormatContext->nb_streams; i++)
{
switch(ptrFormatContext->streams[i]->codec->codec_type)
{
case AVMEDIA_TYPE_VIDEO:
{
if(videoStream < 0) videoStream = i;
break;
}
case AVMEDIA_TYPE_AUDIO:
{
if(audioStream < 0) audioStream = i;
}
}
}
if(audioStream == -1)
{
qDebug("Could not find any audio stream");
exit(-3);
}
if(videoStream == -1)
{
qDebug("Could not find any video stream");
exit(-4);
}
aCodecCtx = ptrFormatContext->streams[audioStream]->codec;
if( (aCodec = avcodec_find_decoder(aCodecCtx->codec_id)) == NULL)
{
qDebug("Could not find the audio decoder");
exit(-5);
}
if( (avcodec_open(aCodecCtx, aCodec)) != 0 )
{
qDebug("Could not open the audio decoder");
exit(-6);
}
ptrCodecCtxt = ptrFormatContext->streams[videoStream]->codec;
if( (ptrCodec = avcodec_find_decoder(ptrCodecCtxt->codec_id)) == NULL )
{
qDebug("Could not find the video decoder");
exit(-7);
}
if((avcodec_open(ptrCodecCtxt, ptrCodec)) != 0)
{
qDebug("Could not find any video stream");
exit(-8);
}
A continuación, algunas otras cosas, en su mayoría irrelevantes si no quieren reencode ...
ptrFrame = avcodec_alloc_frame();
while(av_read_frame(ptrFormatContext,&ptrPacket) >= 0)
{
if(ptrPacket.stream_index == videoStream)
{
//do stuff with the package, for eg transcribe it into another output stream..
}
else if (ptrPacket.stream_index == audioStream)
{
//do stuff with the package, for eg transcribe it into another output stream..
}
}
La esperanza de que útil. sin embargo, el código es solo un extracto y no funcionará por sí solo, sino que le ayudará a conseguir la idea.
ffmpeg -i file.mp3 -acodec copy output.flv