FFMPEG: كيفية وضع بيانات الوسائط المشفرة من حاوية إلى أخرى بدون إعادة ترميز؟
-
30-09-2019 - |
سؤال
على سبيل المثال: لدي file.mp3 ، أعرف أن التنسيق المطلوب يمكنه تشغيل الصوت مع الفيديو الخارجي (على سبيل المثال FLV) ، لذا كيفية وضع بيانات MP3 المشفرة باستخدام FFMPEG من حاوية MP3 إلى FLV (حيث تحصل على مقالات/عينات رمز على هذه)؟
لا أقصد من CMD ولكن من C ++ باستخدام FFMPEG كمكتبة. (انظر العلامات)
المحلول
فيما يلي الأمر لتحويل ملف .mp3 إلى .FLV (الذي لا يحتوي على أي بيانات فيديو).
FFMPEG -i test.mp3 -ab 32k -acodec libmp3lame -ac 1 -ar 44100 Audio.flv.
يمكنك تنفيذ هذا الأمر من برنامجك.
إذا كنت بحاجة إلى مساعدة حول كيفية تثبيت واستخدام FFMPEG ، فيمكنك الانتقال إلى موقعهم:
شكرًا،
محمود
نصائح أخرى
هل فكرت فقط في تشغيل FFMPEG من استدعاء popen () / system () من C ++؟
إنها أسهل بكثير من إعداد مكتبة FFMPEG ، فهي تجعلها تافهة إلى Multithread (ليست مشكلة في المثال بالفعل) وتحررك من أي مشكلات ربط LGPL و DLL-HELL.
هذا ما تريد القيام به:
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..
}
}
أتمنى أن يكون هذا مفيدًا. ومع ذلك ، فإن الكود هو مقتطف فقط ولن يعمل بمفرده ، لكنه سيساعدك على الحصول على الفكرة.
ffmpeg -i file.mp3 -acodec copy output.flv