c++ - 使用 FFmpeg SDK 将 .flv 转换为 mp3 的问题

标签 c++ ffmpeg mp3 flv

我正在使用 FFmpeg SDK 以编程方式将视频转换为 mp3。

我以这种方式阅读视频的音频帧:

while(av_read_frame(pFromCtx, &pkt) >= 0) 
{
    if(pkt.stream_index == audioStreamIndex) 
    {        
        avcodec_get_frame_defaults(frame);
        got_frame = 0;              
        ret = avcodec_decode_audio4(pCodecCtx, frame, &got_frame, &pkt);                
        if (ret < 0) {
            av_log(NULL, AV_LOG_ERROR, "Error decoding audio frame.\n");            
            continue;
        }

        if(got_frame) 
        {                    
          // Write the decoded audio frame           
          write_audio_frame(pToCtx, pToCtx->streams[pToCtx->nb_streams-1], frame);                    
        }                        
    }
    av_free_packet(&pkt);     
}

从输入视频文件中解码音频工作正常。当我尝试对 mp3 帧进行编码时会出现问题:
static void write_audio_frame(AVFormatContext *oc, AVStream *st, AVFrame *frame)
{
  AVCodecContext *enc = st->codec;
  AVPacket pkt;
  int got_packet = 0; 
  int ret = 0; 
  av_init_packet(&pkt);
  pkt.data = NULL; 
  pkt.size = 0; 

  ret = avcodec_encode_audio2(enc, &pkt, frame, &got_packet);

  if (ret < 0) {
      // PROBLEM    
      fprintf(stderr, "Error encoding audio frame. \n");
      exit(1);
  }     
}

我得到以下控制台输出:
[libmp3lame] inadequate AVFrame plane padding

唯一发生在 .flv 文件中的代码适用于 .mp4 文件。任何线索错误消息的含义是什么?

谢谢

最佳答案

包含错误信息的源代码在这里:http://ffmpeg.org/doxygen/trunk/libmp3lame_8c-source.html .相关消息来源说:

if (frame->linesize[0] < 4 * FFALIGN(frame->nb_samples, 8)) {
    av_log(avctx, AV_LOG_ERROR, "inadequate AVFrame plane padding\n");
    return AVERROR(EINVAL);
}

FFALIGN 定义为
#define FFALIGN (x,a)(((x)+(a)-1)&~((a)-1))

关于c++ - 使用 FFmpeg SDK 将 .flv 转换为 mp3 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16528145/

相关文章:

android从mp3获取频率峰值

iphone - 在 iPhone 或服务器上转换 caf 以便共享

java - MP3歌曲无法在媒体播放器中播放

c++ - MinGW 和 GLUT 未定义对 '_imp____glutInitWithExit@12' 的引用

c++ - 静态编译过剩?

node.js - ffmpeg-concat 创建了近 80GB 的原始文件来合并 3 个视频,500 毫秒的淡入淡出,总大小约为 42MB。如何减少存储需求?

go - 如何将持续时间分成两半

c# - 使用引用类型作为参数从 C# 调用 C++ 函数

c++ - 逆矩阵 OpenCV。 Matrix.inv() 无法正常工作

ffmpeg 视频流输出的问题