FFmpeg: Как поместить закодированные медиаданные из одного контейнера в другой без перекодирования? - PullRequest
1 голос
/ 10 ноября 2010

Так, например: у меня есть файл .mp3, я знаю, что мой желаемый формат может воспроизводить звук без видео (например, FLV), как поместить закодированные данные mp3 с помощью ffmpeg из контейнера mp3 в flv (где взять статьипримеры кода по этому)?

Я имею в виду не из cmd, а из C ++, используя ffmpeg в качестве библиотеки.(см. теги)

Ответы [ 4 ]

1 голос
/ 10 ноября 2010

Вот команда для преобразования файла .mp3 в .flv (в котором нет видеоданных).

ffmpeg -i test.mp3 -ab 32k -acodec libmp3lame -ac 1 -ar 44100 audio.flv.

Вы можете выполнить эту команду из вашей программы.

Если вам нужна помощь по установке и использованию ffmpeg, вы можете перейти на их сайт:

http://ffmpeg.org

Спасибо

Махмуд

0 голосов
/ 21 января 2012

Вот что вы хотите сделать:

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);
}

Затем некоторые другие вещи, в основном несущественные, если вы не хотите перекодировать ...

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..
    }
}

Надеюсь, что это полезно.Код, однако, только отрывок и не будет работать сам по себе, но он поможет вам понять идею.

0 голосов
/ 10 ноября 2010

Рассматривали ли вы просто запуск ffmpeg из вызова popen () / system () из c ++?

Это намного проще, чем настройка библиотеки ffmpeg, она делает ее тривиальной для многопоточности (на самом деле это не проблема)в примере) и освобождает вас от любых проблем со ссылками LGPL и dll-hell.

0 голосов
/ 10 ноября 2010
ffmpeg -i file.mp3 -acodec copy output.flv
...