请教:使用ffmpeg转码

BuleRiver 2011-03-11 11:48:14
大家好。
我想使用ffmpeg对wave格式的数据进行转码,转成mp3或者amr,或者其他的格式。我想把数据存入BUF,而不是文件,我已经分析了output_example.c,其输入数据是程序生成的,如果是其他的PCM数据,编码时,对输入的数据块的大小有要求吗?
...全文
532 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Leric_Lee 2013-06-07
  • 打赏
  • 举报
回复
哇 好老的帖子 我帮你加点回复量吧CSDN.....avfifobuffer满足您的愿望......把任何文件类型的解码帧扔进去都行,重新编码的时候按编码格式的size在里面取uint8_t 再fill进AVFrame就OK了
「已注销」 2011-03-13
  • 打赏
  • 举报
回复
第二种方式不可以。
output_example只是个编码的例子,如果要解码再编码,需要看ffmpeg.c,这个要复杂点
或者自己写或移植wav解码部分
「已注销」 2011-03-12
  • 打赏
  • 举报
回复
看看c->frame_size值是多少。
open_audio函数最后部分samples = av_malloc(audio_input_frame_size * 2 * c->channels);
所以输入的数据块的大小应为audio_input_frame_size * 2 * c->channels。这个值和c->frame_size以及c->channels有关,看看你的编码器这两个值是多少,输入的数据块的大小就确定了。
比如amr-nb编码器,channels==1,frame_size==160,所以输入的数据块的大小为320
BuleRiver 2011-03-12
  • 打赏
  • 举报
回复
但是音频数据的输入的确是个问题。我测试了一下,ffmpeg里面的函数:url_open_buf()和url_close_buf()不能使用,看了一下源码,原来它传入的一系列函数:read、write、seek等操作,都是NULL。
该如何处理数据输入呢?必须自己实现吗?
BuleRiver 2011-03-12
  • 打赏
  • 举报
回复
上面第三个问题我已经解决了,使用ffmpeg提供的url_open_dyn_buf()系列函数即可。
BuleRiver 2011-03-12
  • 打赏
  • 举报
回复
第二种方式可以吗?
「已注销」 2011-03-12
  • 打赏
  • 举报
回复
第一种
BuleRiver 2011-03-12
  • 打赏
  • 举报
回复
下面两种方式,我应该使用哪一种?加入说PCM或者WAVE数据有100M
第一种方式:
while (没有结束)
{
1、读取一帧
2、编码
}

第二种方式:
1、把数据全部读入缓冲区
while (没有结束)
{
编码
}
BuleRiver 2011-03-12
  • 打赏
  • 举报
回复
谢谢!!!
对的,我说的WAVE数据就是从.wav文件中读取出来的数据。
假如说,输入的是PCM,或者是从WAV文件中读取的数据,那么PCM帧的大小和WAV帧的大小如何计算,以及是否需要计算?
「已注销」 2011-03-12
  • 打赏
  • 举报
回复
你说的wave数据指的什么?.wav文件?
3,不需提供
4,输入的帧大小和编码器有关。上一个帖子已经说了怎么计算出来的
BuleRiver 2011-03-12
  • 打赏
  • 举报
回复
有4个问题:
第一个:我是需要实现一个Lib,对ffmpeg进行简单的封装:其输入数据是pcm或者是wave,输出是一种特定的数据编码,例如mp3,类似于实现这样一个函数:

int myConvert(const void* pPcmOrWaveData, int inLen, void* pOut, int* outLen);
// 其中:pPcmOrWaveData是输入的pcm或者wave数据,inLen是输入数据的长度,
// pOut是输出数据,是已经编码完成的,可能是mp3数据,也可能是amr,由客户在另一个接口中指定
// outLen是输出数据的大小


第二个问题:加入在上面的myConvert函数中,用户输入的是wave数据,那么在我进行编码的过程中,我是否需要把wave数据分帧进行读取出来。

第三个问题:因为我要把编码完成的数据放入缓冲区pOut,而不是写入文件,我该如何对output_example进行改造?因为output_example.c使用的输入输出等操作都是使用的url_fopen()、url_fwrite()、url_fclose()等函数,我要写入缓冲区,是否需要提供和url_fopen()等类似的函数?

第四个问题:因为我的输入不是自己生成的数据,所以我提前并不知道输入的pcm或者wave数据的帧大小,如何得到它们?是能够根据输入数据计算出来,还是需要使用者提供?
谢谢大家。
BuleRiver 2011-03-11
  • 打赏
  • 举报
回复
我需要写一些关于IO的函数么?

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧