FFmpeg: ¿Cómo poner datos de medios codificados de un recipiente a otro con fuera re-codificación?

StackOverflow https://stackoverflow.com/questions/4144033

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)

¿Fue útil?

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:

http://ffmpeg.org

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top