定义一个thread变量,如果传递的线程函数是包含参数的,但是定义thread变量时并没有传递参数,则会报错误:“static assertion failed: std::thread arguments must be invocable after conversion to rvalues”。调用一个仅仅是声明的函数,没有实际定义则会抛出异常"std::bad_function_call"。
参考了csdn文章<#、##、__VA_ARGS__和##__VA_ARGS__的作用>:VA_ARGS 是一个可变参数的宏,这个可变参数的宏是新的C99规范中新增的,实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个点)。##__VA_ARGS:宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉的作用,否则会编译出错。一般这个用在调试信息上多一点。
程序运行报错如下,是因为Ffmpeg_Player类都析构了,但是对象运行时创建的线程虽然执行完,但是并没有join掉。
PC: @ 0x7fc84c7b4438 gsignal
SIGABRT (@0x20) received by PID 32 (TID 0x7fc6c5fff700) from PID 32; stack trace:
@ 0x7fc853245390 (unknown)
@ 0x7fc84c7b4438 gsignal
@ 0x7fc84c7b603a abort
@ 0x7fc84d0f784d __gnu_cxx::__verbose_terminate_handler()
@ 0x7fc84d0f56b6 (unknown)
@ 0x7fc84d0f5701 std::terminate()
@ 0x7fc84fad1f7c Ffmpeg_Player::~Ffmpeg_Player()
@ 0x456a78 CFfmpegPlyer::~CFfmpegPlyer()
@ 0x456ab4 CFfmpegPlyer::~CFfmpegPlyer()
@ 0x444c15 CCameraManage::clearPlayers()
@ 0x4442c8 CCameraManage::StopCameraManage()
@ 0x4257b0 CManage::prepareNextGroupCameras()
@ 0x427b14 CManage::procMultiCamera()
@ 0x425a21 CManage::procLoop()
@ 0x41f283 _ZZN7CManage5startERK12run_config_tENKUlvE_clEv
@ 0x431270 _ZNSt12_Bind_simpleIFZN7CManage5startERK12run_config_tEUlvE_vEE9_M_invokeIJEEEvSt12_Index_tupleIJXspT_EEE
@ 0x430fb4 _ZNSt12_Bind_simpleIFZN7CManage5startERK12run_config_tEUlvE_vEEclEv
@ 0x430d32 _ZNSt6thread5_ImplISt12_Bind_simpleIFZN7CManage5startERK12run_config_tEUlvE_vEEE6_M_runEv
@ 0x7fc84d120c80 (unknown)
@ 0x7fc85323b6ba start_thread
@ 0x7fc84c8864dd clone
@ 0x0 (unknown)
解压srs-0.1.0.tar.gz编译,结果./configure时报错"./configure: line 99: $ {MODULE_OBJS[@].o}: bad substitution",然后参考CORE_OBJS的定义,将MAIN_OBJS=“${MODULE_OBJS[@].o}“中的”.o"去掉就可以了。成功编译后运行,通过ffmpeg命令推流,然后用vlc直接拉流播放结果报错:“您的输入无法被打开:VLC 无法打开 MRL「rtmp://192.168.163.129:1935/livestream/abc_123」。详情请检查日志”,然后就用ffplay命令打开,然后查看服务端日志报错”[handshake] read c2 failed. ret=208 errno=104(Connection reset by peer)“,然后关键字"ffplay rtmp"搜到"ffplay播放的RTMP URL最好使用双引号括起来,并在后面添加live=1参数,代表实时流。实际上这个参数是传给了ffmpeg的libRTMP的。”,然后就可以正常弹出播放窗口了,然后关闭后再用vlc播放同样的地址也可以正常播放了,但是同时播放就播不了。
参考了csdn上的文章
使用命令"/ffmpeg.exe -re -i H264_AAC_1080P.mp4 -vcodec copy -f flv rtmp://192.168.1.100:1935/livestream/abc_123"推流到rtmp服务器上,结果报错:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from ‘H264_AAC_1080P.mp4’:
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.29.100
Duration: 00:03:39.08, start: 0.000000, bitrate: 2493 kb/s
Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1920x1080, 2457 kb/s, SAR 1:1 DAR 16:9, 25 fps, 25 tbr, 1000k tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 16000 Hz, mono, fltp, 32 kb/s (default)
Metadata:
handler_name : SoundHandler
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (aac (native) -> mp3 (libmp3lame))
Press [q] to stop, [?] for help
[flv @ 00000267c89fe980] FLV does not support sample rate 16000, choose from (44100, 22050, 11025)
[flv @ 00000267c89fe980] Audio codec mp3 not compatible with flv
Could not write header for output file #0 (incorrect codec parameters ?): Function not implemented
Error initializing output stream 0:1 –
Conversion failed!
后面修改命令"/ffmpeg.exe -re -i H264_AAC_1080P.mp4 -vcodec copy -acodec copy -f flv rtmp://192.168.1.100:1935/livestream/abc_123"就可以正常推流了。
测试FFmpeg-n4.4.1的transcoding.c,结果目标视频的帧率直接减半,目标视频时长是原视频的两倍,然后就搜到csdn上的文章
stream->dec_frame->pts = av_rescale_q(stream->dec_frame->best_effort_timestamp, stream->dec_ctx->time_base, stream->enc_ctx->time_base);
ret = filter_encode_write_frame(stream->dec_frame, stream_index);
在ubuntu中编译ffmpeg,结果报错"nasm/yasm not found or too old. Use --disable-x86asm for a crippled build",然后下载yasm-1.3.0.tar.gz编译安装后就可以了。后面加了选项–enable-libopencv后configure报错"ERROR: opencv not found using pkg-config",然后google关键字"ubuntu ffmpeg --enable-libopencv"搜到
打开wireshark抓包,发现有很多过滤器,然后就打开网络连接-“更改适配器选项”,或者"控制面板\网络和 Internet\网络连接",然后将“VMware Network Adapter VMnet8”这个选项右键"禁用",从"已启用"修改成"已禁用",结果xshell到本地vmware虚拟机的连接就自动断开了。抓包使用"ip.addr192.168.1.100 && tcp.port5566 && http"过滤了http的协议。
想用vs2019来编译ffmpeg,然后参考了csdn上的文章
交叉编译x265,需要修改CMakeLists.txt,设置CC链set(CC ${TOOLCHAIN}/toolchain-x86_64_gcc-8.4.0_glibc/bin/x86_64-openwrt-linux-gcc),类似的还需要设置CPP、CXX、OBJDUMP、STRIP、AR、LD、RANLIB;然后set(CMAKE_C_COMPILER ${CC})设置CMAKE_C_COMPILER,类似的设置CMAKE_CXX_COMPILER、CMAKE_AR、CMAKE_STRIP、CMAKE_RANLIB,然后成功编译。但是想make install到指定目录,设置了CMAKE_INSTALL_LIBDIR、CMAKE_INSTALL_INCLUDEDIR并没有起作用,然后设置CMAKE_INSTALL_PREFIX后再编译安装,结果成功安装到了指定的目录下。configure的时候总是报错"configure: error: C compiler cannot create executables",然后看了config.log,修改了下configure文件,根据提示,把"for ac_option in --version -v -V -qversion; do"中的"-V -qversion"去掉,然后再configure成功。
关键字"git pull每次都要输入用户名和密码怎么办"搜到百度文库
查看epoll源码,SYSCALL_DEFINE1的定义中,宏"#define __SC_DECL(t, a) t a"实现了参数中逗号的消除。