audio - 复用到 MPEG-TS : wrong parameters for audio stream

标签 audio ffmpeg pcm mpeg2-ts

我正在尝试使用 ffmpeg 将视频(H.264)和音频(PCM_S16LE,无压缩)混合到 MPEG 传输流中。视频显示很好。但是,音频流不播放。 ffprobe显示的音频流是AAC,这显然不是我的本意。所以我在添加音频流时一定做错了什么。知道如何纠正这个吗?

这是我添加音频流的代码:

void add_audio_stream()
{

    CodecID codec_id = CODEC_ID_PCM_S16LE;

    AVStream *p_ast = av_new_stream(fc, 1);

    if (!p_ast) {
        fprintf(stderr, "Could not alloc audio stream\n");
        exit(1);
    }

    ai = p_ast->index;

    AVCodecContext *pcc = p_ast->codec;
    avcodec_get_context_defaults2( pcc, AVMEDIA_TYPE_AUDIO );

    pcc->codec_type = AVMEDIA_TYPE_AUDIO;
    pcc->codec_id = codec_id;
    pcc->sample_fmt = AV_SAMPLE_FMT_S16;
    //pcc->bit_rate = 44100*16*2;
    pcc->bit_rate = 0;
    pcc->sample_rate = 44100;
    pcc->channels = 2;
    pcc->time_base = (AVRational){1, 44100};


    // some formats want stream headers to be separate
    if (fc->oformat->flags & AVFMT_GLOBALHEADER)
    {
        printf(" **** 1 ****\n");
        pcc->flags |= CODEC_FLAG_GLOBAL_HEADER;
    }
    else
        printf(" **** 2 ****\n");


    AVCodec *codec;

    /* find the audio encoder */
    codec = avcodec_find_encoder(pcc->codec_id);
    if (!codec) {
        fprintf(stderr, "codec not found\n");
        exit(1);
    }


    /* open it */
    if (avcodec_open(pcc, codec) < 0) 
    {
        fprintf(stderr, "could not open codec\n");
        exit(1);
    }
}

这是ffprobe的输出:
ffprobe version N-32405-g6337de9, Copyright (c) 2007-2011 the FFmpeg developers
  built on Sep  8 2011 11:20:12 with gcc 4.4.3
  configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-x11grab --enable-libmp3lame
  libavutil    51. 16. 0 / 51. 16. 0
  libavcodec   53. 13. 0 / 53. 13. 0
  libavformat  53. 12. 0 / 53. 12. 0
  libavdevice  53.  3. 0 / 53.  3. 0
  libavfilter   2. 39. 0 /  2. 39. 0
  libswscale    2.  1. 0 /  2.  1. 0
  libpostproc  51.  2. 0 / 51.  2. 0
[mpegts @ 0xa96daa0] Continuity Check Failed
[mpegts @ 0xa96daa0] Continuity Check Failed
[aac @ 0xa974da0] channel element 0.1 is not allocated
[aac @ 0xa974da0] More than one AAC RDB per ADTS frame is not implemented. Update your FFmpeg version to the newest one from Git. If the problem still occurs, it means that your file has a feature which has not been implemented.

.
.
lot of gobbly-gook about missing AAC parameters . . . 
.
.

[aac @ 0xa974da0] More than one AAC RDB per ADTS frame is not implemented. Update your FFmpeg version to the newest one from Git. If the problem still occurs, it means that your file has a feature which has not been implemented.
[aac @ 0xa974da0] Error decoding AAC frame header.
[mpegts @ 0xa96daa0] max_analyze_duration 5000000 reached at 5429789
[mpegts @ 0xa96daa0] Continuity Check Failed
[mpegts @ 0xa96daa0] Continuity Check Failed

Input #0, mpegts, from 'test_audio_video.mts':
  Duration: 00:00:40.35, start: 0.010000, bitrate: 1907 kb/s
  Program 1 
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
Stream #0.0[0x100]: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p, 640x480, 30 fps, 30 tbr, 90k tbn, 60 tbc

Stream #0.1[0x101]: Audio: aac ([6][0][0][0] / 0x0006), 96000 Hz, 4.0, s16, 9 kb/s

最佳答案

我想我怀疑 MEPG2 TS 将允许 PCM 音频。它可以占用 MPI、MP2 或 AAC。 AAC 更多地被视为默认选择,而不是识别。

此外,与 Video 不同,Audio header 的描述性不是很强。即没有开始代码和东西,所以除了 PES 头之外,通常没有办法找出它是什么类型的音频。

如果可能,对音频进行编码。

尝试 Gspot 应用程序进行交叉检查。

关于audio - 复用到 MPEG-TS : wrong parameters for audio stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10051250/

相关文章:

android - 在 Android 中的布局上播放短 .wav

c# - ImageMagick .net c# mp4/webm 视频在没有伪影的情况下获得 N 帧?

javascript - 在 JavaScript 中将两个字节转换为有符号 16 位整数

iOS:从流中播放 PCM 缓冲区

java - 有没有办法用Java在Linux上以协作方式播放WAV文件?

iphone - 通过蓝牙共享音频

cordova - Phonegap应用中的音频标签

ffmpeg - Android Chrome 支持哪种ogg?

ffmpeg - 为什么 RTP 不支持多个流到一个端口,但 RTSP 支持?

iphone - 从线性 PCM 中提取音频 channel